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

Reply via email to