From: Chris Lattner Date: Fri, 31 Aug 2007 04:44:06 +0000 (+0000) Subject: Implement codegen support for lowering "library builtins" like __builtin_isinf X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c5e940fa551840ecd71e8116c316c9131490f5fa;p=clang Implement codegen support for lowering "library builtins" like __builtin_isinf to their corresponding library routines (e.g. isinf). This allows us to handle all the stuff in macos math.h, and other stuff as it's added to *Builtins.def. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@41634 91177308-0d34-0410-b5e6-96231b3b80d8 --- 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,