Skip to content

Commit 449f84f

Browse files
authored
[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
1 parent 00637b7 commit 449f84f

File tree

2 files changed

+21
-0
lines changed

2 files changed

+21
-0
lines changed

flang/lib/Optimizer/CodeGen/Target.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -930,6 +930,13 @@ struct TargetAArch64 : public GenericTarget<TargetAArch64> {
930930
.Case<fir::VectorType>([&](auto) {
931931
TODO(loc, "passing vector argument to C by value is not supported");
932932
return NRegs{};
933+
})
934+
.Default([&](auto ty) {
935+
if (fir::conformsWithPassByRef(ty))
936+
return NRegs{1, false}; // Pointers take 1 integer register
937+
TODO(loc, "unsupported component type for BIND(C), VALUE derived "
938+
"type argument");
939+
return NRegs{};
933940
});
934941
}
935942

flang/test/Fir/struct-passing-aarch64-byval.fir

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,3 +71,17 @@ func.func private @too_many_hfa(!fir.type<hfa_max{i:f128,j:f128,k:f128,l:f128}>,
7171

7272
// 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>}>})
7373
func.func private @too_big(!fir.type<too_big{i:!fir.array<5xi32>}>)
74+
75+
// CHECK-LABEL: func.func private @pointer_type(!fir.ref<i64>, !fir.array<1xi64>)
76+
func.func private @pointer_type(!fir.ref<i64>, !fir.type<pointer_type{i:i64}>)
77+
78+
// CHECK-LABEL: func.func private @pointer_type_too_many_int(!fir.ref<i64>,
79+
// CHECK-SAME: !fir.array<2xi64>,
80+
// CHECK-SAME: !fir.array<2xi64>,
81+
// CHECK-SAME: !fir.array<2xi64>,
82+
// CHECK-SAME: !fir.ref<!fir.type<int_max{i:i64,j:i64}>> {{{.*}}, llvm.byval = !fir.type<int_max{i:i64,j:i64}>})
83+
func.func private @pointer_type_too_many_int(!fir.ref<i64>,
84+
!fir.type<int_max{i:i64,j:i64}>,
85+
!fir.type<int_max{i:i64,j:i64}>,
86+
!fir.type<int_max{i:i64,j:i64}>,
87+
!fir.type<int_max{i:i64,j:i64}>)

0 commit comments

Comments
 (0)