diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e29c212303a..2f3f91b4a03 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2016-09-19 Richard Biener + + * 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. + 2016-09-19 Richard Biener PR middle-end/77605 diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 11e011399af..434a2fc8b5a 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -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 diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog index 0744822c20e..c5bd7a07a6e 100644 --- a/gcc/lto/ChangeLog +++ b/gcc/lto/ChangeLog @@ -1,3 +1,7 @@ +2016-09-19 Richard Biener + + * lto.c (lto_main): Invoke early_finish debug hook. + 2016-07-25 Richard Biener * lto.c (compare_tree_sccs_1): Remove streamer_handle_as_builtin_p uses. diff --git a/gcc/lto/lto.c b/gcc/lto/lto.c index 73d1e26be71..c94ed622307 100644 --- a/gcc/lto/lto.c +++ b/gcc/lto/lto.c @@ -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 ();