Matthew Malcomson <matthew.malcom...@arm.com> writes: > In C++17, an empty class deriving from an empty base is not an > aggregate, while in C++14 it is. In order to implement this, GCC adds > an artificial field to such classes. > > This artificial field has no mapping to Fundamental Data Types in the > AArch64 PCS ABI and hence should not count towards determining whether an > object can be passed using the vector registers as per section > "6.4.2 Parameter Passing Rules" in the AArch64 PCS. > https://github.com/ARM-software/abi-aa/blob/master/aapcs64/aapcs64.rst#the-base-procedure-call-standard > > This patch avoids counting this artificial field in > aapcs_vfp_sub_candidate, and hence calculates whether such objects > should be passed in vector registers in the same manner as C++14 (where > the artificial field does not exist). > > Before this change, the test below would pass the arguments to `f` in > general registers. After this change, the test passes the arguments to > `f` using the vector registers. > > The new behaviour matches the behaviour of `armclang`, and also matches > the behaviour when run with `-std=gnu++14`. > >> gcc -std=gnu++17 test.cpp > > ``` test.cpp > struct base {}; > > struct pair : base > { > float first; > float second; > pair (float f, float s) : first(f), second(s) {} > }; > > void f (pair); > int main() > { > f({3.14, 666}); > return 1; > } > ``` > > We add a `-Wpsabi` warning to catch cases where this fix has changed the ABI > for > some functions. Unfortunately this warning is not emitted twice for multiple > calls to the same function, but I feel this is not much of a problem and can > be > fixed later if needs be. > > (i.e. if `main` called `f` twice in a row we only emit a diagnostic for the > first). > > Testing: > Minimal testing done just to demonstrate new warning message and to check > tests related to this still pass. > > > gcc/ChangeLog: > > 2020-04-23 Matthew Malcomson <matthew.malcom...@arm.com> > Jakub Jelinek <ja...@redhat.com> > > PR target/94383 > * config/aarch64/aarch64.c (aapcs_vfp_sub_candidate): Account for C++17 > empty base class artificial fields. > (aarch64_vfp_is_call_or_return_candidate): Warn when ABI PCS decision is > different after this fix.
OK if it passes testing, thanks. Richard