Don't call targetm.calls.static_chain in non-static function
authorTom de Vries <tom@codesourcery.com>
Wed, 20 Dec 2017 00:46:38 +0000 (00:46 +0000)
committerTom de Vries <vries@gcc.gnu.org>
Wed, 20 Dec 2017 00:46:38 +0000 (00:46 +0000)
2017-12-20  Tom de Vries  <tom@codesourcery.com>

PR middle-end/83423
* config/i386/i386.c (ix86_static_chain): Move DECL_STATIC_CHAIN test ...
* calls.c (rtx_for_static_chain): ... here.  New function.
* calls.h (rtx_for_static_chain): Declare.
* builtins.c (expand_builtin_setjmp_receiver): Use rtx_for_static_chain
instead of targetm.calls.static_chain.
* df-scan.c (df_get_entry_block_def_set): Same.

From-SVN: r255849

gcc/ChangeLog
gcc/builtins.c
gcc/calls.c
gcc/calls.h
gcc/config/i386/i386.c
gcc/df-scan.c

index 7e803a31542f04266d9b890f01e93c551ed0f410..9284a8c07fc375226fd4978d7e0637f13f66e5d8 100644 (file)
@@ -1,3 +1,13 @@
+2017-12-20  Tom de Vries  <tom@codesourcery.com>
+
+       PR middle-end/83423
+       * config/i386/i386.c (ix86_static_chain): Move DECL_STATIC_CHAIN test ...
+       * calls.c (rtx_for_static_chain): ... here.  New function.
+       * calls.h (rtx_for_static_chain): Declare.
+       * builtins.c (expand_builtin_setjmp_receiver): Use rtx_for_static_chain
+       instead of targetm.calls.static_chain.
+       * df-scan.c (df_get_entry_block_def_set): Same.
+
 2017-12-19  Tom de Vries  <tom@codesourcery.com>
 
        PR tree-optimization/83493
index 6bff904d8beeccc60c551a52e53702aea2ef83d8..3e8ea95d729ae17021dae40cda49f4b150b1bd20 100644 (file)
@@ -878,7 +878,7 @@ expand_builtin_setjmp_receiver (rtx receiver_label)
 
   /* Mark the static chain as clobbered here so life information
      doesn't get messed up for it.  */
-  chain = targetm.calls.static_chain (current_function_decl, true);
+  chain = rtx_for_static_chain (current_function_decl, true);
   if (chain && REG_P (chain))
     emit_clobber (chain);
 
index da6c96b8131d9706f5a1c001e7d98ad0cad5e118..6057aa65da0bef49cdb30470eafe25eb1e4f1122 100644 (file)
@@ -2460,6 +2460,17 @@ rtx_for_function_call (tree fndecl, tree addr)
   return funexp;
 }
 
+/* Return the static chain for this function, if any.  */
+
+rtx
+rtx_for_static_chain (const_tree fndecl_or_type, bool incoming_p)
+{
+  if (DECL_P (fndecl_or_type) && !DECL_STATIC_CHAIN (fndecl_or_type))
+    return NULL;
+
+  return targetm.calls.static_chain (fndecl_or_type, incoming_p);
+}
+
 /* Internal state for internal_arg_pointer_based_exp and its helpers.  */
 static struct
 {
index 641166e23a3734fc493461fd04092c5fed8f8c02..1aab140ae7b16f72d44bcc2daec3f8fb5e9918c5 100644 (file)
@@ -41,5 +41,6 @@ extern void maybe_warn_alloc_args_overflow (tree, tree, tree[2], int[2]);
 extern tree get_attr_nonstring_decl (tree, tree * = NULL);
 extern void maybe_warn_nonstring_arg (tree, tree);
 extern bool get_size_range (tree, tree[2], bool = false);
+extern rtx rtx_for_static_chain (const_tree, bool);
 
 #endif // GCC_CALLS_H
index 85988cf2de0d7cee9eff370dff25ce60057310da..48d5640f84ed7c823a2fddc2f951c61ebc9289ef 100644 (file)
@@ -29236,12 +29236,6 @@ ix86_static_chain (const_tree fndecl_or_type, bool incoming_p)
 {
   unsigned regno;
 
-  /* While this function won't be called by the middle-end when a static
-     chain isn't needed, it's also used throughout the backend so it's
-     easiest to keep this check centralized.  */
-  if (DECL_P (fndecl_or_type) && !DECL_STATIC_CHAIN (fndecl_or_type))
-    return NULL;
-
   if (TARGET_64BIT)
     {
       /* We always use R10 in 64-bit mode.  */
index 429dab8a99b4035e83dc93aad7e50c4eb9430fd1..d0addd9e15037aa89fe289c265f1248fa69ccd18 100644 (file)
@@ -34,6 +34,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "regs.h"
 #include "emit-rtl.h"  /* FIXME: Can go away once crtl is moved to rtl.h.  */
 #include "dumpfile.h"
+#include "calls.h"
 
 
 /* The set of hard registers in eliminables[i].from. */
@@ -3518,7 +3519,7 @@ df_get_entry_block_def_set (bitmap entry_block_defs)
 
   /* If the function has an incoming STATIC_CHAIN, it has to show up
      in the entry def set.  */
-  r = targetm.calls.static_chain (current_function_decl, true);
+  r = rtx_for_static_chain (current_function_decl, true);
   if (r && REG_P (r))
     bitmap_set_bit (entry_block_defs, REGNO (r));