[cfe-commits] r61192 - /cfe/trunk/lib/CodeGen/CGCall.cpp

Daniel Dunbar daniel at zuster.org
Wed Dec 17 20:52:17 PST 2008


Author: ddunbar
Date: Wed Dec 17 22:52:14 2008
New Revision: 61192

URL: http://llvm.org/viewvc/llvm-project?rev=61192&view=rev
Log:
Allow ABI to use StructRet even for scalar values.
 - Update comment to reflect fact that StructRet is now supported for
   any type (modulo LLVM support).

 - No functionality change, no scalar types currently use this
   feature.

Modified:
    cfe/trunk/lib/CodeGen/CGCall.cpp

Modified: cfe/trunk/lib/CodeGen/CGCall.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCall.cpp?rev=61192&r1=61191&r2=61192&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CGCall.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGCall.cpp Wed Dec 17 22:52:14 2008
@@ -102,7 +102,10 @@
 public:
   enum Kind {
     Default,
-    StructRet, /// Only valid for aggregate return types.
+    StructRet, /// Only valid for return values. The return value
+               /// should be passed through a pointer to a caller
+               /// allocated location passed as an implicit first
+               /// argument to the function.
 
     Coerce,    /// Only valid for aggregate return types, the argument
                /// should be accessed by coercion to a provided type.
@@ -751,12 +754,16 @@
     
     switch (RetAI.getKind()) {
     case ABIArgInfo::StructRet:
-        if (RetTy->isAnyComplexType()) {
-          // FIXME: Volatile
-          ComplexPairTy RT = LoadComplexFromAddr(ReturnValue, false);
-          StoreComplexToAddr(RT, CurFn->arg_begin(), false);
-        } else
-          EmitAggregateCopy(CurFn->arg_begin(), ReturnValue, RetTy);
+      if (RetTy->isAnyComplexType()) {
+        // FIXME: Volatile
+        ComplexPairTy RT = LoadComplexFromAddr(ReturnValue, false);
+        StoreComplexToAddr(RT, CurFn->arg_begin(), false);
+      } else if (CodeGenFunction::hasAggregateLLVMType(RetTy)) {
+        EmitAggregateCopy(CurFn->arg_begin(), ReturnValue, RetTy);
+      } else {
+        Builder.CreateStore(Builder.CreateLoad(ReturnValue), 
+                            CurFn->arg_begin());
+      }
       break;
 
     case ABIArgInfo::Default:
@@ -856,9 +863,10 @@
   case ABIArgInfo::StructRet:
     if (RetTy->isAnyComplexType())
       return RValue::getComplex(LoadComplexFromAddr(Args[0], false));
-    else 
-      // Struct return.
+    else if (CodeGenFunction::hasAggregateLLVMType(RetTy))
       return RValue::getAggregate(Args[0]);
+    else 
+      return RValue::get(Builder.CreateLoad(Args[0]));
 
   case ABIArgInfo::Default:
     return RValue::get(RetTy->isVoidType() ? 0 : CI);





More information about the cfe-commits mailing list