This makes dwarf2out_late_global_decl only do late work, namely add location/value attributes. For current LTO we need to make it do early_global_decl as well (with LTO early debug this will be conditionalized on !flag_lto_early_debug).
Bootstrapped and tested on x86_64-unknown-linux-gnu and verified there are no regressions with the gdb testsuite. This depends on the C++ PCH mangling patch. If there are no further comments (and the mangling patch is approved) then I plan to commit it. I am working on a similar patch for dwarf2out_function_decl right now. (just noticed we have a 2nd dwarf maintainer, CCed now) Richard. 2015-09-16 Richard Biener <rguent...@suse.de> * passes.c (rest_of_decl_compilation): Always call early_global_decl debug hook when we created a varpool node. * dwarf2out.c (dwarf2out_late_global_decl): When in LTO call dwarf2out_early_global_decl, when not just add location or value attributes to existing DIEs. Index: gcc/passes.c =================================================================== --- gcc/passes.c (revision 227779) +++ gcc/passes.c (working copy) @@ -318,7 +318,17 @@ rest_of_decl_compilation (tree decl, && !decl_function_context (decl) && !current_function_decl && DECL_SOURCE_LOCATION (decl) != BUILTINS_LOCATION - && !decl_type_context (decl) + && (!decl_type_context (decl) + /* If we created a varpool node for the decl make sure to + call early_global_decl. Otherwise we miss changes + introduced by member definitions like + struct A { static int staticdatamember; }; + int A::staticdatamember; + and thus have incomplete early debug and late debug + called from varpool node removal fails to handle it + properly. */ + || (TREE_CODE (decl) == VAR_DECL + && TREE_STATIC (decl) && !DECL_EXTERNAL (decl))) /* Avoid confusing the debug information machinery when there are errors. */ && !seen_error ()) Index: gcc/dwarf2out.c =================================================================== --- gcc/dwarf2out.c (revision 227779) +++ gcc/dwarf2out.c (working copy) @@ -21626,14 +21626,20 @@ dwarf2out_early_global_decl (tree decl) static void dwarf2out_late_global_decl (tree decl) { - /* Output any global decls we missed or fill-in any location - information we were unable to determine on the first pass. - - Skip over functions because they were handled by the - debug_hooks->function_decl() call in rest_of_handle_final. */ - if ((TREE_CODE (decl) != FUNCTION_DECL || !DECL_INITIAL (decl)) + /* We have to generate early debug late for LTO. */ + if (in_lto_p) + dwarf2out_early_global_decl (decl); + + /* Fill-in any location information we were unable to determine + on the first pass. */ + if (TREE_CODE (decl) == VAR_DECL && !POINTER_BOUNDS_P (decl)) - dwarf2out_decl (decl); + { + dw_die_ref die = lookup_decl_die (decl); + if (die) + add_location_or_const_value_attribute (die, decl, false, + DW_AT_location); + } } /* Output debug information for type decl DECL. Called from toplev.c