Move ABIArgInfo into CGFunctionInfo, computed on creation.
 - Still have to convert some consumers over.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@63610 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CGCall.cpp b/lib/CodeGen/CGCall.cpp
index c6e804e..dfbd7bf 100644
--- a/lib/CodeGen/CGCall.cpp
+++ b/lib/CodeGen/CGCall.cpp
@@ -87,6 +87,9 @@
   return getFunctionInfo(ResTy, ArgTys);
 }
 
+static ABIArgInfo getABIReturnInfo(QualType Ty, CodeGenTypes &CGT);
+static ABIArgInfo getABIArgumentInfo(QualType Ty, CodeGenTypes &CGT);
+
 const CGFunctionInfo &CodeGenTypes::getFunctionInfo(QualType ResTy,
                                const llvm::SmallVector<QualType, 16> &ArgTys) {
   // Lookup or create unique function info.
@@ -98,29 +101,21 @@
   if (FI)
     return *FI;
 
+  // Construct the function info.
   FI = new CGFunctionInfo(ResTy, ArgTys);
   FunctionInfos.InsertNode(FI, InsertPos);
+
+  // Compute ABI information.
+  FI->getReturnInfo() = getABIReturnInfo(ResTy, *this);
+  for (CGFunctionInfo::arg_iterator it = FI->arg_begin(), ie = FI->arg_end();
+       it != ie; ++it)
+    it->info = getABIArgumentInfo(it->type, *this);
+
   return *FI;
 }
 
 /***/
 
-CGFunctionInfo::CGFunctionInfo(QualType ResTy, 
-                               const llvm::SmallVector<QualType, 16> &ArgTys) {
-  ArgTypes.push_back(ResTy);
-  ArgTypes.insert(ArgTypes.end(), ArgTys.begin(), ArgTys.end());
-}
-
-CGFunctionInfo::arg_iterator CGFunctionInfo::arg_begin() const {
-  return ArgTypes.begin()+1;
-}
-
-CGFunctionInfo::arg_iterator CGFunctionInfo::arg_end() const {
-  return ArgTypes.end();
-}
-
-/***/
-
 ABIInfo::~ABIInfo() {}
 
 /// isEmptyStruct - Return true iff a structure has no non-empty
@@ -721,6 +716,17 @@
 
 /***/
 
+CGFunctionInfo::CGFunctionInfo(QualType ResTy, 
+                               const llvm::SmallVector<QualType, 16> &ArgTys) {
+  NumArgs = ArgTys.size();
+  Args = new ArgInfo[1 + NumArgs];
+  Args[0].type = ResTy;
+  for (unsigned i = 0; i < NumArgs; ++i)
+    Args[1 + i].type = ArgTys[i];
+}
+
+/***/
+
 void CodeGenTypes::GetExpandedTypes(QualType Ty, 
                                     std::vector<const llvm::Type*> &ArgTys) {
   const RecordType *RT = Ty->getAsStructureType();
@@ -846,7 +852,7 @@
   uint64_t SrcSize = CGF.CGM.getTargetData().getTypePaddedSize(SrcTy);
   uint64_t DstSize = CGF.CGM.getTargetData().getTypePaddedSize(DstTy);
 
-  // If store is legal, just bitcase the src pointer.
+  // If store is legal, just bitcast the src pointer.
   if (SrcSize == DstSize) {
     llvm::Value *Casted =
       CGF.Builder.CreateBitCast(DstPtr, llvm::PointerType::getUnqual(SrcTy));
@@ -907,10 +913,10 @@
     break;
   }
   
-  for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end(); 
-       it != ie; ++it) {
-    ABIArgInfo AI = getABIArgumentInfo(*it, *this);
-    const llvm::Type *Ty = ConvertType(*it);
+  for (CGFunctionInfo::const_arg_iterator it = FI.arg_begin(), 
+         ie = FI.arg_end(); it != ie; ++it) {
+    const ABIArgInfo &AI = it->info;
+    const llvm::Type *Ty = ConvertType(it->type);
     
     switch (AI.getKind()) {
     case ABIArgInfo::Ignore:
@@ -931,7 +937,7 @@
       break;
      
     case ABIArgInfo::Expand:
-      GetExpandedTypes(*it, ArgTys);
+      GetExpandedTypes(it->type, ArgTys);
       break;
     }
   }
@@ -988,11 +994,11 @@
 
   if (RetAttrs)
     PAL.push_back(llvm::AttributeWithIndex::get(0, RetAttrs));
-  for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end(); 
-       it != ie; ++it) {
-    QualType ParamType = *it;
+  for (CGFunctionInfo::const_arg_iterator it = FI.arg_begin(), 
+         ie = FI.arg_end(); it != ie; ++it) {
+    QualType ParamType = it->type;
+    const ABIArgInfo &AI = it->info;
     unsigned Attributes = 0;
-    ABIArgInfo AI = getABIArgumentInfo(ParamType, getTypes());
     
     switch (AI.getKind()) {
     case ABIArgInfo::StructRet: