Merge ABIInfo StructRet/ByVal into Indirect. 
 - No (intended) functionality change, the semantic changes are to come.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@63850 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CGCall.cpp b/lib/CodeGen/CGCall.cpp
index 0d0dd33..ab77513 100644
--- a/lib/CodeGen/CGCall.cpp
+++ b/lib/CodeGen/CGCall.cpp
@@ -119,9 +119,6 @@
   case Direct: 
     fprintf(stderr, "Direct");
     break;
-  case StructRet: 
-    fprintf(stderr, "StructRet");
-    break;
   case Ignore: 
     fprintf(stderr, "Ignore");
     break;
@@ -131,8 +128,8 @@
     // FIXME: This is ridiculous.
     llvm::errs().flush();
     break;
-  case ByVal: 
-    fprintf(stderr, "ByVal Align=%d", getByValAlignment());
+  case Indirect: 
+    fprintf(stderr, "Indirect Align=%d", getIndirectAlign());
     break;
   case Expand: 
     fprintf(stderr, "Expand");
@@ -307,7 +304,7 @@
     } else if (Size == 64) {
       return ABIArgInfo::getCoerce(llvm::Type::Int64Ty);
     } else {
-      return ABIArgInfo::getStructRet();
+      return ABIArgInfo::getIndirect(0);
     }
   } else {
     return ABIArgInfo::getDirect();
@@ -316,12 +313,12 @@
 
 ABIArgInfo X86_32ABIInfo::classifyArgumentType(QualType Ty,
                                               ASTContext &Context) const {
-  // FIXME: Set alignment on byval arguments.
+  // FIXME: Set alignment on indirect arguments.
   if (CodeGenFunction::hasAggregateLLVMType(Ty)) {
-    // Structures with flexible arrays are always byval.
+    // Structures with flexible arrays are always indirect.
     if (const RecordType *RT = Ty->getAsStructureType())
       if (RT->getDecl()->hasFlexibleArrayMember())
-        return ABIArgInfo::getByVal(0);
+        return ABIArgInfo::getIndirect(0);
 
     // Ignore empty structs.
     uint64_t Size = Context.getTypeSize(Ty);
@@ -337,7 +334,7 @@
         return ABIArgInfo::getExpand();
     }
 
-    return ABIArgInfo::getByVal(0);
+    return ABIArgInfo::getIndirect(0);
   } else {
     return ABIArgInfo::getDirect();
   }
@@ -636,9 +633,9 @@
     assert(0 && "Invalid classification for lo word.");
 
     // AMD64-ABI 3.2.3p4: Rule 2. Types of class memory are returned via
-    // hidden argument, i.e. structret.
+    // hidden argument.
   case Memory:
-    return ABIArgInfo::getStructRet();
+    return ABIArgInfo::getIndirect(0);
 
     // AMD64-ABI 3.2.3p4: Rule 3. If the class is INTEGER, the next
     // available register of the sequence %rax, %rdx is used.
@@ -730,7 +727,7 @@
   case ComplexX87:
     // Choose appropriate in memory type.
     if (CodeGenFunction::hasAggregateLLVMType(Ty))
-      return ABIArgInfo::getByVal(0);
+      return ABIArgInfo::getIndirect(0);
     else
       return ABIArgInfo::getDirect();
 
@@ -795,7 +792,7 @@
   } else {
     // Choose appropriate in memory type.
     if (CodeGenFunction::hasAggregateLLVMType(Ty))
-      return ABIArgInfo::getByVal(0);
+      return ABIArgInfo::getIndirect(0);
     else
       return ABIArgInfo::getDirect();
   }
@@ -819,7 +816,7 @@
   if (RetTy->isVoidType()) {
     return ABIArgInfo::getIgnore();
   } else if (CodeGenFunction::hasAggregateLLVMType(RetTy)) {
-    return ABIArgInfo::getStructRet();
+    return ABIArgInfo::getIndirect(0);
   } else {
     return ABIArgInfo::getDirect();
   }
@@ -828,7 +825,7 @@
 ABIArgInfo DefaultABIInfo::classifyArgumentType(QualType Ty,
                                               ASTContext &Context) const {
   if (CodeGenFunction::hasAggregateLLVMType(Ty)) {
-    return ABIArgInfo::getByVal(0);
+    return ABIArgInfo::getIndirect(0);
   } else {
     return ABIArgInfo::getDirect();
   }
@@ -1012,7 +1009,7 @@
 /***/
 
 bool CodeGenModule::ReturnTypeUsesSret(const CGFunctionInfo &FI) {
-  return FI.getReturnInfo().isStructRet();
+  return FI.getReturnInfo().isIndirect();
 }
 
 const llvm::FunctionType *
@@ -1024,7 +1021,6 @@
   QualType RetTy = FI.getReturnType();
   const ABIArgInfo &RetAI = FI.getReturnInfo();
   switch (RetAI.getKind()) {
-  case ABIArgInfo::ByVal:
   case ABIArgInfo::Expand:
     assert(0 && "Invalid ABI kind for return argument");
 
@@ -1032,7 +1028,8 @@
     ResultType = ConvertType(RetTy);
     break;
 
-  case ABIArgInfo::StructRet: {
+  case ABIArgInfo::Indirect: {
+    assert(!RetAI.getIndirectAlign() && "Align unused on indirect return.");
     ResultType = llvm::Type::VoidTy;
     const llvm::Type *STy = ConvertType(RetTy);
     ArgTys.push_back(llvm::PointerType::get(STy, RetTy.getAddressSpace()));
@@ -1061,11 +1058,8 @@
       ArgTys.push_back(AI.getCoerceToType());
       break;
 
-    case ABIArgInfo::StructRet:
-      assert(0 && "Invalid ABI kind for non-return argument");
-    
-    case ABIArgInfo::ByVal:
-      // byval arguments are always on the stack, which is addr space #0.
+    case ABIArgInfo::Indirect:
+      // indirect arguments are always on the stack, which is addr space #0.
       ArgTys.push_back(llvm::PointerType::getUnqual(Ty));
       break;
       
@@ -1113,7 +1107,7 @@
     }
     break;
 
-  case ABIArgInfo::StructRet:
+  case ABIArgInfo::Indirect:
     PAL.push_back(llvm::AttributeWithIndex::get(Index, 
                                                 llvm::Attribute::StructRet |
                                                 llvm::Attribute::NoAlias));
@@ -1124,7 +1118,6 @@
   case ABIArgInfo::Coerce:
     break;
 
-  case ABIArgInfo::ByVal:
   case ABIArgInfo::Expand:
     assert(0 && "Invalid ABI kind for return argument");    
   }
@@ -1138,16 +1131,13 @@
     unsigned Attributes = 0;
     
     switch (AI.getKind()) {
-    case ABIArgInfo::StructRet:
-      assert(0 && "Invalid ABI kind for non-return argument");
-
     case ABIArgInfo::Coerce:
       break;
 
-    case ABIArgInfo::ByVal:
+    case ABIArgInfo::Indirect:
       Attributes |= llvm::Attribute::ByVal;
       Attributes |= 
-        llvm::Attribute::constructAlignmentFromInt(AI.getByValAlignment());
+        llvm::Attribute::constructAlignmentFromInt(AI.getIndirectAlign());
       break;
       
     case ABIArgInfo::Direct:
@@ -1209,7 +1199,8 @@
     const ABIArgInfo &ArgI = info_it->info;
 
     switch (ArgI.getKind()) {
-    case ABIArgInfo::ByVal: 
+      // FIXME: Implement correct [in]direct semantics.
+    case ABIArgInfo::Indirect: 
     case ABIArgInfo::Direct: {
       assert(AI != Fn->arg_end() && "Argument mismatch!");
       llvm::Value* V = AI;
@@ -1265,9 +1256,6 @@
       EmitParmDecl(*Arg, V);
       break;
     }
-
-    case ABIArgInfo::StructRet:
-      assert(0 && "Invalid ABI kind for non-return argument");        
     }
 
     ++AI;
@@ -1285,7 +1273,8 @@
     const ABIArgInfo &RetAI = FI.getReturnInfo();
     
     switch (RetAI.getKind()) {
-    case ABIArgInfo::StructRet:
+      // FIXME: Implement correct [in]direct semantics.
+    case ABIArgInfo::Indirect:
       if (RetTy->isAnyComplexType()) {
         // FIXME: Volatile
         ComplexPairTy RT = LoadComplexFromAddr(ReturnValue, false);
@@ -1310,7 +1299,6 @@
       break;
     }
 
-    case ABIArgInfo::ByVal:
     case ABIArgInfo::Expand:
       assert(0 && "Invalid ABI kind for return argument");    
     }
@@ -1335,7 +1323,7 @@
   QualType RetTy = CallInfo.getReturnType();
   const ABIArgInfo &RetAI = CallInfo.getReturnInfo();
   switch (RetAI.getKind()) {
-  case ABIArgInfo::StructRet:
+  case ABIArgInfo::Indirect:
     // Create a temporary alloca to hold the result of the call. :(
     Args.push_back(CreateTempAlloca(ConvertType(RetTy)));
     break;
@@ -1345,7 +1333,6 @@
   case ABIArgInfo::Coerce:
     break;
 
-  case ABIArgInfo::ByVal:
   case ABIArgInfo::Expand:
     assert(0 && "Invalid ABI kind for return argument");
   }
@@ -1359,7 +1346,8 @@
     RValue RV = I->first;
 
     switch (ArgInfo.getKind()) {
-    case ABIArgInfo::ByVal: // Direct is byval
+      // FIXME: Implement correct [in]direct semantics.
+    case ABIArgInfo::Indirect:
     case ABIArgInfo::Direct:
       if (RV.isScalar()) {
         Args.push_back(RV.getScalarVal());
@@ -1391,10 +1379,6 @@
       break;
     }
 
-    case ABIArgInfo::StructRet:
-      assert(0 && "Invalid ABI kind for non-return argument");
-      break;
-
     case ABIArgInfo::Expand:
       ExpandTypeToArgs(I->second, RV, Args);
       break;
@@ -1415,7 +1399,8 @@
     CI->setName("call");
 
   switch (RetAI.getKind()) {
-  case ABIArgInfo::StructRet:
+    // FIXME: Implement correct [in]direct semantics.
+  case ABIArgInfo::Indirect:
     if (RetTy->isAnyComplexType())
       return RValue::getComplex(LoadComplexFromAddr(Args[0], false));
     else if (CodeGenFunction::hasAggregateLLVMType(RetTy))
@@ -1448,7 +1433,6 @@
       return RValue::get(Builder.CreateLoad(V));
   }
 
-  case ABIArgInfo::ByVal:
   case ABIArgInfo::Expand:
     assert(0 && "Invalid ABI kind for return argument");    
   }