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/strub)] drop va_list from formals if requested Date: Fri, 6 May 2022 08:02:36 +0000 (GMT) [thread overview] Message-ID: <20220506080236.D14353856241@sourceware.org> (raw) https://gcc.gnu.org/g:dc14bb8d06db69b73e5dfa279db45cdbdf7061df commit dc14bb8d06db69b73e5dfa279db45cdbdf7061df Author: Alexandre Oliva <oliva@adacore.com> Date: Wed Sep 8 19:13:35 2021 -0300 drop va_list from formals if requested I'm working on a feature that involves creating wrappers for some functions, using alternate means to pass variable argument lists to the wrapped versions. The split-out (wrapped) function shouldn't be stdarg, and though comments in m_always_copy_start in ipa_param_adjustments suggested that making it negative would cause variable arguments to be dropped, this was not the case, and AFAICT there was no way to accomplish that. Perhaps there was no such intent implied by the comments, but that sounded like a reasonable plan to me, so I went ahead an implemented it. With this patch, a negative m_always_copy_start drops the variable argument list marker from a cloned function's type, and the stdarg flag from the cloned cfun data structure. for gcc/ChangeLog * ipa-param-manipulation.c (build_adjusted_function_type): Add skip_valist, obey it. (ipa_param_adjustments::build_new_function_type): Take negative m_always_copy_start as skip_valist. (ipa_param_body_adjustmnets::modify_formal_parameters): Likewise. * tree-inline.c (initialize_cfun): Clear stdarg if function type doesn't support it. * ipa-strub.c (pass_ipa_strub::execute): Check that stdarg is dropped from the clone. Diff: --- gcc/ipa-param-manipulation.cc | 15 ++++++++++----- gcc/ipa-strub.cc | 2 ++ gcc/tree-inline.cc | 2 +- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/gcc/ipa-param-manipulation.cc b/gcc/ipa-param-manipulation.cc index 38328c3e8d0..5c2d1eb88da 100644 --- a/gcc/ipa-param-manipulation.cc +++ b/gcc/ipa-param-manipulation.cc @@ -314,14 +314,16 @@ drop_type_attribute_if_params_changed_p (tree name) static tree build_adjusted_function_type (tree orig_type, vec<tree> *new_param_types, bool method2func, bool skip_return, - bool args_modified) + bool skip_valist, bool args_modified) { tree new_arg_types = NULL; if (TYPE_ARG_TYPES (orig_type)) { gcc_checking_assert (new_param_types); - bool last_parm_void = (TREE_VALUE (tree_last (TYPE_ARG_TYPES (orig_type))) - == void_type_node); + bool last_parm_void = (skip_valist + || (TREE_VALUE (tree_last (TYPE_ARG_TYPES + (orig_type))) + == void_type_node)); unsigned len = new_param_types->length (); for (unsigned i = 0; i < len; i++) new_arg_types = tree_cons (NULL_TREE, (*new_param_types)[i], @@ -548,10 +550,11 @@ ipa_param_adjustments::build_new_function_type (tree old_type, || get_original_index (index) != (int)index) modified = true; + bool skip_valist = m_always_copy_start < 0; return build_adjusted_function_type (old_type, new_param_types_p, method2func_p (old_type), m_skip_return, - modified); + skip_valist, modified); } /* Build variant of function decl ORIG_DECL which has no return value if @@ -1571,8 +1574,10 @@ ipa_param_body_adjustments::modify_formal_parameters () through tree_function_versioning, not when modifying function body directly. */ gcc_assert (!m_adjustments || !m_adjustments->m_skip_return); + bool skip_valist = m_adjustments && m_adjustments->m_always_copy_start < 0; tree new_type = build_adjusted_function_type (orig_type, &m_new_types, - m_method2func, false, modified); + m_method2func, false, + skip_valist, modified); TREE_TYPE (m_fndecl) = new_type; DECL_VIRTUAL_P (m_fndecl) = 0; diff --git a/gcc/ipa-strub.cc b/gcc/ipa-strub.cc index 1592e24e2b9..b161a837461 100644 --- a/gcc/ipa-strub.cc +++ b/gcc/ipa-strub.cc @@ -2688,6 +2688,8 @@ pass_ipa_strub::execute (function *) if (onode->calls_comdat_local) nnode->add_to_same_comdat_group (onode); + gcc_checking_assert (!DECL_STRUCT_FUNCTION (nnode->decl)->stdarg); + set_strub_mode_to (onode, STRUB_WRAPPER); set_strub_mode_to (nnode, STRUB_WRAPPED); diff --git a/gcc/tree-inline.cc b/gcc/tree-inline.cc index 29bb758b7bc..467c3b56245 100644 --- a/gcc/tree-inline.cc +++ b/gcc/tree-inline.cc @@ -2820,7 +2820,7 @@ initialize_cfun (tree new_fndecl, tree callee_fndecl, profile_count count) cfun->va_list_fpr_size = src_cfun->va_list_fpr_size; cfun->has_nonlocal_label = src_cfun->has_nonlocal_label; cfun->calls_eh_return = src_cfun->calls_eh_return; - cfun->stdarg = src_cfun->stdarg; + cfun->stdarg = src_cfun->stdarg && stdarg_p (TREE_TYPE (new_fndecl)); cfun->after_inlining = src_cfun->after_inlining; cfun->can_throw_non_call_exceptions = src_cfun->can_throw_non_call_exceptions;
reply other threads:[~2022-05-06 8:02 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
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=20220506080236.D14353856241@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).