]> granicus.if.org Git - clang/commitdiff
Drop CodeGenTypes parameter to classifyArgumentType.
authorDaniel Dunbar <daniel@zuster.org>
Wed, 17 Sep 2008 20:11:04 +0000 (20:11 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Wed, 17 Sep 2008 20:11:04 +0000 (20:11 +0000)
Ensure that ABIArgInfo::Default implementation for aggregrate types
is sensible (StructRet on return and ByVal on arguments).

No functionality change.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@56289 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGCall.cpp

index f69bad93d119fbea051dc0de63a53e0476ffc529..13b9469ba3fdd30c1c2e10c49ae18365ff9225f0 100644 (file)
@@ -193,17 +193,33 @@ static ABIArgInfo classifyReturnType(QualType RetTy,
 }
 
 static ABIArgInfo classifyArgumentType(QualType Ty,
-                                       ASTContext &Context,
-                                       CodeGenTypes &Types) {
+                                       ASTContext &Context) {
   assert(!Ty->isArrayType() && "Array types cannot be passed directly.");
-
-  if (!Types.ConvertType(Ty)->isSingleValueType()) {
+  if (CodeGenFunction::hasAggregateLLVMType(Ty)) {
     return ABIArgInfo::getByVal(0);
   } else {
     return ABIArgInfo::getDefault();
   }
 }
 
+static ABIArgInfo getABIReturnInfo(QualType Ty,
+                                   ASTContext &Context) {
+  ABIArgInfo Info = classifyReturnType(Ty, Context);
+  // Ensure default on aggregate types is StructRet.
+  if (Info.isDefault() && CodeGenFunction::hasAggregateLLVMType(Ty))
+    return ABIArgInfo::getStructRet();
+  return Info;
+}
+
+static ABIArgInfo getABIArgumentInfo(QualType Ty,
+                                     ASTContext &Context) {
+  ABIArgInfo Info = classifyArgumentType(Ty, Context);
+  // Ensure default on aggregate types is ByVal.
+  if (Info.isDefault() && CodeGenFunction::hasAggregateLLVMType(Ty))
+    return ABIArgInfo::getByVal(0);
+  return Info;  
+}
+
 /***/
 
 void CodeGenTypes::GetExpandedTypes(QualType Ty, 
@@ -304,7 +320,7 @@ CodeGenTypes::GetFunctionType(ArgTypeIterator begin, ArgTypeIterator end,
   const llvm::Type *ResultType = 0;
 
   QualType RetTy = *begin;
-  ABIArgInfo RetAI = classifyReturnType(RetTy, getContext());
+  ABIArgInfo RetAI = getABIReturnInfo(RetTy, getContext());
   switch (RetAI.getKind()) {
   case ABIArgInfo::ByVal:
   case ABIArgInfo::Expand:
@@ -331,7 +347,7 @@ CodeGenTypes::GetFunctionType(ArgTypeIterator begin, ArgTypeIterator end,
   }
   
   for (++begin; begin != end; ++begin) {
-    ABIArgInfo AI = classifyArgumentType(*begin, getContext(), *this);
+    ABIArgInfo AI = getABIArgumentInfo(*begin, getContext());
     const llvm::Type *Ty = ConvertType(*begin);
     
     switch (AI.getKind()) {
@@ -359,7 +375,7 @@ CodeGenTypes::GetFunctionType(ArgTypeIterator begin, ArgTypeIterator end,
 }
 
 bool CodeGenModule::ReturnTypeUsesSret(QualType RetTy) {
-  return classifyReturnType(RetTy, getContext()).isStructRet();
+  return getABIReturnInfo(RetTy, getContext()).isStructRet();
 }
 
 void CodeGenModule::ConstructParamAttrList(const Decl *TargetDecl,
@@ -377,7 +393,7 @@ void CodeGenModule::ConstructParamAttrList(const Decl *TargetDecl,
 
   QualType RetTy = *begin;
   unsigned Index = 1;
-  ABIArgInfo RetAI = classifyReturnType(RetTy, getContext());
+  ABIArgInfo RetAI = getABIReturnInfo(RetTy, getContext());
   switch (RetAI.getKind()) {
   case ABIArgInfo::Default:
     if (RetTy->isPromotableIntegerType()) {
@@ -408,7 +424,7 @@ void CodeGenModule::ConstructParamAttrList(const Decl *TargetDecl,
   for (++begin; begin != end; ++begin) {
     QualType ParamType = *begin;
     unsigned ParamAttrs = 0;
-    ABIArgInfo AI = classifyArgumentType(ParamType, getContext(), getTypes());
+    ABIArgInfo AI = getABIArgumentInfo(ParamType, getContext());
     
     switch (AI.getKind()) {
     case ABIArgInfo::StructRet:
@@ -463,7 +479,7 @@ void CodeGenFunction::EmitFunctionProlog(llvm::Function *Fn,
        i != e; ++i) {
     const VarDecl *Arg = i->first;
     QualType Ty = i->second;
-    ABIArgInfo ArgI = classifyArgumentType(Ty, getContext(), CGM.getTypes());
+    ABIArgInfo ArgI = getABIArgumentInfo(Ty, getContext());
 
     switch (ArgI.getKind()) {
     case ABIArgInfo::ByVal: 
@@ -514,7 +530,7 @@ void CodeGenFunction::EmitFunctionEpilog(QualType RetTy,
 
   // Functions with no result always return void.
   if (ReturnValue) { 
-    ABIArgInfo RetAI = classifyReturnType(RetTy, getContext());
+    ABIArgInfo RetAI = getABIReturnInfo(RetTy, getContext());
     
     switch (RetAI.getKind()) {
     case ABIArgInfo::StructRet:
@@ -552,7 +568,7 @@ RValue CodeGenFunction::EmitCall(llvm::Value *Callee,
 
   // Handle struct-return functions by passing a pointer to the
   // location that we would like to return into.
-  ABIArgInfo RetAI = classifyReturnType(RetTy, getContext());
+  ABIArgInfo RetAI = getABIReturnInfo(RetTy, getContext());
   switch (RetAI.getKind()) {
   case ABIArgInfo::StructRet:
     // Create a temporary alloca to hold the result of the call. :(
@@ -570,8 +586,7 @@ RValue CodeGenFunction::EmitCall(llvm::Value *Callee,
   
   for (CallArgList::const_iterator I = CallArgs.begin(), E = CallArgs.end(); 
        I != E; ++I) {
-    ABIArgInfo ArgInfo = classifyArgumentType(I->second, getContext(), 
-                                              CGM.getTypes());
+    ABIArgInfo ArgInfo = getABIArgumentInfo(I->second, getContext());
     RValue RV = I->first;
 
     switch (ArgInfo.getKind()) {