aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CodeGenModule.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-03-21 07:48:31 +0000
committerChris Lattner <sabre@nondot.org>2009-03-21 07:48:31 +0000
commite21c4b829c9e69c20f4baab4916e05cdb786d9ae (patch)
treee7d6eb27220565e8f19248e24fd135fbb79f1c44 /lib/CodeGen/CodeGenModule.cpp
parent3c8f153ae767fa55b2da74438c7f8ec370a06d6f (diff)
simplify and comment some code better. Make BindRuntimeGlobals
more optimistic that it will work (optimizing for the common case). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67438 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CodeGenModule.cpp')
-rw-r--r--lib/CodeGen/CodeGenModule.cpp55
1 files changed, 30 insertions, 25 deletions
diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp
index 6f70524d6d..91ab2b7b03 100644
--- a/lib/CodeGen/CodeGenModule.cpp
+++ b/lib/CodeGen/CodeGenModule.cpp
@@ -81,32 +81,37 @@ void CodeGenModule::BindRuntimeGlobals() {
continue;
}
- // See if there is a conflict against a function.
+ // See if there is a conflict against a function by setting the name and
+ // seeing if we got the desired name.
+ GV->setName(Name);
+ if (GV->isName(Name.c_str()))
+ continue; // Yep, it worked!
+
+ GV->setName(""); // Zap the bogus name until we work out the conflict.
llvm::GlobalValue *Conflict = TheModule.getNamedValue(Name);
- if (Conflict) {
- // Decide which version to take. If the conflict is a definition
- // we are forced to take that, otherwise assume the runtime
- // knows best.
-
- // FIXME: This will fail phenomenally when the conflict is the
- // wrong type of value. Just bail on it for now. This should
- // really reuse something inside the LLVM Linker code.
- assert(GV->getValueID() == Conflict->getValueID() &&
- "Unable to resolve conflict between globals of different types.");
- if (!Conflict->isDeclaration()) {
- llvm::Value *Casted =
- llvm::ConstantExpr::getBitCast(Conflict, GV->getType());
- GV->replaceAllUsesWith(Casted);
- GV->eraseFromParent();
- } else {
- GV->takeName(Conflict);
- llvm::Value *Casted =
- llvm::ConstantExpr::getBitCast(GV, Conflict->getType());
- Conflict->replaceAllUsesWith(Casted);
- Conflict->eraseFromParent();
- }
- } else
- GV->setName(Name);
+ assert(Conflict && "Must have conflicted!");
+
+ // Decide which version to take. If the conflict is a definition
+ // we are forced to take that, otherwise assume the runtime
+ // knows best.
+
+ // FIXME: This will fail phenomenally when the conflict is the
+ // wrong type of value. Just bail on it for now. This should
+ // really reuse something inside the LLVM Linker code.
+ assert(GV->getValueID() == Conflict->getValueID() &&
+ "Unable to resolve conflict between globals of different types.");
+ if (!Conflict->isDeclaration()) {
+ llvm::Value *Casted =
+ llvm::ConstantExpr::getBitCast(Conflict, GV->getType());
+ GV->replaceAllUsesWith(Casted);
+ GV->eraseFromParent();
+ } else {
+ GV->takeName(Conflict);
+ llvm::Value *Casted =
+ llvm::ConstantExpr::getBitCast(GV, Conflict->getType());
+ Conflict->replaceAllUsesWith(Casted);
+ Conflict->eraseFromParent();
+ }
}
}