From: Justin Holewinski Date: Wed, 20 Nov 2013 20:35:34 +0000 (+0000) Subject: [NVPTX] Update ABI handling X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=539110ffaece530317c82d1d890119d9fd627713;p=clang [NVPTX] Update ABI handling For PTX, we want the target to handle struct returns directly. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@195268 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/TargetInfo.cpp b/lib/CodeGen/TargetInfo.cpp index 1412bc279a..3d0c9f1601 100644 --- a/lib/CodeGen/TargetInfo.cpp +++ b/lib/CodeGen/TargetInfo.cpp @@ -4197,16 +4197,26 @@ private: ABIArgInfo NVPTXABIInfo::classifyReturnType(QualType RetTy) const { if (RetTy->isVoidType()) return ABIArgInfo::getIgnore(); - if (isAggregateTypeForABI(RetTy)) - return ABIArgInfo::getIndirect(0); - return ABIArgInfo::getDirect(); + + // note: this is different from default ABI + if (!RetTy->isScalarType()) + return ABIArgInfo::getDirect(); + + // Treat an enum type as its underlying type. + if (const EnumType *EnumTy = RetTy->getAs()) + RetTy = EnumTy->getDecl()->getIntegerType(); + + return (RetTy->isPromotableIntegerType() ? + ABIArgInfo::getExtend() : ABIArgInfo::getDirect()); } ABIArgInfo NVPTXABIInfo::classifyArgumentType(QualType Ty) const { - if (isAggregateTypeForABI(Ty)) - return ABIArgInfo::getIndirect(0); + // Treat an enum type as its underlying type. + if (const EnumType *EnumTy = Ty->getAs()) + Ty = EnumTy->getDecl()->getIntegerType(); - return ABIArgInfo::getDirect(); + return (Ty->isPromotableIntegerType() ? + ABIArgInfo::getExtend() : ABIArgInfo::getDirect()); } void NVPTXABIInfo::computeInfo(CGFunctionInfo &FI) const { diff --git a/test/CodeGen/nvptx-abi.c b/test/CodeGen/nvptx-abi.c new file mode 100644 index 0000000000..f846def2de --- /dev/null +++ b/test/CodeGen/nvptx-abi.c @@ -0,0 +1,17 @@ +// RUN: %clang_cc1 -triple nvptx-unknown-unknown -S -o - %s -emit-llvm | FileCheck %s +// RUN: %clang_cc1 -triple nvptx64-unknown-unknown -S -o - %s -emit-llvm | FileCheck %s + +typedef struct float4_s { + float x, y, z, w; +} float4_t; + +float4_t my_function(void); + +// CHECK-DAG: declare %struct.float4_s @my_function + +float bar(void) { + float4_t ret; +// CHECK-DAG: call %struct.float4_s @my_function + ret = my_function(); + return ret.x; +}