Commit efe0e6cd by Richard Biener Committed by Richard Biener

re PR debug/86585 (ICE in gen_member_die, at dwarf2out.c:24935)

2018-07-20  Richard Biener  <rguenther@suse.de>

	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
parent 4e51aacb
2018-07-20 Richard Biener <rguenther@suse.de>
PR debug/86585
* dwarf2out.c (dwarf2out_die_ref_for_decl): Test in_lto_p
to cover -flto-partition=none.
2018-07-20 Martin Liska <mliska@suse.cz>
* tree.h (DECL_LOCATION_RANGE): Remove unused macro.
......
......@@ -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)
......
2018-07-20 Richard Biener <rguenther@suse.de>
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 <hubicka@ucw.cz>
* lto.c (do_stream_out): Add PART parameter; open dump file.
......
......@@ -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;
......
2018-07-20 Richard Biener <rguenther@suse.de>
PR debug/86585
* g++.dg/lto/pr86585_0.C: New testcase.
* g++.dg/lto/pr86585_1.C: Likewise.
2018-07-19 Martin Sebor <msebor@redhat.com>
PR tree-optimization/83776
......
// { 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() {}
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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment