Fix fdump-passes
authorTom de Vries <tom@codesourcery.com>
Wed, 15 Apr 2015 18:43:32 +0000 (18:43 +0000)
committerTom de Vries <vries@gcc.gnu.org>
Wed, 15 Apr 2015 18:43:32 +0000 (18:43 +0000)
2015-04-15  Tom de Vries  <tom@codesourcery.com>

PR other/65487
* function.c (push_dummy_function): New function.
(init_dummy_function_start): Use push_dummy_function.
(pop_dummy_function): New function.  Factored out of ...
(expand_dummy_function_end): ... here.
* function.h (push_dummy_function, pop_dummy_function): Declare.
* passes.c (pass_manager::dump_passes): Use push_dummy_function and
pop_dummy_function.
* tree-chkp.c (chkp_gate): Handle cgraph_node::get (cfun->decl) == NULL.

From-SVN: r222129

gcc/ChangeLog
gcc/function.c
gcc/function.h
gcc/passes.c
gcc/tree-chkp.c

index a0f2fe7e2b9b75d7c46c04f0851e1e0e9842b6f4..6fc26196636d7f2babfddf98a6208e3093d2fbb7 100644 (file)
@@ -1,3 +1,15 @@
+2015-04-15  Tom de Vries  <tom@codesourcery.com>
+
+       PR other/65487
+       * function.c (push_dummy_function): New function.
+       (init_dummy_function_start): Use push_dummy_function.
+       (pop_dummy_function): New function.  Factored out of ...
+       (expand_dummy_function_end): ... here.
+       * function.h (push_dummy_function, pop_dummy_function): Declare.
+       * passes.c (pass_manager::dump_passes): Use push_dummy_function and
+       pop_dummy_function.
+       * tree-chkp.c (chkp_gate): Handle cgraph_node::get (cfun->decl) == NULL.
+
 2015-04-15  Jeff Law  <law@redhat.com>
 
        PR rtl-optimization/42522
index cb974bfe83d84451476989b432e50ebbb1fd0c86..7d4df92f40e051fb0ed79872f0276effb7857e08 100644 (file)
@@ -4862,6 +4862,29 @@ prepare_function_start (void)
   frame_pointer_needed = 0;
 }
 
+void
+push_dummy_function (bool with_decl)
+{
+  tree fn_decl, fn_type, fn_result_decl;
+
+  gcc_assert (!in_dummy_function);
+  in_dummy_function = true;
+
+  if (with_decl)
+    {
+      fn_type = build_function_type_list (void_type_node, NULL_TREE);
+      fn_decl = build_decl (UNKNOWN_LOCATION, FUNCTION_DECL, NULL_TREE,
+                           fn_type);
+      fn_result_decl = build_decl (UNKNOWN_LOCATION, RESULT_DECL,
+                                        NULL_TREE, void_type_node);
+      DECL_RESULT (fn_decl) = fn_result_decl;
+    }
+  else
+    fn_decl = NULL_TREE;
+
+  push_struct_function (fn_decl);
+}
+
 /* Initialize the rtl expansion mechanism so that we can do simple things
    like generate sequences.  This is used to provide a context during global
    initialization of some passes.  You must call expand_dummy_function_end
@@ -4870,9 +4893,7 @@ prepare_function_start (void)
 void
 init_dummy_function_start (void)
 {
-  gcc_assert (!in_dummy_function);
-  in_dummy_function = true;
-  push_struct_function (NULL_TREE);
+  push_dummy_function (false);
   prepare_function_start ();
 }
 
@@ -5144,6 +5165,13 @@ expand_function_start (tree subr)
     stack_check_probe_note = emit_note (NOTE_INSN_DELETED);
 }
 \f
+void
+pop_dummy_function (void)
+{
+  pop_cfun ();
+  in_dummy_function = false;
+}
+
 /* Undo the effects of init_dummy_function_start.  */
 void
 expand_dummy_function_end (void)
@@ -5159,8 +5187,7 @@ expand_dummy_function_end (void)
 
   free_after_parsing (cfun);
   free_after_compilation (cfun);
-  pop_cfun ();
-  in_dummy_function = false;
+  pop_dummy_function ();
 }
 
 /* Helper for diddle_return_value.  */
index 363d666d52fb7a28f6f8e2998e7d23cb3f6fd701..fc12f26462105fb9f4baeb307b6ddcdbfded6185 100644 (file)
@@ -896,6 +896,8 @@ extern int get_next_funcdef_no (void);
 extern int get_last_funcdef_no (void);
 extern void allocate_struct_function (tree, bool);
 extern void push_struct_function (tree fndecl);
+extern void push_dummy_function (bool);
+extern void pop_dummy_function (void);
 extern void init_dummy_function_start (void);
 extern void init_function_start (tree);
 extern void stack_protect_epilogue (void);
index beffd3f587a2e963ddad717d85833ab99fc3178c..04ff04247adc45e2005eb36691bb3220508b1610 100644 (file)
@@ -946,32 +946,19 @@ dump_passes (void)
 void
 pass_manager::dump_passes () const
 {
-  struct cgraph_node *n, *node = NULL;
+  push_dummy_function (true);
 
   create_pass_tab ();
 
-  FOR_EACH_FUNCTION (n)
-    if (DECL_STRUCT_FUNCTION (n->decl))
-      {
-       node = n;
-       break;
-      }
-
-  if (!node)
-    return;
-
-  push_cfun (DECL_STRUCT_FUNCTION (node->decl));
-
   dump_pass_list (all_lowering_passes, 1);
   dump_pass_list (all_small_ipa_passes, 1);
   dump_pass_list (all_regular_ipa_passes, 1);
   dump_pass_list (all_late_ipa_passes, 1);
   dump_pass_list (all_passes, 1);
 
-  pop_cfun ();
+  pop_dummy_function ();
 }
 
-
 /* Returns the pass with NAME.  */
 
 static opt_pass *
index 8c5a628a9ad5bf6369ddab20720e1691ce055982..ebb9a836e5e7883567d3d5fb60dccc39ad0d8b98 100644 (file)
@@ -4330,8 +4330,10 @@ chkp_execute (void)
 static bool
 chkp_gate (void)
 {
-  return cgraph_node::get (cfun->decl)->instrumentation_clone
-    || lookup_attribute ("chkp ctor", DECL_ATTRIBUTES (cfun->decl));
+  cgraph_node *node = cgraph_node::get (cfun->decl);
+  return ((node != NULL
+          && node->instrumentation_clone)
+          || lookup_attribute ("chkp ctor", DECL_ATTRIBUTES (cfun->decl)));
 }
 
 namespace {