[Mlir-commits] [clang] [llvm] [mlir] [LLVMABI][AArch64] Support aggregate arguments (PR #229202)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Tue Oct 6 08:00:58 PDT 2026
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.
+
+ at 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
More information about the Mlir-commits
mailing list