On Wed, Jun 17, 2026 at 6:03 AM Alfie Richards <[email protected]> wrote:
>
>
> Hi All,
>
> This is a fix for preserve_none to make it fall back to AAPCS when there are
> variadic arguments.
>
> This aligns it with the ABI clang uses and defacto defines.
>
> Reg tested and bootstrapped for aarch64-linux-gnu.
>
> Okay for master and later backbort to GCC 16?

Yes and Yes.

>
> KR,
> Alfie
>
> -- >8 --
>
>         PR target/125838
>
> gcc/ChangeLog:
>
>         * config/aarch64/aarch64.cc (aarch64_fntype_abi): Fall back to
>         AAPCS for preserve_none variadic calls.
>
> gcc/testsuite/ChangeLog:
>
>         * gcc.target/aarch64/preserve_none_5.c: Update to use AAPCS.
> ---
>  gcc/config/aarch64/aarch64.cc                 |  4 +-
>  .../gcc.target/aarch64/preserve_none_5.c      | 64 ++++++++++++-------
>  2 files changed, 43 insertions(+), 25 deletions(-)
>
> diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
> index 42e56512c61..b6c464ebc9b 100644
> --- a/gcc/config/aarch64/aarch64.cc
> +++ b/gcc/config/aarch64/aarch64.cc
> @@ -2591,7 +2591,9 @@ aarch64_fntype_abi (const_tree fntype)
>    if (lookup_attribute ("aarch64_vector_pcs", TYPE_ATTRIBUTES (fntype)))
>      return aarch64_simd_abi ();
>
> -  if (lookup_attribute ("preserve_none", TYPE_ATTRIBUTES (fntype)))
> +  /* Fall back to AAPCS for variadic functions.  */
> +  if (lookup_attribute ("preserve_none", TYPE_ATTRIBUTES (fntype))
> +      && !stdarg_p (fntype))
>      return aarch64_preserve_none_abi ();
>
>    if (aarch64_returns_value_in_sve_regs_p (fntype)
> diff --git a/gcc/testsuite/gcc.target/aarch64/preserve_none_5.c 
> b/gcc/testsuite/gcc.target/aarch64/preserve_none_5.c
> index d11bf10a898..80bd949a893 100644
> --- a/gcc/testsuite/gcc.target/aarch64/preserve_none_5.c
> +++ b/gcc/testsuite/gcc.target/aarch64/preserve_none_5.c
> @@ -6,35 +6,51 @@
>  #include <stdarg.h>
>  int foo [[gnu::preserve_none]] (...);
>
> -/* Check the pcs argument order is correct. Should be x20-28, x0-7, x10-14, 
> x9, x15 and that the return arg is x0 */
> +/* Check preserve_none falls back to AAPCS for variadic functions. */
>
>  /*
>  ** bar:
>  ** ...
> -**     mov     w15, 23
> -**     mov     w9, 22
> -**     mov     w14, 21
> -**     mov     w13, 20
> -**     mov     w12, 19
> -**     mov     w11, 18
> -**     mov     w10, 17
> -**     mov     w7, 16
> -**     mov     w6, 15
> -**     mov     w5, 14
> -**     mov     w4, 13
> -**     mov     w3, 12
> -**     mov     w2, 11
> -**     mov     w1, 10
> +**     mov     w0, 23
> +**     mov     w7, 7
> +**     mov     w6, 6
> +**     mov     w5, 5
> +**     mov     w4, 4
> +**     mov     w3, 3
> +**     mov     w2, 2
> +**     mov     w1, 1
> +**     str     w0, \[sp, 120\]
> +**     mov     w0, 22
> +**     str     w0, \[sp, 112\]
> +**     mov     w0, 21
> +**     str     w0, \[sp, 104\]
> +**     mov     w0, 20
> +**     str     w0, \[sp, 96\]
> +**     mov     w0, 19
> +**     str     w0, \[sp, 88\]
> +**     mov     w0, 18
> +**     str     w0, \[sp, 80\]
> +**     mov     w0, 17
> +**     str     w0, \[sp, 72\]
> +**     mov     w0, 16
> +**     str     w0, \[sp, 64\]
> +**     mov     w0, 15
> +**     str     w0, \[sp, 56\]
> +**     mov     w0, 14
> +**     str     w0, \[sp, 48\]
> +**     mov     w0, 13
> +**     str     w0, \[sp, 40\]
> +**     mov     w0, 12
> +**     str     w0, \[sp, 32\]
> +**     mov     w0, 11
> +**     str     w0, \[sp, 24\]
> +**     mov     w0, 10
> +**     str     w0, \[sp, 16\]
>  **     mov     w0, 9
> -**     mov     w28, 8
> -**     mov     w27, 7
> -**     mov     w26, 6
> -**     mov     w25, 5
> -**     mov     w24, 4
> -**     mov     w23, 3
> -**     mov     w22, 2
> -**     mov     w21, 1
> -**     mov     w20, 0
> +**     str     w0, \[sp, 8\]
> +**     mov     w0, 8
> +**     str     w0, \[sp\]
> +**     mov     w0, 0
>  **     bl      foo
>  **     add     w0, w0, 1
>  ** ...
> --
> 2.34.1
>
>
> --
> Alfie Richards

Reply via email to