public inbox for gcc-cvs@sourceware.org help / color / mirror / Atom feed
From: Alexandre Oliva <aoliva@gcc.gnu.org> To: gcc-cvs@gcc.gnu.org Subject: [gcc(refs/users/aoliva/heads/testme)] arm: fix c23 0-named-args caller-side stdarg Date: Sat, 2 Dec 2023 17:48:43 +0000 (GMT) [thread overview] Message-ID: <20231202174843.26A063858296@sourceware.org> (raw) https://gcc.gnu.org/g:78b705cdde6f0b68f6def8680ac0eab4ea929998 commit 78b705cdde6f0b68f6def8680ac0eab4ea929998 Author: Alexandre Oliva <oliva@adacore.com> Date: Sat Nov 18 02:11:49 2023 -0300 arm: fix c23 0-named-args caller-side stdarg On arm-eabi targets, c23 stdarg execution tests that pass arguments to (...) functions (without any named argument), the caller passes everything on the stack, but the callee expects arguments in registers. My reading of the AAPCS32 suggests that the caller is correct, so I've arranged for the caller to pass the first arguments in registers to TYPE_NO_NAMED_STDARG_P-typed functions. The implementation issue in calls.cc is that n_named_args is initially set to zero in expand_call, so the test argpos < n_named_args yields false for all arguments, and aapcs_layout_arg takes !named as meaning stack. But there's a catch there: on targets in which neither strict_argument_naming nor !pretend_outgoing_varargs_named hold, n_named_args is bumped up to num_actuals, which covers stdarg arguments in pre-c23 cases, but not for TYPE_NO_NAMED_ARGS_STDARG_P. I'm hesitant to modify the generic ABI-affecting code, so I'm going for a more surgical fix for ARM AAPCS only. I suspect we might want yet another targetm predicate to enable the n_named_args overriding block to disregard TYPE_NO_NAMED_ARGS_STDARG_P, and allow all actuals to be passed as if named. for gcc/ChangeLog * config/arm/arm.h (CUMULATIVE_ARGS): Add aapcs_pretend_named. * config/arm/arm.cc (arm_init_cumulative_args): Set it for aapcs no-named-args stdarg functions. (aapcs_layout_arg): Ignore named if aapcs_pretend_named. Diff: --- gcc/config/arm/arm.cc | 9 +++++++-- gcc/config/arm/arm.h | 1 + 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/gcc/config/arm/arm.cc b/gcc/config/arm/arm.cc index 5cb35e8d061..9a49d1df4d9 100644 --- a/gcc/config/arm/arm.cc +++ b/gcc/config/arm/arm.cc @@ -7019,8 +7019,11 @@ aapcs_layout_arg (CUMULATIVE_ARGS *pcum, machine_mode mode, pcum->aapcs_arg_processed = true; /* Special case: if named is false then we are handling an incoming - anonymous argument which is on the stack. */ - if (!named) + anonymous argument which is on the stack, unless + aapcs_pretend_named, in which case we're dealing with a + TYPE_NO_NAMED_ARGS_STDARG_P call and, even if args are !named, we + ought to use available registers first. */ + if (!named && !pcum->aapcs_pretend_named) return; /* Is this a potential co-processor register candidate? */ @@ -7141,6 +7144,8 @@ arm_init_cumulative_args (CUMULATIVE_ARGS *pcum, tree fntype, pcum->aapcs_arg_processed = false; pcum->aapcs_cprc_slot = -1; pcum->can_split = true; + pcum->aapcs_pretend_named = (fntype + && TYPE_NO_NAMED_ARGS_STDARG_P (fntype)); if (pcum->pcs_variant != ARM_PCS_AAPCS) { diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h index a9c2752c0ea..65d2d567686 100644 --- a/gcc/config/arm/arm.h +++ b/gcc/config/arm/arm.h @@ -1702,6 +1702,7 @@ typedef struct unsigned aapcs_vfp_reg_alloc; int aapcs_vfp_rcount; MACHMODE aapcs_vfp_rmode; + bool aapcs_pretend_named; /* Set for TYPE_NO_NAMED_ARGS_STDARG_P. */ } CUMULATIVE_ARGS; #endif
next reply other threads:[~2023-12-02 17:48 UTC|newest] Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top 2023-12-02 17:48 Alexandre Oliva [this message] -- strict thread matches above, loose matches on Subject: below -- 2023-12-14 16:26 Alexandre Oliva 2023-12-14 13:45 Alexandre Oliva 2023-12-14 12:48 Alexandre Oliva 2023-12-12 20:23 Alexandre Oliva 2023-12-12 2:38 Alexandre Oliva 2023-12-06 22:47 Alexandre Oliva 2023-12-06 20:01 Alexandre Oliva 2023-12-06 2:31 Alexandre Oliva 2023-12-05 21:51 Alexandre Oliva 2023-12-05 19:30 Alexandre Oliva 2023-12-03 1:46 Alexandre Oliva 2023-11-23 11:46 Alexandre Oliva 2023-11-19 4:44 Alexandre Oliva 2023-11-18 5:36 Alexandre Oliva
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20231202174843.26A063858296@sourceware.org \ --to=aoliva@gcc.gnu.org \ --cc=gcc-cvs@gcc.gnu.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).