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;