aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CGCall.cpp
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2009-02-02 22:03:45 +0000
committerDaniel Dunbar <daniel@zuster.org>2009-02-02 22:03:45 +0000
commit88b5396b0897f28d22ae3debf4a0d97b33b6c362 (patch)
tree7838b5a53781e11e09273dad5fdd044b44174b9d /lib/CodeGen/CGCall.cpp
parentd671c5a61605ab864768cbbb4feb9cd652609083 (diff)
More ABI API cleanup.
- Lift CGFunctionInfo creation above ReturnTypeUsesSret and EmitFunction{Epi,Pro}log. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@63553 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGCall.cpp')
-rw-r--r--lib/CodeGen/CGCall.cpp25
1 files changed, 12 insertions, 13 deletions
diff --git a/lib/CodeGen/CGCall.cpp b/lib/CodeGen/CGCall.cpp
index a592ace68a..c7b2a5dc89 100644
--- a/lib/CodeGen/CGCall.cpp
+++ b/lib/CodeGen/CGCall.cpp
@@ -935,8 +935,8 @@ static void CreateCoercedStore(llvm::Value *Src,
/***/
-bool CodeGenModule::ReturnTypeUsesSret(QualType RetTy) {
- return getABIReturnInfo(RetTy, getTypes()).isStructRet();
+bool CodeGenModule::ReturnTypeUsesSret(const CGFunctionInfo &FI) {
+ return getABIReturnInfo(FI.getReturnType(), getTypes()).isStructRet();
}
const llvm::FunctionType *
@@ -1008,8 +1008,8 @@ CodeGenTypes::GetFunctionType(const CGFunctionInfo &FI, bool IsVariadic) {
return llvm::FunctionType::get(ResultType, ArgTys, IsVariadic);
}
-void CodeGenModule::ConstructAttributeList(const Decl *TargetDecl,
- const CGFunctionInfo &Info,
+void CodeGenModule::ConstructAttributeList(const CGFunctionInfo &Info,
+ const Decl *TargetDecl,
AttributeListType &PAL) {
unsigned FuncAttrs = 0;
unsigned RetAttrs = 0;
@@ -1107,16 +1107,14 @@ void CodeGenModule::ConstructAttributeList(const Decl *TargetDecl,
}
-void CodeGenFunction::EmitFunctionProlog(llvm::Function *Fn,
- QualType RetTy,
+void CodeGenFunction::EmitFunctionProlog(const CGFunctionInfo &FI,
+ llvm::Function *Fn,
const FunctionArgList &Args) {
- CGFunctionInfo FnInfo(RetTy, Args);
-
// Emit allocs for param decls. Give the LLVM Argument nodes names.
llvm::Function::arg_iterator AI = Fn->arg_begin();
// Name the struct return argument.
- if (CGM.ReturnTypeUsesSret(RetTy)) {
+ if (CGM.ReturnTypeUsesSret(FI)) {
AI->setName("agg.result");
++AI;
}
@@ -1173,12 +1171,13 @@ void CodeGenFunction::EmitFunctionProlog(llvm::Function *Fn,
assert(AI == Fn->arg_end() && "Argument mismatch!");
}
-void CodeGenFunction::EmitFunctionEpilog(QualType RetTy,
+void CodeGenFunction::EmitFunctionEpilog(const CGFunctionInfo &FI,
llvm::Value *ReturnValue) {
llvm::Value *RV = 0;
// Functions with no result always return void.
if (ReturnValue) {
+ QualType RetTy = FI.getReturnType();
ABIArgInfo RetAI = getABIReturnInfo(RetTy, CGM.getTypes());
switch (RetAI.getKind()) {
@@ -1220,8 +1219,8 @@ void CodeGenFunction::EmitFunctionEpilog(QualType RetTy,
}
}
-RValue CodeGenFunction::EmitCall(llvm::Value *Callee,
- const CGFunctionInfo &CallInfo,
+RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
+ llvm::Value *Callee,
const CallArgList &CallArgs) {
llvm::SmallVector<llvm::Value*, 16> Args;
@@ -1282,7 +1281,7 @@ RValue CodeGenFunction::EmitCall(llvm::Value *Callee,
// FIXME: Provide TargetDecl so nounwind, noreturn, etc, etc get set.
CodeGen::AttributeListType AttributeList;
- CGM.ConstructAttributeList(0, CallInfo, AttributeList);
+ CGM.ConstructAttributeList(CallInfo, 0, AttributeList);
CI->setAttributes(llvm::AttrListPtr::get(AttributeList.begin(),
AttributeList.size()));