aboutsummaryrefslogtreecommitdiffstats
path: root/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
commit2719bac90525985f4ebb97324b4c087d47b54384 (patch)
tree4aad74bf26e99db9bfda68686986a9cd3b5c32a1 /lib/Transforms/Utils/Linker.cpp
parent0fec08eb58dd9fffeb72c584aa61a59d71111c8d (diff)
downloadexternal_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.cpp40
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!");