[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