simplify and comment some code better. Make BindRuntimeGlobals

more optimistic that it will work (optimizing for the common case).

llvm-svn: 67438
This commit is contained in:
Chris Lattner 2009-03-21 07:48:31 +00:00
parent 3637652ab3
commit 0c5e3132aa
3 changed files with 34 additions and 25 deletions

View File

@ -29,6 +29,7 @@ using namespace CodeGen;
/// block. /// block.
llvm::AllocaInst *CodeGenFunction::CreateTempAlloca(const llvm::Type *Ty, llvm::AllocaInst *CodeGenFunction::CreateTempAlloca(const llvm::Type *Ty,
const char *Name) { const char *Name) {
// FIXME: Should not pass name if names are disabled in IRBuilder.
return new llvm::AllocaInst(Ty, 0, Name, AllocaInsertPt); return new llvm::AllocaInst(Ty, 0, Name, AllocaInsertPt);
} }

View File

@ -81,32 +81,37 @@ void CodeGenModule::BindRuntimeGlobals() {
continue; 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); llvm::GlobalValue *Conflict = TheModule.getNamedValue(Name);
if (Conflict) { 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 // Decide which version to take. If the conflict is a definition
// knows best. // we are forced to take that, otherwise assume the runtime
// knows best.
// FIXME: This will fail phenomenally when the conflict is the // FIXME: This will fail phenomenally when the conflict is the
// wrong type of value. Just bail on it for now. This should // wrong type of value. Just bail on it for now. This should
// really reuse something inside the LLVM Linker code. // really reuse something inside the LLVM Linker code.
assert(GV->getValueID() == Conflict->getValueID() && assert(GV->getValueID() == Conflict->getValueID() &&
"Unable to resolve conflict between globals of different types."); "Unable to resolve conflict between globals of different types.");
if (!Conflict->isDeclaration()) { if (!Conflict->isDeclaration()) {
llvm::Value *Casted = llvm::Value *Casted =
llvm::ConstantExpr::getBitCast(Conflict, GV->getType()); llvm::ConstantExpr::getBitCast(Conflict, GV->getType());
GV->replaceAllUsesWith(Casted); GV->replaceAllUsesWith(Casted);
GV->eraseFromParent(); GV->eraseFromParent();
} else { } else {
GV->takeName(Conflict); GV->takeName(Conflict);
llvm::Value *Casted = llvm::Value *Casted =
llvm::ConstantExpr::getBitCast(GV, Conflict->getType()); llvm::ConstantExpr::getBitCast(GV, Conflict->getType());
Conflict->replaceAllUsesWith(Casted); Conflict->replaceAllUsesWith(Casted);
Conflict->eraseFromParent(); Conflict->eraseFromParent();
} }
} else
GV->setName(Name);
} }
} }

View File

@ -94,7 +94,7 @@ class CodeGenModule : public BlockModule {
/// emitted. Note that the entries in this map are the actual /// emitted. Note that the entries in this map are the actual
/// globals and therefore may not be of the same type as the decl, /// globals and therefore may not be of the same type as the decl,
/// they should be bitcasted on retrieval. Also note that the /// 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 /// (which may change with attributes such as asm-labels). This key
/// to this map should be generated using getMangledName(). /// to this map should be generated using getMangledName().
llvm::DenseMap<const char*, llvm::GlobalValue*> GlobalDeclMap; 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. /// strings. This value has type int * but is actually an Obj-C class pointer.
llvm::Constant *CFConstantStringClassRef; 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; std::vector<llvm::Value *> BuiltinFunctions;
public: public:
CodeGenModule(ASTContext &C, const LangOptions &Features, llvm::Module &M, CodeGenModule(ASTContext &C, const LangOptions &Features, llvm::Module &M,