https://github.com/llvmbot updated https://github.com/llvm/llvm-project/pull/128518
>From 350e0e2b45331279a003d3ab7c7178680e533158 Mon Sep 17 00:00:00 2001 From: David Truby <david.tr...@arm.com> Date: Fri, 21 Feb 2025 18:50:52 +0000 Subject: [PATCH] [flang] fix AArch64 PCS for struct following pointer (#127802) Pointers are already handled as taking up a register in the ABI handling, but the handling for structs was not taking this into account. This patch changes the struct handling to acknowledge that pointer arguments take up an integer register. Fixes #123075 (cherry picked from commit 449f84fea652e31de418c3087d7e3628809241b4) --- flang/lib/Optimizer/CodeGen/Target.cpp | 7 +++++++ flang/test/Fir/struct-passing-aarch64-byval.fir | 14 ++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/flang/lib/Optimizer/CodeGen/Target.cpp b/flang/lib/Optimizer/CodeGen/Target.cpp index 1bc673bb34e32..2a1eb0bc33f5c 100644 --- a/flang/lib/Optimizer/CodeGen/Target.cpp +++ b/flang/lib/Optimizer/CodeGen/Target.cpp @@ -930,6 +930,13 @@ struct TargetAArch64 : public GenericTarget<TargetAArch64> { .Case<fir::VectorType>([&](auto) { TODO(loc, "passing vector argument to C by value is not supported"); return NRegs{}; + }) + .Default([&](auto ty) { + if (fir::conformsWithPassByRef(ty)) + return NRegs{1, false}; // Pointers take 1 integer register + TODO(loc, "unsupported component type for BIND(C), VALUE derived " + "type argument"); + return NRegs{}; }); } diff --git a/flang/test/Fir/struct-passing-aarch64-byval.fir b/flang/test/Fir/struct-passing-aarch64-byval.fir index 27143459dde2f..087efba393014 100644 --- a/flang/test/Fir/struct-passing-aarch64-byval.fir +++ b/flang/test/Fir/struct-passing-aarch64-byval.fir @@ -71,3 +71,17 @@ func.func private @too_many_hfa(!fir.type<hfa_max{i:f128,j:f128,k:f128,l:f128}>, // CHECK-LABEL: func.func private @too_big(!fir.ref<!fir.type<too_big{i:!fir.array<5xi32>}>> {{{.*}}, llvm.byval = !fir.type<too_big{i:!fir.array<5xi32>}>}) func.func private @too_big(!fir.type<too_big{i:!fir.array<5xi32>}>) + +// CHECK-LABEL: func.func private @pointer_type(!fir.ref<i64>, !fir.array<1xi64>) +func.func private @pointer_type(!fir.ref<i64>, !fir.type<pointer_type{i:i64}>) + +// CHECK-LABEL: func.func private @pointer_type_too_many_int(!fir.ref<i64>, +// CHECK-SAME: !fir.array<2xi64>, +// CHECK-SAME: !fir.array<2xi64>, +// CHECK-SAME: !fir.array<2xi64>, +// CHECK-SAME: !fir.ref<!fir.type<int_max{i:i64,j:i64}>> {{{.*}}, llvm.byval = !fir.type<int_max{i:i64,j:i64}>}) +func.func private @pointer_type_too_many_int(!fir.ref<i64>, + !fir.type<int_max{i:i64,j:i64}>, + !fir.type<int_max{i:i64,j:i64}>, + !fir.type<int_max{i:i64,j:i64}>, + !fir.type<int_max{i:i64,j:i64}>) _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits