diff options
author | Bill Wendling <isanbard@gmail.com> | 2013-11-21 23:31:45 +0000 |
---|---|---|
committer | Bill Wendling <isanbard@gmail.com> | 2013-11-21 23:31:45 +0000 |
commit | 846ff9f2d11efd645825f94c9c997c741d9b3248 (patch) | |
tree | dcae6b647bd25ded5fc0c89446c21ad814cb8c60 | |
parent | 0cbb3ed856d7b9059c6b52cdeb38db2a5d1a3a66 (diff) | |
download | clang-846ff9f2d11efd645825f94c9c997c741d9b3248.tar.gz clang-846ff9f2d11efd645825f94c9c997c741d9b3248.tar.bz2 clang-846ff9f2d11efd645825f94c9c997c741d9b3248.tar.xz |
Merging r195268:
------------------------------------------------------------------------
r195268 | jholewinski | 2013-11-20 12:35:34 -0800 (Wed, 20 Nov 2013) | 3 lines
[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/branches/release_34@195385 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/CodeGen/TargetInfo.cpp | 22 | ||||
-rw-r--r-- | test/CodeGen/nvptx-abi.c | 17 |
2 files changed, 33 insertions, 6 deletions
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<EnumType>()) + 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<EnumType>()) + 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; +} |