]> granicus.if.org Git - clang/commitdiff
Propagate calling convention information to function declarations and CallInst
authorNate Begeman <natebegeman@mac.com>
Sun, 9 Mar 2008 03:09:36 +0000 (03:09 +0000)
committerNate Begeman <natebegeman@mac.com>
Sun, 9 Mar 2008 03:09:36 +0000 (03:09 +0000)
instructions.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@48077 91177308-0d34-0410-b5e6-96231b3b80d8

CodeGen/CGExpr.cpp
CodeGen/CodeGenModule.cpp

index 879f29ab60ab664efa449893d7ca0ec7656e9281..932a5c5da8b8c00226289c4199138c17edaa3e4b 100644 (file)
@@ -595,9 +595,11 @@ RValue CodeGenFunction::EmitCallExpr(llvm::Value *Callee, QualType FnType,
     }
   }
   
-  llvm::Value *V = Builder.CreateCall(Callee, &Args[0], &Args[0]+Args.size());
-  if (V->getType() != llvm::Type::VoidTy)
-    V->setName("call");
+  llvm::CallInst *CI = Builder.CreateCall(Callee,&Args[0],&Args[0]+Args.size());
+  if (const llvm::Function *F = dyn_cast<llvm::Function>(Callee))
+    CI->setCallingConv(F->getCallingConv());
+  if (CI->getType() != llvm::Type::VoidTy)
+    CI->setName("call");
   else if (ResultType->isComplexType())
     return RValue::getComplex(LoadComplexFromAddr(Args[0], false));
   else if (hasAggregateLLVMType(ResultType))
@@ -606,8 +608,8 @@ RValue CodeGenFunction::EmitCallExpr(llvm::Value *Callee, QualType FnType,
   else {
     // void return.
     assert(ResultType->isVoidType() && "Should only have a void expr here");
-    V = 0;
+    CI = 0;
   }
       
-  return RValue::get(V);
+  return RValue::get(CI);
 }
index d2b60475250bf7a7c65115284f8c236029f8f937..0b39ca4437817e2388f1c6ad0034c6555f7112e5 100644 (file)
@@ -18,6 +18,7 @@
 #include "clang/Basic/Diagnostic.h"
 #include "clang/Basic/LangOptions.h"
 #include "clang/Basic/TargetInfo.h"
+#include "llvm/CallingConv.h"
 #include "llvm/Constants.h"
 #include "llvm/DerivedTypes.h"
 #include "llvm/Module.h"
@@ -87,8 +88,13 @@ llvm::Constant *CodeGenModule::GetAddrOfFunctionDecl(const FunctionDecl *D,
   // If it doesn't already exist, just create and return an entry.
   if (F == 0) {
     // FIXME: param attributes for sext/zext etc.
-    return Entry = new llvm::Function(FTy, llvm::Function::ExternalLinkage,
-                                      D->getName(), &getModule());
+    F = new llvm::Function(FTy, llvm::Function::ExternalLinkage, D->getName(),
+                           &getModule());
+
+    // Set the appropriate calling convention for the Function.
+    if (D->getAttr<FastCallAttr>())
+      F->setCallingConv(llvm::CallingConv::Fast);
+    return Entry = F;
   }
   
   // If the pointer type matches, just return it.