Christophe Lyon <christophe.l...@arm.com> writes: > While working on enabling DFP for AArch64, I noticed new failures in > gcc.dg/compat/struct-layout-1.exp (t028) which were not actually > caused by DFP types handling. These tests are generated during 'make > check' and enabling DFP made generation different (not sure if new > non-DFP tests are generated, or if existing ones are generated > differently, the tests in question are huge and difficult to compare). > > Anyway, I reduced the problem to what I attach at the end of the new > gcc.target/aarch64/aapcs64/va_arg-17.c test and rewrote it in the same > scheme as other va_arg* AArch64 tests. Richard Sandiford further > reduced this to a non-vararg function, added as a second testcase. > > This is a tough case mixing bit-fields and alignment, where > aarch64_function_arg_alignment did not follow what its descriptive > comment says: we want to use the natural alignment of the bit-field > type only if the user didn't reduce the alignment for the bit-field > itself. > > The patch also adds a comment and assert that would help someone who > has to look at this area again. > > The fix would be very small, except that this introduces a new ABI > break, and we have to warn about that. Since this actually fixes a > problem introduced in GCC 9.1, we keep the old computation to detect > when we now behave differently. > > This patch adds two new tests (va_arg-17.c and > pr105549.c). va_arg-17.c contains the reduced offending testcase from > struct-layout-1.exp for reference. We update some tests introduced by > the previous patch, where parameters with bit-fields and packed > attribute now emit a different warning. > > v2->v3: testcase update > > 2022-11-28 Christophe Lyon <christophe.l...@arm.com> > Richard Sandiford <richard.sandif...@arm.com> > > gcc/ > PR target/105549 > * config/aarch64/aarch64.cc (aarch64_function_arg_alignment): > Check DECL_PACKED for bitfield. > (aarch64_layout_arg): Warn when parameter passing ABI changes. > (aarch64_function_arg_boundary): Do not warn here. > (aarch64_gimplify_va_arg_expr): Warn when parameter passing ABI > changes. > > gcc/testsuite/ > PR target/105549 > * gcc.target/aarch64/bitfield-abi-warning-align16-O2.c: Update. > * gcc.target/aarch64/bitfield-abi-warning-align16-O2-extra.c: Update. > * gcc.target/aarch64/bitfield-abi-warning-align32-O2.c: Update. > * gcc.target/aarch64/bitfield-abi-warning-align32-O2-extra.c: Update. > * gcc.target/aarch64/aapcs64/va_arg-17.c: New test. > * gcc.target/aarch64/pr105549.c: New test. > * g++.target/aarch64/bitfield-abi-warning-align16-O2.C: Update. > * g++.target/aarch64/bitfield-abi-warning-align16-O2-extra.C: Update. > * g++.target/aarch64/bitfield-abi-warning-align32-O2.C: Update. > * g++.target/aarch64/bitfield-abi-warning-align32-O2-extra.C: Update. > --- > gcc/config/aarch64/aarch64.cc | 148 ++++++++++++++---- > .../bitfield-abi-warning-align16-O2-extra.C | 64 ++++---- > .../aarch64/bitfield-abi-warning-align16-O2.C | 48 +++--- > .../bitfield-abi-warning-align32-O2-extra.C | 131 +++++++--------- > .../aarch64/bitfield-abi-warning-align32-O2.C | 132 ++++++++-------- > .../gcc.target/aarch64/aapcs64/va_arg-17.c | 105 +++++++++++++ > .../bitfield-abi-warning-align16-O2-extra.c | 64 ++++---- > .../aarch64/bitfield-abi-warning-align16-O2.c | 48 +++--- > .../bitfield-abi-warning-align32-O2-extra.c | 131 +++++++--------- > .../aarch64/bitfield-abi-warning-align32-O2.c | 132 ++++++++-------- > gcc/testsuite/gcc.target/aarch64/pr105549.c | 12 ++ > 11 files changed, 587 insertions(+), 428 deletions(-) > create mode 100644 gcc/testsuite/gcc.target/aarch64/aapcs64/va_arg-17.c > create mode 100644 gcc/testsuite/gcc.target/aarch64/pr105549.c > [...] > @@ -68,14 +62,14 @@ > /* { dg-note {parameter passing for argument of type 'S4' changed in GCC > 9.1} "" { target *-*-* } 103 } f4_stdarg */ > /* { dg-note {parameter passing for argument of type 'S8' changed in GCC > 9.1} "" { target *-*-* } 104 } f8_stdarg */ > > -/* Parameter passing for these should not have changed in GCC 9.1 (PR > 105549). > +/* FIXME Parameter passing for these should not have changed in GCC 9.1 (PR > 105549). > Fortunately we warn. Note the discrepancy with lines 120-124 below: we > warn > in the callee, but not in the caller. */
Looks like a stray change. Same for the C test. OK otherwise, thanks. Richard