aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNate Begeman <natebegeman@mac.com>2008-03-09 03:09:36 +0000
committerNate Begeman <natebegeman@mac.com>2008-03-09 03:09:36 +0000
commitec9426ca6039279bcc99bc2c625bb2abe4f0353d (patch)
tree48b4b1ac61384b506783a826a3d43a7f3b4abf6f
parentfde2bf9befede63e3f01f84519784c17b4c81480 (diff)
Propagate calling convention information to function declarations and CallInst
instructions. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@48077 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--CodeGen/CGExpr.cpp12
-rw-r--r--CodeGen/CodeGenModule.cpp10
2 files changed, 15 insertions, 7 deletions
diff --git a/CodeGen/CGExpr.cpp b/CodeGen/CGExpr.cpp
index 879f29ab60..932a5c5da8 100644
--- a/CodeGen/CGExpr.cpp
+++ b/CodeGen/CGExpr.cpp
@@ -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);
}
diff --git a/CodeGen/CodeGenModule.cpp b/CodeGen/CodeGenModule.cpp
index d2b6047525..0b39ca4437 100644
--- a/CodeGen/CodeGenModule.cpp
+++ b/CodeGen/CodeGenModule.cpp
@@ -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.