https://gcc.gnu.org/g:6301ece614f6e64eeb22fe5e25b30b55e344ecd9
commit r16-9195-g6301ece614f6e64eeb22fe5e25b30b55e344ecd9 Author: Alfie Richards <[email protected]> Date: Wed Jun 17 11:17:09 2026 +0000 aarch64: Fall back to AAPCS for variadic functions with preserve_none [PR 125838] 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. Diff: --- gcc/config/aarch64/aarch64.cc | 4 +- gcc/testsuite/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 05e582220c19..0b9cb043c665 100644 --- a/gcc/config/aarch64/aarch64.cc +++ b/gcc/config/aarch64/aarch64.cc @@ -2571,7 +2571,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 d11bf10a8985..80bd949a893a 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 ** ...
