From efe0e6cd21477033d1b62343f61fefa0fc4ea6d1 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Fri, 20 Jul 2018 11:13:47 +0000 Subject: [PATCH] re PR debug/86585 (ICE in gen_member_die, at dwarf2out.c:24935) 2018-07-20 Richard Biener PR debug/86585 * dwarf2out.c (dwarf2out_die_ref_for_decl): Test in_lto_p to cover -flto-partition=none. lto/ * lto.c (unify_scc): Before we throw away an SCC see if we can amend prevailing single-entry SCC with debug refs. * g++.dg/lto/pr86585_0.C: New testcase. * g++.dg/lto/pr86585_1.C: Likewise. From-SVN: r262901 --- gcc/ChangeLog | 6 ++++++ gcc/dwarf2out.c | 6 ++---- gcc/lto/ChangeLog | 6 ++++++ gcc/lto/lto.c | 19 ++++++++++++++++++- gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/g++.dg/lto/pr86585_0.C | 18 ++++++++++++++++++ gcc/testsuite/g++.dg/lto/pr86585_1.C | 24 ++++++++++++++++++++++++ 7 files changed, 80 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/g++.dg/lto/pr86585_0.C create mode 100644 gcc/testsuite/g++.dg/lto/pr86585_1.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index eed62bd865d..b21ded86fb4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2018-07-20 Richard Biener + + PR debug/86585 + * dwarf2out.c (dwarf2out_die_ref_for_decl): Test in_lto_p + to cover -flto-partition=none. + 2018-07-20 Martin Liska * tree.h (DECL_LOCATION_RANGE): Remove unused macro. diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index bd45e0b0685..8377cbc5dd1 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -5851,8 +5851,7 @@ dwarf2out_die_ref_for_decl (tree decl, const char **sym, { dw_die_ref die; - if ((flag_wpa || flag_incremental_link == INCREMENTAL_LINK_LTO) - && !decl_die_table) + if (in_lto_p && !decl_die_table) return false; if (TREE_CODE (decl) == BLOCK) @@ -5865,8 +5864,7 @@ dwarf2out_die_ref_for_decl (tree decl, const char **sym, /* During WPA stage and incremental linking we currently use DIEs to store the decl <-> label + offset map. That's quite inefficient but it works for now. */ - if (flag_wpa - || flag_incremental_link == INCREMENTAL_LINK_LTO) + if (in_lto_p) { dw_die_ref ref = get_AT_ref (die, DW_AT_abstract_origin); if (!ref) diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog index 91e8647d42a..209a8389764 100644 --- a/gcc/lto/ChangeLog +++ b/gcc/lto/ChangeLog @@ -1,3 +1,9 @@ +2018-07-20 Richard Biener + + PR debug/86585 + * lto.c (unify_scc): Before we throw away an SCC see if we + can amend prevailing single-entry SCC with debug refs. + 2018-07-13 Jan Hubicka * lto.c (do_stream_out): Add PART parameter; open dump file. diff --git a/gcc/lto/lto.c b/gcc/lto/lto.c index d1add15efeb..8db280ecefc 100644 --- a/gcc/lto/lto.c +++ b/gcc/lto/lto.c @@ -1638,6 +1638,21 @@ unify_scc (struct data_in *data_in, unsigned from, to the tree node mapping computed by compare_tree_sccs. */ if (len == 1) { + /* If we got a debug reference queued, see if the prevailing + tree has a debug reference and if not, register the one + for the tree we are about to throw away. */ + if (dref_queue.length () == 1) + { + dref_entry e = dref_queue.pop (); + gcc_assert (e.decl + == streamer_tree_cache_get_tree (cache, from)); + const char *sym; + unsigned HOST_WIDE_INT off; + if (!debug_hooks->die_ref_for_decl (pscc->entries[0], &sym, + &off)) + debug_hooks->register_external_die (pscc->entries[0], + e.sym, e.off); + } lto_maybe_register_decl (data_in, pscc->entries[0], from); streamer_tree_cache_replace_tree (cache, pscc->entries[0], from); } @@ -1669,7 +1684,9 @@ unify_scc (struct data_in *data_in, unsigned from, free_node (scc->entries[i]); } - /* Drop DIE references. */ + /* Drop DIE references. + ??? Do as in the size-one SCC case which involves sorting + the queue. */ dref_queue.truncate (0); break; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8eccef11066..10c547c7d14 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2018-07-20 Richard Biener + + PR debug/86585 + * g++.dg/lto/pr86585_0.C: New testcase. + * g++.dg/lto/pr86585_1.C: Likewise. + 2018-07-19 Martin Sebor PR tree-optimization/83776 diff --git a/gcc/testsuite/g++.dg/lto/pr86585_0.C b/gcc/testsuite/g++.dg/lto/pr86585_0.C new file mode 100644 index 00000000000..2c3ae9da414 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/pr86585_0.C @@ -0,0 +1,18 @@ +// { dg-lto-do link } +// { dg-require-effective-target fpic } +// { dg-require-effective-target shared } +// { dg-lto-options { { -flto -g -nostdlib -shared -fPIC } } } +namespace Inkscape { + class a; +} +class b { + Inkscape::a *c; + virtual void d(); +}; +class e { + b f; +}; +class g : e { + void h(); +}; +void g::h() {} diff --git a/gcc/testsuite/g++.dg/lto/pr86585_1.C b/gcc/testsuite/g++.dg/lto/pr86585_1.C new file mode 100644 index 00000000000..ebcbe126768 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/pr86585_1.C @@ -0,0 +1,24 @@ +struct a { + struct b { + b(); + } c; +}; +class d { + a e; +}; +namespace aa { + class h {}; +} // namespace aa +class k { + typedef aa::h f; + f g; +}; +namespace Inkscape { + class l { + k i; +class : d { + } j; + l(); + }; + l::l() {} +} // namespace Inkscape -- 2.30.2