[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