On 09/26/14 01:29, Richard Biener wrote:

So - please try dropping push_cfun as you set current_function_decl
anyway.

Excellent.  Thanks for the clean-up suggestion.

I am also including a small fix to squelch a use-before-def problem.

Committing to branch.  Whine if in violent opposition.
Aldy
commit 7d371b0f69b8ff74a6fd17773dd5fde80687a698
Author: Aldy Hernandez <al...@redhat.com>
Date:   Fri Sep 26 08:24:38 2014 -0700

        * dwarf2out.c (dwarf2out_early_global_decl): Do not set cfun.
        (gen_variable_die): Set origin_die before we exit early.

diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 26997b8..339e547 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -19057,6 +19057,7 @@ gen_variable_die (tree decl, tree origin, dw_die_ref 
context_die)
       gcc_assert (old_die->die_parent == context_die);
       var_die = old_die;
       old_die = NULL;
+      origin_die = NULL;
       goto gen_variable_die_location;
     }
 
@@ -20879,40 +20880,26 @@ dwarf2out_early_global_decl (tree decl)
   bool save = symtab->global_info_ready;
   symtab->global_info_ready = true;
 
-  bool fndecl_was_null = false;
   /* We don't handle TYPE_DECLs.  If required, they'll be reached via
      other DECLs and they can point to template types or other things
      that dwarf2out can't handle when done via dwarf2out_decl.  */
   if (TREE_CODE (decl) != TYPE_DECL
       && TREE_CODE (decl) != PARM_DECL)
     {
+      tree save_fndecl = current_function_decl;
       if (TREE_CODE (decl) == FUNCTION_DECL)
        {
-         /* A missing cfun means the symbol is unused and was removed
-            from the callgraph.  */
+         /* A missing cfun means the symbol is unused.  */
          if (!DECL_STRUCT_FUNCTION (decl))
            goto early_decl_exit;
 
-         if (current_function_decl)
-           push_cfun (DECL_STRUCT_FUNCTION (decl));
-         else
-           {
-             set_cfun (DECL_STRUCT_FUNCTION (decl));
-             fndecl_was_null = true;
-           }
          current_function_decl = decl;
        }
       dw_die_ref die = dwarf2out_decl (decl);
       if (die)
        die->dumped_early = true;
       if (TREE_CODE (decl) == FUNCTION_DECL)
-       {
-         if (fndecl_was_null)
-           set_cfun (NULL);
-         else
-           pop_cfun ();
-         current_function_decl = NULL;
-       }
+       current_function_decl = save_fndecl;
     }
  early_decl_exit:
   symtab->global_info_ready = save;

Reply via email to