From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2140) id BFDE23856DFE; Fri, 6 May 2022 08:38:09 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org BFDE23856DFE Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Alexandre Oliva To: gcc-cvs@gcc.gnu.org Subject: [gcc(refs/users/aoliva/heads/hard12)] drop va_list from formals if requested X-Act-Checkin: gcc X-Git-Author: Alexandre Oliva X-Git-Refname: refs/users/aoliva/heads/hard12 X-Git-Oldrev: 7a397cc6c732823c11780429f955636472fdcdb4 X-Git-Newrev: d4a50d2d8d14f34d78879bef61841f21f4916224 Message-Id: <20220506083809.BFDE23856DFE@sourceware.org> Date: Fri, 6 May 2022 08:38:09 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 06 May 2022 08:38:09 -0000 https://gcc.gnu.org/g:d4a50d2d8d14f34d78879bef61841f21f4916224 commit d4a50d2d8d14f34d78879bef61841f21f4916224 Author: Alexandre Oliva Date: Fri May 6 05:34:55 2022 -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 *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 ca66a8266b1..28928ec2c86 100644 --- a/gcc/tree-inline.cc +++ b/gcc/tree-inline.cc @@ -2822,7 +2822,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;