summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Utils/Linker.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2003-04-21 21:15:04 +0000
committerChris Lattner <sabre@nondot.org>2003-04-21 21:15:04 +0000
commit4522f446c12aa8fd841aa7b313e901bbffd6a62f (patch)
treed8c6311e564310517594ecc2d73db3f7ae4ee63f /llvm/lib/Transforms/Utils/Linker.cpp
parent4adb8536d9534ea655482892496b6629bb3fe489 (diff)
downloadbcm5719-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.cpp40
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!");
OpenPOWER on IntegriCloud