[llvm-commits] CVS: llvm/lib/Transforms/Utils/Linker.cpp
Chris Lattner
lattner at cs.uiuc.edu
Mon Apr 21 16:16:01 PDT 2003
Changes in directory llvm/lib/Transforms/Utils:
Linker.cpp updated: 1.39 -> 1.40
---
Log message:
Fix bug: 2003-01-30-LinkerRename.ll
---
Diffs of the changes:
Index: llvm/lib/Transforms/Utils/Linker.cpp
diff -u llvm/lib/Transforms/Utils/Linker.cpp:1.39 llvm/lib/Transforms/Utils/Linker.cpp:1.40
--- llvm/lib/Transforms/Utils/Linker.cpp:1.39 Mon Apr 21 16:07:05 2003
+++ llvm/lib/Transforms/Utils/Linker.cpp Mon Apr 21 16:15:04 2003
@@ -210,12 +210,26 @@
// 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 @@
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!");
More information about the llvm-commits
mailing list