Fix PR3612. We ensure that we add builtins to the GlobalDeclMap and

we ensure that things added to the module can be found even when they
are not in GlobalDeclMap.  The later is for increased flexibility,
should someone want to do something tricky like extern "Ada" in the
same module.

llvm-svn: 65657
This commit is contained in:
Mike Stump 2009-02-27 22:42:30 +00:00
parent f5c1c923e8
commit 537abb0dec
2 changed files with 14 additions and 5 deletions

View File

@ -793,6 +793,8 @@ llvm::Constant *CodeGenModule::GetAddrOfFunction(const FunctionDecl *D) {
// Lookup the entry, lazily creating it if necessary.
llvm::GlobalValue *&Entry = GlobalDeclMap[getMangledName(D)];
if (!Entry)
Entry = getModule().getFunction(getMangledName(D));
if (!Entry)
Entry = EmitForwardFunctionDefinition(D, 0);
@ -872,14 +874,14 @@ void CodeGenModule::UpdateCompletedType(const TagDecl *TD) {
/// getBuiltinLibFunction
llvm::Function *CodeGenModule::getBuiltinLibFunction(unsigned BuiltinID) {
llvm::Value *CodeGenModule::getBuiltinLibFunction(unsigned BuiltinID) {
if (BuiltinID > BuiltinFunctions.size())
BuiltinFunctions.resize(BuiltinID);
// Cache looked up functions. Since builtin id #0 is invalid we don't reserve
// a slot for it.
assert(BuiltinID && "Invalid Builtin ID");
llvm::Function *&FunctionSlot = BuiltinFunctions[BuiltinID-1];
llvm::Value *&FunctionSlot = BuiltinFunctions[BuiltinID-1];
if (FunctionSlot)
return FunctionSlot;
@ -913,8 +915,15 @@ llvm::Function *CodeGenModule::getBuiltinLibFunction(unsigned BuiltinID) {
assert(Existing == 0 && "FIXME: Name collision");
}
llvm::GlobalValue *&ExitingFn = GlobalDeclMap[getContext().Idents.get(Name).getName()];
if (ExitingFn) {
llvm::Function *Fn = dyn_cast<llvm::Function>(ExitingFn);
assert(Fn && "builting mixing with non-function");
return FunctionSlot = llvm::ConstantExpr::getBitCast(Fn, Ty);
}
// FIXME: param attributes for sext/zext etc.
return FunctionSlot =
return FunctionSlot = ExitingFn =
llvm::Function::Create(Ty, llvm::Function::ExternalLinkage, Name,
&getModule());
}

View File

@ -154,7 +154,7 @@ class CodeGenModule {
int GlobalUniqueCount;
} Block;
std::vector<llvm::Function *> BuiltinFunctions;
std::vector<llvm::Value *> BuiltinFunctions;
public:
CodeGenModule(ASTContext &C, const LangOptions &Features, llvm::Module &M,
const llvm::TargetData &TD, Diagnostic &Diags,
@ -243,7 +243,7 @@ public:
/// getBuiltinLibFunction - Given a builtin id for a function like
/// "__builtin_fabsf", return a Function* for "fabsf".
llvm::Function *getBuiltinLibFunction(unsigned BuiltinID);
llvm::Value *getBuiltinLibFunction(unsigned BuiltinID);
llvm::Function *getMemCpyFn();
llvm::Function *getMemMoveFn();