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) | |
download | external_llvm-2719bac90525985f4ebb97324b4c087d47b54384.zip external_llvm-2719bac90525985f4ebb97324b4c087d47b54384.tar.gz external_llvm-2719bac90525985f4ebb97324b4c087d47b54384.tar.bz2 |
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 3efb0b5..65b05cd 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!"); |