Skip to content

Commit 350e0e2

Browse files
DavidTrubytstellar
authored andcommitted
[flang] fix AArch64 PCS for struct following pointer (llvm#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 llvm#123075 (cherry picked from commit 449f84f)
1 parent 69ee30f commit 350e0e2

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)