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
diff --git a/lib/CodeGen/CGCall.cpp b/lib/CodeGen/CGCall.cpp
index a592ace..c7b2a5d 100644
--- a/lib/CodeGen/CGCall.cpp
+++ b/lib/CodeGen/CGCall.cpp
@@ -935,8 +935,8 @@
 
 /***/
 
-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 @@
   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 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 @@
   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 @@
   }
 }
 
-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 @@
 
   // 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()));