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)] drop va_list from formals if requested
Date: Wed,  6 Apr 2022 15:02:47 +0000 (GMT)	[thread overview]
Message-ID: <20220406150247.BE39C383981B@sourceware.org> (raw)

https://gcc.gnu.org/g:6eb977e04567db1c7acea7b827d467749f437d4e

commit 6eb977e04567db1c7acea7b827d467749f437d4e
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 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;


             reply	other threads:[~2022-04-06 15:02 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-04-06 15:02 Alexandre Oliva [this message]
  -- strict thread matches above, loose matches on Subject: below --
2021-07-10  9:43 Alexandre Oliva
2021-07-10  0:08 Alexandre Oliva
2021-06-28 15:42 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=20220406150247.BE39C383981B@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: link
Be 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).