summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/CodeGen')
-rw-r--r--clang/lib/CodeGen/CodeGenModule.cpp15
-rw-r--r--clang/lib/CodeGen/CodeGenModule.h4
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();
OpenPOWER on IntegriCloud