[clang] [llvm] [LLVMABI][AARCH64] Handle condtions for ignoring empty types (PR #224476)
Madhur Amilkanthwar via cfe-commits
cfe-commits at lists.llvm.org
Thu Sep 17 23:17:25 PDT 2026
================
@@ -794,4 +794,78 @@ TEST_F(AArch64TargetInfoTest, ClassifyArgumentOveralignedHFAAlign) {
}
}
+// Empty records and zero-size types are ignored as returns under all AArch64
+// ABI kinds. Empty C arguments are ignored; Darwin also ignores empty C++
+// arguments. C++ AAPCS/Win64 only ignore zero-size types.
+TEST_F(AArch64TargetInfoTest, ClassifyEmptyAndZeroSizeIgnore) {
+ const ABIType *EmptyC = makeRecord({}, 0, llvm::Align(1),
+ /*UnadjustedAlign=*/llvm::Align(1));
+ const ABIType *EmptyUnion =
+ TB.getUnionType({}, llvm::TypeSize::getFixed(0), llvm::Align(1),
+ /*UnadjustedAlign=*/llvm::Align(1),
+ StructPacking::Default, RecordFlags::CanPassInRegisters);
+ const ABIType *EmptyCXX =
+ makeRecord({}, 8, llvm::Align(1), /*UnadjustedAlign=*/llvm::Align(1),
+ passableRecordFlags(/*IsCXX=*/true));
+ const ABIType *ZeroArr = TB.getArrayType(I32, /*NumElements=*/0,
+ /*SizeInBits=*/0);
+ const ABIType *ZeroSizeCXX = makeRecord(
+ {FieldInfo(ZeroArr, 0)}, 0, llvm::Align(1),
+ /*UnadjustedAlign=*/llvm::Align(1), passableRecordFlags(/*IsCXX=*/true));
+ const ABIType *NestedZeroSize = makeRecord(
+ {FieldInfo(ZeroSizeCXX, 0)}, 0, llvm::Align(1),
+ /*UnadjustedAlign=*/llvm::Align(1), passableRecordFlags(/*IsCXX=*/true));
+
+ auto ClassifyArg = [&](AArch64ABIKind Kind, bool IsCXX, const ABIType *Ty) {
+ AArch64ABIOptions Opts(Kind);
+ Opts.IsCXX = IsCXX;
+ std::unique_ptr<TargetInfo> TI = createAArch64TargetInfo(TB, Opts);
+ std::unique_ptr<FunctionInfo> FI =
+ FunctionInfo::create(llvm::CallingConv::C, Void, {Ty});
+ TI->computeInfo(*FI);
+ return FI->getArgInfo(0).Info;
+ };
+
+ auto ClassifyReturn = [&](AArch64ABIKind Kind, bool IsCXX,
+ const ABIType *Ty) {
+ AArch64ABIOptions Opts(Kind);
+ Opts.IsCXX = IsCXX;
+ std::unique_ptr<TargetInfo> TI = createAArch64TargetInfo(TB, Opts);
+ std::unique_ptr<FunctionInfo> FI =
+ FunctionInfo::create(llvm::CallingConv::C, Ty, {});
+ FI->getReturnInfo() = ArgInfo::getDirect();
----------------
madhur13490 wrote:
Is this needed? computeInfo overwrites the return info unconditionally unless maybeCommonClassifyReturnType claims it, and none of these types take that path. Looks like a dead store.
https://github.com/llvm/llvm-project/pull/224476
More information about the cfe-commits
mailing list