diff options
Diffstat (limited to 'clang/lib/CodeGen')
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.cpp | 15 | ||||
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.h | 4 |
2 files changed, 14 insertions, 5 deletions
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 6ebe12706bd..a812ba9352b 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -794,6 +794,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); return llvm::ConstantExpr::getBitCast(Entry, PTy); @@ -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()); } diff --git a/clang/lib/CodeGen/CodeGenModule.h b/clang/lib/CodeGen/CodeGenModule.h index 3a98bb7d438..093a9b12f76 100644 --- a/clang/lib/CodeGen/CodeGenModule.h +++ b/clang/lib/CodeGen/CodeGenModule.h @@ -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(); |