aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CodeGen/CGBuiltin.cpp10
-rw-r--r--CodeGen/CGExpr.cpp5
-rw-r--r--CodeGen/CodeGenFunction.h2
-rw-r--r--CodeGen/CodeGenModule.cpp6
4 files changed, 14 insertions, 9 deletions
diff --git a/CodeGen/CGBuiltin.cpp b/CodeGen/CGBuiltin.cpp
index a04557bd00..03b5c2d09c 100644
--- a/CodeGen/CGBuiltin.cpp
+++ b/CodeGen/CGBuiltin.cpp
@@ -17,12 +17,16 @@
#include "clang/AST/Builtins.h"
#include "clang/AST/Expr.h"
#include "llvm/Constants.h"
+#include "llvm/Function.h"
using namespace clang;
using namespace CodeGen;
RValue CodeGenFunction::EmitBuiltinExpr(unsigned BuiltinID, const CallExpr *E) {
switch (BuiltinID) {
default:
+ if (getContext().BuiltinInfo.isLibFunction(BuiltinID))
+ return EmitCallExpr(CGM.getBuiltinLibFunction(BuiltinID), E);
+
fprintf(stderr, "Unimplemented builtin!!\n");
E->dump();
@@ -46,9 +50,3 @@ RValue CodeGenFunction::EmitBuiltinExpr(unsigned BuiltinID, const CallExpr *E) {
return RValue::get(0);
}
-
-RValue CodeGenFunction::EmitBuiltinLibFuncExpr(unsigned BuiltinID,
- const CallExpr *E) {
- //llvm::Function *Callee = CGM.getBuiltinLibFunction(BuiltinID);
- return RValue();
-}
diff --git a/CodeGen/CGExpr.cpp b/CodeGen/CGExpr.cpp
index 2981ed609a..d175610a38 100644
--- a/CodeGen/CGExpr.cpp
+++ b/CodeGen/CGExpr.cpp
@@ -376,7 +376,10 @@ RValue CodeGenFunction::EmitCallExpr(const CallExpr *E) {
return EmitBuiltinExpr(builtinID, E);
llvm::Value *Callee = EmitScalarExpr(E->getCallee());
-
+ return EmitCallExpr(Callee, E);
+}
+
+RValue CodeGenFunction::EmitCallExpr(llvm::Value *Callee, const CallExpr *E) {
// The callee type will always be a pointer to function type, get the function
// type.
QualType CalleeTy = E->getCallee()->getType();
diff --git a/CodeGen/CodeGenFunction.h b/CodeGen/CodeGenFunction.h
index 12c227bad9..af8d80bbb2 100644
--- a/CodeGen/CodeGenFunction.h
+++ b/CodeGen/CodeGenFunction.h
@@ -324,8 +324,8 @@ public:
//===--------------------------------------------------------------------===//
RValue EmitCallExpr(const CallExpr *E);
+ RValue EmitCallExpr(llvm::Value *Callee, const CallExpr *E);
RValue EmitBuiltinExpr(unsigned BuiltinID, const CallExpr *E);
- RValue EmitBuiltinLibFuncExpr(unsigned BuiltinID, const CallExpr *E);
llvm::Value *EmitObjCStringLiteral(const ObjCStringLiteral *E);
diff --git a/CodeGen/CodeGenModule.cpp b/CodeGen/CodeGenModule.cpp
index a6a887f90f..ec3d0affae 100644
--- a/CodeGen/CodeGenModule.cpp
+++ b/CodeGen/CodeGenModule.cpp
@@ -127,7 +127,11 @@ llvm::Function *CodeGenModule::getBuiltinLibFunction(unsigned BuiltinID) {
// and for the existing one to be turned into a constantexpr cast of the
// builtin. In the case where the existing one is a static function, it
// should just be renamed.
- assert(getModule().getFunction(Name) == 0 && "FIXME: Name collision");
+ if (llvm::Function *Existing = getModule().getFunction(Name)) {
+ if (Existing->getFunctionType() == Ty && Existing->hasExternalLinkage())
+ return FunctionSlot = Existing;
+ assert(Existing == 0 && "FIXME: Name collision");
+ }
// FIXME: param attributes for sext/zext etc.
return FunctionSlot = new llvm::Function(Ty, llvm::Function::ExternalLinkage,