Commit 5ee41782 by Richard Biener Committed by Richard Biener

re PR debug/87295 ([early debug] ICE with -ffat-lto-objects -fdebug-types-section -g)

2019-01-29  Richard Biener  <rguenther@suse.de>

	PR debug/87295
	* dwarf2out.c (collect_skeleton_dies): New helper.
	(copy_decls_for_unworthy_types): Call it.
	(build_abbrev_table): Assert we do not try to replace
	DW_AT_signature refs with local refs.

	* g++.dg/lto/pr87295_0.C: New testcase.

From-SVN: r268361
parent 57f0d303
2019-01-29 Richard Biener <rguenther@suse.de>
PR debug/87295
* dwarf2out.c (collect_skeleton_dies): New helper.
(copy_decls_for_unworthy_types): Call it.
(build_abbrev_table): Assert we do not try to replace
DW_AT_signature refs with local refs.
2019-01-28 Jakub Jelinek <jakub@redhat.com>
PR middle-end/89002
......
......@@ -8722,6 +8722,33 @@ copy_decls_walk (dw_die_ref unit, dw_die_ref die, decl_hash_type *decl_table)
FOR_EACH_CHILD (die, c, copy_decls_walk (unit, c, decl_table));
}
/* Collect skeleton dies in DIE created by break_out_comdat_types already
and record them in DECL_TABLE. */
static void
collect_skeleton_dies (dw_die_ref die, decl_hash_type *decl_table)
{
dw_die_ref c;
if (dw_attr_node *a = get_AT (die, DW_AT_signature))
{
dw_die_ref targ = AT_ref (a);
gcc_assert (targ->die_mark == 0 && targ->comdat_type_p);
decl_table_entry **slot
= decl_table->find_slot_with_hash (targ,
htab_hash_pointer (targ),
INSERT);
gcc_assert (*slot == HTAB_EMPTY_ENTRY);
/* Record in DECL_TABLE that TARG has been already copied
by remove_child_or_replace_with_skeleton. */
decl_table_entry *entry = XCNEW (struct decl_table_entry);
entry->orig = targ;
entry->copy = die;
*slot = entry;
}
FOR_EACH_CHILD (die, c, collect_skeleton_dies (c, decl_table));
}
/* Copy declarations for "unworthy" types into the new comdat section.
Incomplete types, modified types, and certain other types aren't broken
out into comdat sections of their own, so they don't have a signature,
......@@ -8733,6 +8760,7 @@ copy_decls_for_unworthy_types (dw_die_ref unit)
{
mark_dies (unit);
decl_hash_type decl_table (10);
collect_skeleton_dies (unit, &decl_table);
copy_decls_walk (unit, unit, &decl_table);
unmark_dies (unit);
}
......@@ -9029,7 +9057,10 @@ build_abbrev_table (dw_die_ref die, external_ref_hash_type *extern_map)
if (is_type_die (c)
&& (ref_p = lookup_external_ref (extern_map, c))
&& ref_p->stub && ref_p->stub != die)
change_AT_die_ref (a, ref_p->stub);
{
gcc_assert (a->dw_attr != DW_AT_signature);
change_AT_die_ref (a, ref_p->stub);
}
else
/* We aren't changing this reference, so mark it external. */
set_AT_ref_external (a, 1);
......
2019-01-29 Richard Biener <rguenther@suse.de>
PR debug/87295
* g++.dg/lto/pr87295_0.C: New testcase.
2019-01-29 Jakub Jelinek <jakub@redhat.com>
PR c/89045
......
// { dg-lto-do assemble }
// { dg-lto-options { { -flto -ffat-lto-objects -fdebug-types-section -g -std=gnu++17 } } }
template<typename _Tp, _Tp __v>
struct integral_constant
{
static constexpr _Tp value = __v;
typedef _Tp value_type;
constexpr operator value_type() const noexcept { return value; }
};
typedef integral_constant<bool, false> false_type;
template<typename...>
struct __or_;
template<>
struct __or_<>
: public false_type
{ };
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