llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-backend-amdgpu Author: Kunal Dubey (xakep8) <details> <summary>Changes</summary> Implemented AArch64 argument classification for fixed-size aggregates. --- Patch is 49.77 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/229202.diff 15 Files Affected: - (modified) clang/lib/CIR/Dialect/Transforms/CallConvLoweringPass.cpp (+5-2) - (modified) clang/lib/CodeGen/QualTypeMapper.cpp (+26-13) - (modified) clang/lib/CodeGen/QualTypeMapper.h (+3-1) - (added) clang/test/CodeGen/AArch64/abi-classify-arg-pointer-like.m (+46) - (modified) clang/test/CodeGen/AArch64/abi-classify-arg-types.c (+80-14) - (modified) clang/test/CodeGen/AArch64/abi-classify-arg-types.cpp (+22-8) - (modified) clang/unittests/CodeGen/QualTypeMapperTest.cpp (+71) - (modified) llvm/include/llvm/ABI/Types.h (+27-4) - (modified) llvm/lib/ABI/Targets/AArch64.cpp (+54-2) - (modified) llvm/lib/ABI/Targets/AMDGPU.cpp (+3-3) - (modified) llvm/unittests/ABI/AArch64TargetInfoTest.cpp (+205-2) - (modified) llvm/unittests/ABI/AMDGPUTargetInfoTest.cpp (+6-3) - (modified) llvm/unittests/ABI/TypesTest.cpp (+23-1) - (modified) llvm/unittests/ABI/X86TargetInfoTest.cpp (+9-3) - (modified) mlir/lib/ABI/ABITypeMapper.cpp (+2-1) ``````````diff diff --git a/clang/lib/CIR/Dialect/Transforms/CallConvLoweringPass.cpp b/clang/lib/CIR/Dialect/Transforms/CallConvLoweringPass.cpp index 402cd09afd637..4d320aa159da9 100644 --- a/clang/lib/CIR/Dialect/Transforms/CallConvLoweringPass.cpp +++ b/clang/lib/CIR/Dialect/Transforms/CallConvLoweringPass.cpp @@ -361,16 +361,19 @@ static const llvm::abi::Type *mapCIRType(mlir::Type type, dyn_cast_if_present<cir::TargetAddressSpaceAttr>( ptrTy.getAddrSpace())) addrSpace = targetAsAttr.getValue(); + // CIR does not preserve source-level pointer-kind information. return tb.getPointerType(dl.getTypeSizeInBits(type), llvm::Align(dl.getTypeABIAlignment(type)), - addrSpace); + addrSpace, llvm::abi::PointerFlags::None); }) .Case([&](cir::VPtrType) { // cir::VPtrType carries no address-space parameter yet, so this // always maps into the default one until that gap closes. assert(!cir::MissingFeatures::addressSpace()); return tb.getPointerType(dl.getTypeSizeInBits(type), - llvm::Align(dl.getTypeABIAlignment(type))); + llvm::Align(dl.getTypeABIAlignment(type)), + /*Addrspace=*/0, + llvm::abi::PointerFlags::IsPointerOrReference); }) .Case([&](cir::BoolType) { return tb.getIntegerType(dl.getTypeSizeInBits(type), diff --git a/clang/lib/CodeGen/QualTypeMapper.cpp b/clang/lib/CodeGen/QualTypeMapper.cpp index 5044883a49ca2..841e0dcdc9055 100644 --- a/clang/lib/CodeGen/QualTypeMapper.cpp +++ b/clang/lib/CodeGen/QualTypeMapper.cpp @@ -103,11 +103,14 @@ const llvm::abi::Type *QualTypeMapper::convertTypeImpl(QualType QT) { case Type::Builtin: return convertBuiltinType(cast<BuiltinType>(QT)); case Type::Pointer: - return createPointerTypeForPointee(cast<PointerType>(QT)->getPointeeType()); + return createPointerTypeForPointee( + cast<PointerType>(QT)->getPointeeType(), + llvm::abi::PointerFlags::IsPointerOrReference); case Type::LValueReference: case Type::RValueReference: return createPointerTypeForPointee( - cast<ReferenceType>(QT)->getPointeeType()); + cast<ReferenceType>(QT)->getPointeeType(), + llvm::abi::PointerFlags::IsPointerOrReference); case Type::ConstantArray: case Type::ArrayParameter: case Type::IncompleteArray: @@ -129,7 +132,8 @@ const llvm::abi::Type *QualTypeMapper::convertTypeImpl(QualType QT) { } case Type::BlockPointer: case Type::Pipe: - return createPointerTypeForPointee(ASTCtx.VoidPtrTy); + return createPointerTypeForPointee(ASTCtx.VoidPtrTy, + llvm::abi::PointerFlags::None); case Type::ConstantMatrix: { const auto *MT = cast<ConstantMatrixType>(QT); return Builder.getArrayType(convertType(MT->getElementType()), @@ -146,13 +150,18 @@ const llvm::abi::Type *QualTypeMapper::convertTypeImpl(QualType QT) { } case Type::ObjCObject: case Type::ObjCInterface: - case Type::ObjCObjectPointer: + case Type::ObjCObjectPointer: { // Objective-C objects are represented as pointers in the ABI. + llvm::abi::PointerFlags Flags = llvm::abi::PointerFlags::None; + if (QT.hasAddressSpace()) + Flags |= llvm::abi::PointerFlags::IsPointeeAddressSpaceQualified; return Builder.getPointerType( ASTCtx.getTargetInfo().getPointerWidth(QT.getAddressSpace()), llvm::Align( ASTCtx.getTargetInfo().getPointerAlign(QT.getAddressSpace()) / 8), - ASTCtx.getTargetInfo().getTargetAddressSpace(QT.getAddressSpace())); + ASTCtx.getTargetInfo().getTargetAddressSpace(QT.getAddressSpace()), + Flags); + } case Type::OverflowBehavior: return convertType(cast<OverflowBehaviorType>(QT)->getUnderlyingType()); case Type::Auto: @@ -178,7 +187,7 @@ QualTypeMapper::convertBuiltinType(const BuiltinType *BT) { return Builder.getVoidType(); case BuiltinType::NullPtr: - return createPointerTypeForPointee(QT); + return createPointerTypeForPointee(QT, llvm::abi::PointerFlags::None); case BuiltinType::Bool: return Builder.getIntegerType(1, getTypeAlign(QT), /*Signed=*/false, @@ -265,13 +274,13 @@ QualTypeMapper::convertBuiltinType(const BuiltinType *BT) { case BuiltinType::OCLClkEvent: case BuiltinType::OCLQueue: case BuiltinType::OCLReserveID: - return createPointerTypeForPointee(QT); + return createPointerTypeForPointee(QT, llvm::abi::PointerFlags::None); // Objective-C builtin types are represented as opaque pointers. case BuiltinType::ObjCId: case BuiltinType::ObjCClass: case BuiltinType::ObjCSel: - return createPointerTypeForPointee(QT); + return createPointerTypeForPointee(QT, llvm::abi::PointerFlags::None); // AArch64 SVE data and predicate types, including the x2/x3/x4 tuples. #define SVE_VECTOR_TYPE(Name, MangledName, Id, SingletonId) \ @@ -356,7 +365,8 @@ QualTypeMapper::convertArrayType(const clang::ArrayType *AT) { if (isa<IncompleteArrayType>(AT)) return Builder.getArrayType(ElementType, 0, 0); if (const auto *VAT = dyn_cast<VariableArrayType>(AT)) - return createPointerTypeForPointee(VAT->getPointeeType()); + return createPointerTypeForPointee(VAT->getPointeeType(), + llvm::abi::PointerFlags::None); llvm::reportFatalInternalError( "unexpected array type in ABI lowering (dependent array types should be " "resolved before reaching this point)"); @@ -480,8 +490,8 @@ QualTypeMapper::convertCXXRecordType(const CXXRecordDecl *RD) { // Add vtable pointer for polymorphic classes if (RD->isPolymorphic()) { - const llvm::abi::Type *VtablePointer = - createPointerTypeForPointee(ASTCtx.VoidPtrTy); + const llvm::abi::Type *VtablePointer = createPointerTypeForPointee( + ASTCtx.VoidPtrTy, llvm::abi::PointerFlags::IsPointerOrReference); Fields.emplace_back(VtablePointer, 0); } @@ -620,7 +630,8 @@ llvm::Align QualTypeMapper::getTypeAlign(QualType QT) const { } const llvm::abi::Type * -QualTypeMapper::createPointerTypeForPointee(QualType PointeeType) { +QualTypeMapper::createPointerTypeForPointee(QualType PointeeType, + llvm::abi::PointerFlags Flags) { auto AddrSpace = PointeeType.getAddressSpace(); auto PointerSize = ASTCtx.getTargetInfo().getPointerWidth(AddrSpace); llvm::Align Alignment = @@ -632,8 +643,10 @@ QualTypeMapper::createPointerTypeForPointee(QualType PointeeType) { PointeeType->isFunctionType() && !PointeeType.hasAddressSpace() ? DL.getProgramAddressSpace() : ASTCtx.getTargetInfo().getTargetAddressSpace(AddrSpace); + if (PointeeType.hasAddressSpace()) + Flags |= llvm::abi::PointerFlags::IsPointeeAddressSpaceQualified; return Builder.getPointerType(PointerSize, llvm::Align(Alignment.value() / 8), - TargetAddrSpace); + TargetAddrSpace, Flags); } /// Processes the fields of a record (struct/class/union) and populates diff --git a/clang/lib/CodeGen/QualTypeMapper.h b/clang/lib/CodeGen/QualTypeMapper.h index f6bb43482c705..c909468fc04bb 100644 --- a/clang/lib/CodeGen/QualTypeMapper.h +++ b/clang/lib/CodeGen/QualTypeMapper.h @@ -51,7 +51,9 @@ class QualTypeMapper { const llvm::abi::RecordType *convertStructType(const clang::RecordDecl *RD); const llvm::abi::RecordType *convertUnionType(const clang::RecordDecl *RD); - const llvm::abi::Type *createPointerTypeForPointee(QualType PointeeType); + const llvm::abi::Type * + createPointerTypeForPointee(QualType PointeeType, + llvm::abi::PointerFlags Flags); const llvm::abi::RecordType *convertCXXRecordType(const CXXRecordDecl *RD); void computeFieldInfo(const clang::RecordDecl *RD, diff --git a/clang/test/CodeGen/AArch64/abi-classify-arg-pointer-like.m b/clang/test/CodeGen/AArch64/abi-classify-arg-pointer-like.m new file mode 100644 index 0000000000000..feea53e9c9b2f --- /dev/null +++ b/clang/test/CodeGen/AArch64/abi-classify-arg-pointer-like.m @@ -0,0 +1,46 @@ +// RUN: %clang_cc1 -triple aarch64-linux-gnu -fblocks -emit-llvm -o - %s | FileCheck %s +// RUN: %clang_cc1 -triple aarch64-linux-gnu -fblocks -fexperimental-abi-lowering -emit-llvm -o - %s 2>&1 | FileCheck %s --implicit-check-not="not yet implemented" + +// Objective-C object pointers and block pointers are pointer representations, +// but they are not ordinary C/C++ pointers or references and therefore use +// integer coercions for aggregate arguments. + +@class Object; + +typedef struct { + id value; +} ObjCIdAgg; +void arg_objc_id(ObjCIdAgg a) {} +// CHECK: define{{.*}} void @arg_objc_id(i64 %{{.*}}) + +typedef struct { + Class value; +} ObjCClassAgg; +void arg_objc_class(ObjCClassAgg a) {} +// CHECK: define{{.*}} void @arg_objc_class(i64 %{{.*}}) + +typedef struct { + SEL value; +} ObjCSelAgg; +void arg_objc_sel(ObjCSelAgg a) {} +// SEL canonicalizes to an ordinary pointer type. +// CHECK: define{{.*}} void @arg_objc_sel(ptr %{{.*}}) + +typedef struct { + Object *value; +} ObjCObjectPointerAgg; +void arg_objc_object_pointer(ObjCObjectPointerAgg a) {} +// CHECK: define{{.*}} void @arg_objc_object_pointer(i64 %{{.*}}) + +typedef struct { + id first; + id second; +} ObjCIdPairAgg; +void arg_objc_id_pair(ObjCIdPairAgg a) {} +// CHECK: define{{.*}} void @arg_objc_id_pair([2 x i64] %{{.*}}) + +typedef struct { + void (^value)(void); +} BlockPointerAgg; +void arg_block_pointer(BlockPointerAgg a) {} +// CHECK: define{{.*}} void @arg_block_pointer(i64 %{{.*}}) diff --git a/clang/test/CodeGen/AArch64/abi-classify-arg-types.c b/clang/test/CodeGen/AArch64/abi-classify-arg-types.c index 274c6010ea7e4..7950e3320d379 100644 --- a/clang/test/CodeGen/AArch64/abi-classify-arg-types.c +++ b/clang/test/CodeGen/AArch64/abi-classify-arg-types.c @@ -1,17 +1,17 @@ -// RUN: %clang_cc1 -triple arm64-apple-ios7.0 -target-abi darwinpcs -fenable-matrix -fexperimental-max-bitint-width=1024 -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,DARWIN,LONG64,NOHFAALIGN,NOHUGEVEC,NOANDROID -// RUN: %clang_cc1 -triple arm64-apple-ios7.0 -target-abi darwinpcs -fenable-matrix -fexperimental-max-bitint-width=1024 -fexperimental-abi-lowering -emit-llvm -o - %s 2>&1 | FileCheck %s --check-prefixes=CHECK,DARWIN,LONG64,NOHFAALIGN,NOHUGEVEC,NOANDROID --implicit-check-not="not yet implemented" -// RUN: %clang_cc1 -triple arm64_32-apple-ios7.0 -target-abi darwinpcs -fenable-matrix -fexperimental-max-bitint-width=1024 -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,DARWIN,LONG32,NOHFAALIGN,HUGEVEC,NOANDROID -// RUN: %clang_cc1 -triple arm64_32-apple-ios7.0 -target-abi darwinpcs -fenable-matrix -fexperimental-max-bitint-width=1024 -fexperimental-abi-lowering -emit-llvm -o - %s 2>&1 | FileCheck %s --check-prefixes=CHECK,DARWIN,LONG32,NOHFAALIGN,HUGEVEC,NOANDROID --implicit-check-not="not yet implemented" -// RUN: %clang_cc1 -triple aarch64-linux-gnu -fenable-matrix -fexperimental-max-bitint-width=1024 -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,AAPCS,LONG64,AAPCS64,NOHUGEVEC,NOANDROID -// RUN: %clang_cc1 -triple aarch64-linux-gnu -fenable-matrix -fexperimental-max-bitint-width=1024 -fexperimental-abi-lowering -emit-llvm -o - %s 2>&1 | FileCheck %s --check-prefixes=CHECK,AAPCS,LONG64,AAPCS64,NOHUGEVEC,NOANDROID --implicit-check-not="not yet implemented" -// RUN: %clang_cc1 -triple aarch64_be-linux-gnu -fenable-matrix -fexperimental-max-bitint-width=1024 -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,AAPCS,LONG64,AAPCS64,NOHUGEVEC,NOANDROID -// RUN: %clang_cc1 -triple aarch64_be-linux-gnu -fenable-matrix -fexperimental-max-bitint-width=1024 -fexperimental-abi-lowering -emit-llvm -o - %s 2>&1 | FileCheck %s --check-prefixes=CHECK,AAPCS,LONG64,AAPCS64,NOHUGEVEC,NOANDROID --implicit-check-not="not yet implemented" -// RUN: %clang_cc1 -triple aarch64-linux-android -fenable-matrix -fexperimental-max-bitint-width=1024 -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,AAPCS,LONG64,AAPCS64,NOHUGEVEC,ANDROID -// RUN: %clang_cc1 -triple aarch64-linux-android -fenable-matrix -fexperimental-max-bitint-width=1024 -fexperimental-abi-lowering -emit-llvm -o - %s 2>&1 | FileCheck %s --check-prefixes=CHECK,AAPCS,LONG64,AAPCS64,NOHUGEVEC,ANDROID --implicit-check-not="not yet implemented" -// RUN: %clang_cc1 -triple aarch64-pc-windows-msvc -fenable-matrix -fexperimental-max-bitint-width=1024 -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,AAPCS,LONG32,NOHFAALIGN,NOHUGEVEC,NOANDROID -// RUN: %clang_cc1 -triple aarch64-pc-windows-msvc -fenable-matrix -fexperimental-max-bitint-width=1024 -fexperimental-abi-lowering -emit-llvm -o - %s 2>&1 | FileCheck %s --check-prefixes=CHECK,AAPCS,LONG32,NOHFAALIGN,NOHUGEVEC,NOANDROID --implicit-check-not="not yet implemented" -// RUN: %clang_cc1 -triple arm64ec-pc-windows-msvc -fenable-matrix -fexperimental-max-bitint-width=1024 -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,AAPCS,LONG32,NOHFAALIGN,NOHUGEVEC,NOANDROID -// RUN: %clang_cc1 -triple arm64ec-pc-windows-msvc -fenable-matrix -fexperimental-max-bitint-width=1024 -fexperimental-abi-lowering -emit-llvm -o - %s 2>&1 | FileCheck %s --check-prefixes=CHECK,AAPCS,LONG32,NOHFAALIGN,NOHUGEVEC,NOANDROID --implicit-check-not="not yet implemented" +// RUN: %clang_cc1 -triple arm64-apple-ios7.0 -target-abi darwinpcs -fenable-matrix -fexperimental-max-bitint-width=1024 -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,DARWIN,LONG64,NOHFAALIGN,NOHUGEVEC,NOANDROID,PTR64 +// RUN: %clang_cc1 -triple arm64-apple-ios7.0 -target-abi darwinpcs -fenable-matrix -fexperimental-max-bitint-width=1024 -fexperimental-abi-lowering -emit-llvm -o - %s 2>&1 | FileCheck %s --check-prefixes=CHECK,DARWIN,LONG64,NOHFAALIGN,NOHUGEVEC,NOANDROID,PTR64 --implicit-check-not="not yet implemented" +// RUN: %clang_cc1 -triple arm64_32-apple-ios7.0 -target-abi darwinpcs -fenable-matrix -fexperimental-max-bitint-width=1024 -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,DARWIN,LONG32,NOHFAALIGN,HUGEVEC,NOANDROID,PTR32 +// RUN: %clang_cc1 -triple arm64_32-apple-ios7.0 -target-abi darwinpcs -fenable-matrix -fexperimental-max-bitint-width=1024 -fexperimental-abi-lowering -emit-llvm -o - %s 2>&1 | FileCheck %s --check-prefixes=CHECK,DARWIN,LONG32,NOHFAALIGN,HUGEVEC,NOANDROID,PTR32 --implicit-check-not="not yet implemented" +// RUN: %clang_cc1 -triple aarch64-linux-gnu -fenable-matrix -fexperimental-max-bitint-width=1024 -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,AAPCS,LONG64,AAPCS64,NOHUGEVEC,NOANDROID,PTR64 +// RUN: %clang_cc1 -triple aarch64-linux-gnu -fenable-matrix -fexperimental-max-bitint-width=1024 -fexperimental-abi-lowering -emit-llvm -o - %s 2>&1 | FileCheck %s --check-prefixes=CHECK,AAPCS,LONG64,AAPCS64,NOHUGEVEC,NOANDROID,PTR64 --implicit-check-not="not yet implemented" +// RUN: %clang_cc1 -triple aarch64_be-linux-gnu -fenable-matrix -fexperimental-max-bitint-width=1024 -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,AAPCS,LONG64,AAPCS64,NOHUGEVEC,NOANDROID,PTR64 +// RUN: %clang_cc1 -triple aarch64_be-linux-gnu -fenable-matrix -fexperimental-max-bitint-width=1024 -fexperimental-abi-lowering -emit-llvm -o - %s 2>&1 | FileCheck %s --check-prefixes=CHECK,AAPCS,LONG64,AAPCS64,NOHUGEVEC,NOANDROID,PTR64 --implicit-check-not="not yet implemented" +// RUN: %clang_cc1 -triple aarch64-linux-android -fenable-matrix -fexperimental-max-bitint-width=1024 -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,AAPCS,LONG64,AAPCS64,NOHUGEVEC,ANDROID,PTR64 +// RUN: %clang_cc1 -triple aarch64-linux-android -fenable-matrix -fexperimental-max-bitint-width=1024 -fexperimental-abi-lowering -emit-llvm -o - %s 2>&1 | FileCheck %s --check-prefixes=CHECK,AAPCS,LONG64,AAPCS64,NOHUGEVEC,ANDROID,PTR64 --implicit-check-not="not yet implemented" +// RUN: %clang_cc1 -triple aarch64-pc-windows-msvc -fenable-matrix -fexperimental-max-bitint-width=1024 -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,AAPCS,LONG32,NOHFAALIGN,NOHUGEVEC,NOANDROID,PTR64 +// RUN: %clang_cc1 -triple aarch64-pc-windows-msvc -fenable-matrix -fexperimental-max-bitint-width=1024 -fexperimental-abi-lowering -emit-llvm -o - %s 2>&1 | FileCheck %s --check-prefixes=CHECK,AAPCS,LONG32,NOHFAALIGN,NOHUGEVEC,NOANDROID,PTR64 --implicit-check-not="not yet implemented" +// RUN: %clang_cc1 -triple arm64ec-pc-windows-msvc -fenable-matrix -fexperimental-max-bitint-width=1024 -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,AAPCS,LONG32,NOHFAALIGN,NOHUGEVEC,NOANDROID,PTR64 +// RUN: %clang_cc1 -triple arm64ec-pc-windows-msvc -fenable-matrix -fexperimental-max-bitint-width=1024 -fexperimental-abi-lowering -emit-llvm -o - %s 2>&1 | FileCheck %s --check-prefixes=CHECK,AAPCS,LONG32,NOHFAALIGN,NOHUGEVEC,NOANDROID,PTR64 --implicit-check-not="not yet implemented" // This test is verifying that the LLVM ABI library classifies argument types in // the same way that Clang does without the library. @@ -113,6 +113,72 @@ void arg_bitint128(_BitInt(128) x) {} void arg_bitint129(_BitInt(129) x) {} // CHECK: define{{.*}} void @arg_bitint129(ptr nofreeobj noundef align 16 dead_on_return dereferenceable(32) %{{.*}}) +// Non-homogeneous fixed-size aggregates of at most 16 bytes are passed +// directly. Larger aggregates are passed indirectly. +typedef struct { + char x[3]; +} Agg3; +void arg_agg3(Agg3 a) {} +// PTR64: define{{.*}} void @arg_agg3(i64 %{{.*}}) +// PTR32: define{{.*}} void @arg_agg3(i32 %{{.*}}) + +typedef struct { + char x[9]; +} Agg9; +void arg_agg9(Agg9 a) {} +// PTR64: define{{.*}} void @arg_agg9([2 x i64] %{{.*}}) +// PTR32: define{{.*}} void @arg_agg9([3 x i32] %{{.*}}) + +typedef struct { + long long x, y; +} Agg16; +void arg_agg16(Agg16 a) {} +// CHECK: define{{.*}} void @arg_agg16([2 x i64] %{{.*}}) + +typedef struct { + _Alignas(16) char x[16]; +} Agg16Align16; +void arg_agg16_align16(Agg16Align16 a) {} +// CHECK: define{{.*}} void @arg_agg16_align16(i128 %{{.*}}) + +typedef struct { + char x[17]; +} Agg17; +void arg_agg17(Agg17 a) {} +// CHECK: define{{.*}} void @arg_agg17(ptr nofreeobj noundef align 1 {{(dead_on_return )?}}dereferenceable(17) %{{.*}}) + +// Aggregates made entirely of 64-bit default-address-space pointers retain +// pointer types in their coercion. +typedef struct { + int *p; +} PtrAgg1; +void arg_ptr_agg1(PtrAgg1 a) {} +// PTR64: define{{.*}} void @arg_ptr_agg1(ptr %{{.*}}) +// PTR32: define{{.*}} void @arg_ptr_agg1(i32 %{{.*}}) + +typedef struct { + int *p, *q; +} PtrAgg2; +void arg_ptr_agg2(PtrAgg2 a) {} +// PTR64: define{{.*}} void @arg_ptr_agg2([2 x ptr] %{{.*}}) +// PTR32: define{{.*}} void @arg_ptr_agg2([2 x i32] %{{.*}}) + +typedef int __attribute__((address_space(0))) as0_int; +typedef struct { + as0_int *p; +} ExplicitAS0PtrAgg; +void arg_explicit_as0_ptr_agg(ExplicitAS0PtrAgg a) {} +// PTR64: define{{.*}} void @arg_explicit_as0_ptr_agg(i64 %{{.*}}) +// PTR32: define{{.*}} void @arg_explicit_as0_ptr_agg(i32 %{{.*}}) + +typedef int __attribute__((address_space(1))) as1_int; +typedef struct { + as1_int *p; +} NonDefaultASPtrAgg; +void arg_nondefault_as_ptr_agg(NonDefaultASPtrAgg a) {} +// PTR64: define{{.*}} void @arg_nondefault_as_ptr_agg(i64 %{{.*}}) +// PTR32: define{{.*}} void @arg_nondefault_as_ptr_agg(i32 %{{.*}}) + // Homogeneous floating-point aggregates are coerced to an array of the base // type. AAPCS sets alignstack from unadjusted alignment (8, or 16 if the // unadjusted alignment is at least 16). DarwinPCS and Win64 do not. diff --git a/clang/test/CodeGen/AArch64/abi-classify-arg-types.cpp b/clang/test/CodeGen/AArch64/abi-classify-arg-types.cpp index 8e0bbb0e06b57..fa384187a43eb 100644 --- a/clang/test/CodeGen/AArch64/abi-classify-arg-types.cpp +++ b/clang/test/CodeGen/AArch64/abi-classify-arg-types.cpp @@ -1,11 +1,11 @@ -// RUN: %clang_cc1 -triple arm64-apple-ios7.0 -target-abi darwinpcs -std=c++20 -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,NOHFAALIGN -// RUN: %clang_cc1 -triple arm64-apple-ios7.0 -target-abi darwinpcs -std=c++20 -fexperimental-abi-lowering -emit-llvm -o - %s 2>&1 | FileCheck %s --check-prefixes=CHECK,NOHFAALIGN --implicit-check-not="n... [truncated] `````````` </details> https://github.com/llvm/llvm-project/pull/229202 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
