diff options
| author | Chris Lattner <sabre@nondot.org> | 2003-04-21 21:15:04 +0000 | 
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2003-04-21 21:15:04 +0000 | 
| commit | 2719bac90525985f4ebb97324b4c087d47b54384 (patch) | |
| tree | 4aad74bf26e99db9bfda68686986a9cd3b5c32a1 /lib/Transforms/Utils/Linker.cpp | |
| parent | 0fec08eb58dd9fffeb72c584aa61a59d71111c8d (diff) | |
Fix bug: 2003-01-30-LinkerRename.ll
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@5828 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Utils/Linker.cpp')
| -rw-r--r-- | lib/Transforms/Utils/Linker.cpp | 40 | 
1 files changed, 33 insertions, 7 deletions
diff --git a/lib/Transforms/Utils/Linker.cpp b/lib/Transforms/Utils/Linker.cpp index 3efb0b50fa..65b05cd65e 100644 --- a/lib/Transforms/Utils/Linker.cpp +++ b/lib/Transforms/Utils/Linker.cpp @@ -210,12 +210,26 @@ static bool LinkGlobals(Module *Dest, const Module *Src,        // symbol over in the dest module... the initializer will be filled in        // later by LinkGlobalInits...        // -      DGV = new GlobalVariable(SGV->getType()->getElementType(), -                               SGV->isConstant(), SGV->getLinkage(), /*init*/0, -                               SGV->getName(), Dest); +      GlobalVariable *NewDGV = +        new GlobalVariable(SGV->getType()->getElementType(), +                           SGV->isConstant(), SGV->getLinkage(), /*init*/0, +                           SGV->getName(), Dest); + +      // If the LLVM runtime renamed the global, but it is an externally visible +      // symbol, DGV must be an existing global with internal linkage.  Rename +      // it. +      if (NewDGV->getName() != SGV->getName() && !NewDGV->hasInternalLinkage()){ +        assert(DGV && DGV->getName() == SGV->getName() && +               DGV->hasInternalLinkage()); +        DGV->setName(""); +        NewDGV->setName(SGV->getName());  // Force the name back +        DGV->setName(SGV->getName());     // This will cause a renaming +        assert(NewDGV->getName() == SGV->getName() && +               DGV->getName() != SGV->getName()); +      }        // Make sure to remember this mapping... -      ValueMap.insert(std::make_pair(SGV, DGV)); +      ValueMap.insert(std::make_pair(SGV, NewDGV));      } else if (!SGExtern && !DGExtern && SGV->getLinkage() !=DGV->getLinkage()){        return Error(Err, "Global variables named '" + SGV->getName() +                     "' have different linkage specifiers!"); @@ -313,11 +327,23 @@ static bool LinkFunctionProtos(Module *Dest, const Module *Src,      if (!DF || SF->hasInternalLinkage() || DF->hasInternalLinkage()) {        // Function does not already exist, simply insert an function signature        // identical to SF into the dest module... -      Function *DF = new Function(SF->getFunctionType(), SF->getLinkage(), -                                  SF->getName(), Dest); +      Function *NewDF = new Function(SF->getFunctionType(), SF->getLinkage(), +                                     SF->getName(), Dest); + +      // If the LLVM runtime renamed the function, but it is an externally +      // visible symbol, DF must be an existing function with internal linkage. +      // Rename it. +      if (NewDF->getName() != SF->getName() && !NewDF->hasInternalLinkage()) { +        assert(DF && DF->getName() == SF->getName() &&DF->hasInternalLinkage()); +        DF->setName(""); +        NewDF->setName(SF->getName());  // Force the name back +        DF->setName(SF->getName());     // This will cause a renaming +        assert(NewDF->getName() == SF->getName() && +               DF->getName() != SF->getName()); +      }        // ... and remember this mapping... -      ValueMap.insert(std::make_pair(SF, DF)); +      ValueMap.insert(std::make_pair(SF, NewDF));      } else if (SF->getLinkage() == GlobalValue::AppendingLinkage) {        return Error(Err, "Functions named '" + SF->getName() +                     "' have appending linkage!");  | 
