diff options
-rw-r--r-- | CodeGen/CGBuiltin.cpp | 10 | ||||
-rw-r--r-- | CodeGen/CGExpr.cpp | 5 | ||||
-rw-r--r-- | CodeGen/CodeGenFunction.h | 2 | ||||
-rw-r--r-- | CodeGen/CodeGenModule.cpp | 6 |
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, |