On Thu, 15 Sep 2016, Richard Biener wrote: > > This addresses sth I needed to address with the early LTO debug patches > (you might now figure I'm piecemail merging stuff from that patch). > > When the cgraph code optimizes out a global we call the late_global_decl > debug hook to eventually add a DW_AT_const_value to its DIE (we don't > really expect a location as that will be invalid after optimizing out > and will be pruned). > > With the early LTO debug patches I have introduced a early_dwarf_finished > flag (mainly for consistency checking) and I figured I can use that to > detect the call to the late hook during the early phase and provide > the following cleaned up variant of avoiding to create locations that > require later pruning (which doesn't work with emitting the early DIEs). > > Bootstrapped on x86_64-unknown-linux-gnu, testing in progress. > > I verified it does the correct thing for a unit like > > static const int i = 2; > > (but ISTR we do have at least one testcase in the testsuite as well). > > Will commit if testing finishes successfully.
Ok, so it showed issues when merging that back to early-LTO-debug. Turns out in LTO we never call early_finish and thus early_dwarf_finished was never set. Also dwarf2out_late_global_decl itself is a better place to constrain generating locations. The following variant is in very late stage of testing. Bootstrapped on x86_64-unknown-linux-gnu, testing in progress. LTO bootstrap on x86_64-unknown-linux-gnu in stage3. LTO bootstrap with early-LTO-debug in stage3, bootstraped with early-LTO-debug, testing in progress. Richard. 2016-09-16 Richard Biener <rguent...@suse.de> * dwarf2out.c (early_dwarf_finished): New global. (set_early_dwarf::set_early_dwarf): Assert early_dwarf_finished is false. (dwarf2out_early_finish): Set early_dwarf_finished at the end, if called from LTO exit early. (dwarf2out_late_global_decl): When being during the early debug phase do not add locations but only const value attributes. Adjust the way we generate early DIEs for LTO. lto/ * lto.c (lto_main): Invoke early_finish debug hook. Index: gcc/dwarf2out.c =================================================================== --- gcc/dwarf2out.c (revision 240164) +++ gcc/dwarf2out.c (working copy) @@ -2711,9 +2711,14 @@ die_node; /* Set to TRUE while dwarf2out_early_global_decl is running. */ static bool early_dwarf; +static bool early_dwarf_finished; struct set_early_dwarf { bool saved; - set_early_dwarf () : saved(early_dwarf) { early_dwarf = true; } + set_early_dwarf () : saved(early_dwarf) + { + gcc_assert (! early_dwarf_finished); + early_dwarf = true; + } ~set_early_dwarf () { early_dwarf = saved; } }; @@ -23878,18 +23883,31 @@ dwarf2out_early_global_decl (tree decl) static void dwarf2out_late_global_decl (tree 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. */ + /* Fill-in any location information we were unable to determine + on the first pass. */ if (TREE_CODE (decl) == VAR_DECL && !POINTER_BOUNDS_P (decl)) { dw_die_ref die = lookup_decl_die (decl); + + /* We have to generate early debug late for LTO. */ + if (! die && in_lto_p) + { + dwarf2out_decl (decl); + die = lookup_decl_die (decl); + } + if (die) - add_location_or_const_value_attribute (die, decl, false); + { + /* We get called during the early debug phase via the symtab + code invoking late_global_decl for symbols that are optimized + out. When the early phase is not finished, do not add + locations. */ + if (! early_dwarf_finished) + tree_add_const_value_attribute_for_decl (die, decl); + else + add_location_or_const_value_attribute (die, decl, false); + } } } @@ -28137,6 +28155,14 @@ dwarf2out_early_finish (void) { set_early_dwarf s; + /* With LTO early dwarf was really finished at compile-time, so make + sure to adjust the phase after annotating the LTRANS CU DIE. */ + if (in_lto_p) + { + early_dwarf_finished = true; + return; + } + /* Walk through the list of incomplete types again, trying once more to emit full debugging info for them. */ retry_incomplete_types (); @@ -28163,6 +28189,9 @@ dwarf2out_early_finish (void) } } deferred_asm_name = NULL; + + /* The early debug phase is now finished. */ + early_dwarf_finished = true; } /* Reset all state within dwarf2out.c so that we can rerun the compiler Index: gcc/lto/lto.c =================================================================== --- gcc/lto/lto.c (revision 240164) +++ gcc/lto/lto.c (working copy) @@ -3315,6 +3315,9 @@ lto_main (void) if (!flag_ltrans) lto_promote_statics_nonwpa (); + /* Annotate the CU DIE and mark the early debug phase as finished. */ + debug_hooks->early_finish (); + /* Let the middle end know that we have read and merged all of the input files. */ symtab->compile ();