https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118328
--- Comment #23 from GCC Commits <cvs-commit at gcc dot gnu.org> --- The master branch has been updated by Alfie Richards <[email protected]>: https://gcc.gnu.org/g:7197d8062fddc26c05c0da0bbfcd4128de788e34 commit r16-5076-g7197d8062fddc26c05c0da0bbfcd4128de788e34 Author: Alfie Richards <[email protected]> Date: Wed Oct 15 13:34:55 2025 +0000 aarch64: Add support for preserve_none function attribute [PR target/118328] When applied to a function preserve_none changes the procedure call standard such that all registers except stack pointer, frame register, and link register are caller saved. Additionally, it changes the argument passing registers. PR target/118328 gcc/ChangeLog: * config/aarch64/aarch64.cc (handle_aarch64_vector_pcs_attribute): Add handling for ARM_PCS_PRESERVE_NONE. (aarch64_pcs_exclusions): New definition. (aarch64_gnu_attributes): Add entry for preserve_none and add aarch64_pcs_exclusions to aarch64_vector_pcs entry. (aarch64_preserve_none_abi): New function. (aarch64_fntype_abi): Add handling for preserve_none. (aarch64_reg_save_mode): Add handling for ARM_PCS_PRESERVE_NONE. (aarch64_hard_regno_call_part_clobbered): Add handling for ARM_PCS_PRESERVE_NONE. (num_pcs_arg_regs): New helper function. (get_pcs_arg_reg): New helper function. (aarch64_function_ok_for_sibcall): Add handling for ARM_PCS_PRESERVE_NONE. (aarch64_layout_arg): Add preserve_none argument lauout.. (function_arg_preserve_none_regno_p): New helper function. (aarch64_function_arg): Update to handle preserve_none. (function_arg_preserve_none_regno_p): Update logic for preserve_none. (aarch64_expand_builtin_va_start): Add preserve_none layout. (aarch64_setup_incoming_varargs): Add preserve_none layout. (aarch64_is_variant_pcs): Update for case of ARM_PCS_PRESERVE_NONE. (aarch64_comp_type_attributes): Add preserve_none. * config/aarch64/aarch64.h (NUM_PRESERVE_NONE_ARG_REGS): New macro. (PRESERVE_NONE_REGISTERS): New macro. (enum arm_pcs): Add ARM_PCS_PRESERVE_NONE. * doc/extend.texi (preserve_none): Add docs for new attribute. gcc/testsuite/ChangeLog: * gcc.target/aarch64/preserve_none_1.c: New test. * gcc.target/aarch64/preserve_none_mingw_1.c: New test. * gcc.target/aarch64/preserve_none_2.c: New test. * gcc.target/aarch64/preserve_none_3.c: New test. * gcc.target/aarch64/preserve_none_4.c: New test. * gcc.target/aarch64/preserve_none_5.c: New test. * gcc.target/aarch64/preserve_none_6.c: New test.
