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 | 4522f446c12aa8fd841aa7b313e901bbffd6a62f (patch) | |
tree | d8c6311e564310517594ecc2d73db3f7ae4ee63f /llvm/lib/Transforms/Utils/Linker.cpp | |
parent | 4adb8536d9534ea655482892496b6629bb3fe489 (diff) | |
download | bcm5719-llvm-4522f446c12aa8fd841aa7b313e901bbffd6a62f.tar.gz bcm5719-llvm-4522f446c12aa8fd841aa7b313e901bbffd6a62f.zip |
Fix bug: 2003-01-30-LinkerRename.ll
llvm-svn: 5828
Diffstat (limited to 'llvm/lib/Transforms/Utils/Linker.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/Linker.cpp | 40 |
1 files changed, 33 insertions, 7 deletions
diff --git a/llvm/lib/Transforms/Utils/Linker.cpp b/llvm/lib/Transforms/Utils/Linker.cpp index 3efb0b50faa..65b05cd65e9 100644 --- a/llvm/lib/Transforms/Utils/Linker.cpp +++ b/llvm/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!"); |