re PR debug/87295 ([early debug] ICE with -ffat-lto-objects -fdebug-types-section -g)
authorRichard Biener <rguenther@suse.de>
Tue, 29 Jan 2019 08:12:02 +0000 (08:12 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 29 Jan 2019 08:12:02 +0000 (08:12 +0000)
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

gcc/ChangeLog
gcc/dwarf2out.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/lto/pr87295_0.C [new file with mode: 0644]

index f5872dbeab7c2c24fe3172a30d87f21ffa6d78b8..9a3d7d5ce7c694bf8b6703b526bec989b10df0ba 100644 (file)
@@ -1,3 +1,11 @@
+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
index 0072270b623ced9129fa6ad17cd8330c24c8cbab..c2a590148b4e7e90d8242e3c54cf34571804ff3c 100644 (file)
@@ -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);
index 9798783152e588b21460053367d2ae21baa17c63..e03b37e0d828255513bba805658f8e141dfcaaba 100644 (file)
@@ -1,3 +1,8 @@
+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
diff --git a/gcc/testsuite/g++.dg/lto/pr87295_0.C b/gcc/testsuite/g++.dg/lto/pr87295_0.C
new file mode 100644 (file)
index 0000000..a063b23
--- /dev/null
@@ -0,0 +1,20 @@
+// { 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
+{ };