diff options
author | Chris Lattner <sabre@nondot.org> | 2009-03-21 07:48:31 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-03-21 07:48:31 +0000 |
commit | e21c4b829c9e69c20f4baab4916e05cdb786d9ae (patch) | |
tree | e7d6eb27220565e8f19248e24fd135fbb79f1c44 | |
parent | 3c8f153ae767fa55b2da74438c7f8ec370a06d6f (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
-rw-r--r-- | lib/CodeGen/CGExpr.cpp | 1 | ||||
-rw-r--r-- | lib/CodeGen/CodeGenModule.cpp | 55 | ||||
-rw-r--r-- | lib/CodeGen/CodeGenModule.h | 5 |
3 files changed, 35 insertions, 26 deletions
diff --git a/lib/CodeGen/CGExpr.cpp b/lib/CodeGen/CGExpr.cpp index 95cb53c1f7..d34b0f5ea3 100644 --- a/lib/CodeGen/CGExpr.cpp +++ b/lib/CodeGen/CGExpr.cpp @@ -29,6 +29,7 @@ using namespace CodeGen; /// block. llvm::AllocaInst *CodeGenFunction::CreateTempAlloca(const llvm::Type *Ty, const char *Name) { + // FIXME: Should not pass name if names are disabled in IRBuilder. return new llvm::AllocaInst(Ty, 0, Name, AllocaInsertPt); } 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(); + } } } diff --git a/lib/CodeGen/CodeGenModule.h b/lib/CodeGen/CodeGenModule.h index 12c103ba62..a2cb442a84 100644 --- a/lib/CodeGen/CodeGenModule.h +++ b/lib/CodeGen/CodeGenModule.h @@ -94,7 +94,7 @@ class CodeGenModule : public BlockModule { /// emitted. Note that the entries in this map are the actual /// globals and therefore may not be of the same type as the decl, /// they should be bitcasted on retrieval. Also note that the - /// globals are keyed on their source name, not the global name + /// globals are keyed on their source mangled name, not the global name /// (which may change with attributes such as asm-labels). This key /// to this map should be generated using getMangledName(). llvm::DenseMap<const char*, llvm::GlobalValue*> GlobalDeclMap; @@ -141,6 +141,9 @@ class CodeGenModule : public BlockModule { /// strings. This value has type int * but is actually an Obj-C class pointer. llvm::Constant *CFConstantStringClassRef; + /// BuiltinFunctions - This is the cached set of Function*'s that have been + /// created for each builtin, indexed by the Builtin ID. This is null if the + /// Function* has not yet been created. std::vector<llvm::Value *> BuiltinFunctions; public: CodeGenModule(ASTContext &C, const LangOptions &Features, llvm::Module &M, |