]> granicus.if.org Git - clang/commitdiff
Implement codegen support for lowering "library builtins" like __builtin_isinf
authorChris Lattner <sabre@nondot.org>
Fri, 31 Aug 2007 04:44:06 +0000 (04:44 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 31 Aug 2007 04:44:06 +0000 (04:44 +0000)
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

CodeGen/CGBuiltin.cpp
CodeGen/CGExpr.cpp
CodeGen/CodeGenFunction.h
CodeGen/CodeGenModule.cpp

index a04557bd00cac1ff2ce59fae628abdf1e2bddf65..03b5c2d09c50fd0d291f8d31da68ef2fbce1ecb2 100644 (file)
 #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();
-}
index 2981ed609a2961d35df1a08947e4db24664fc15e..d175610a380fa11309fd09f429195d1101c5cca7 100644 (file)
@@ -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();
index 12c227bad9af22ab05742b26f59d5fa3c7eed6f4..af8d80bbb2795b00a2c1f177e5e896c51067f3a3 100644 (file)
@@ -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);
 
index a6a887f90fad1b8e7e4d218aaf6fbddbfa3e8c78..ec3d0affae5def756279c0493eef578fc80b3f7a 100644 (file)
@@ -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,