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 { .Case([&](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, // CHECK-LABEL: func.func private @too_big(!fir.ref}>> {{{.*}}, llvm.byval = !fir.type}>}) func.func private @too_big(!fir.type}>) + +// CHECK-LABEL: func.func private @pointer_type(!fir.ref, !fir.array<1xi64>) +func.func private @pointer_type(!fir.ref, !fir.type) + +// CHECK-LABEL: func.func private @pointer_type_too_many_int(!fir.ref, +// CHECK-SAME: !fir.array<2xi64>, +// CHECK-SAME: !fir.array<2xi64>, +// CHECK-SAME: !fir.array<2xi64>, +// CHECK-SAME: !fir.ref> {{{.*}}, llvm.byval = !fir.type}) +func.func private @pointer_type_too_many_int(!fir.ref, + !fir.type, + !fir.type, + !fir.type, + !fir.type)