re PR debug/78835 (ICE with -fdebug-types-section and member function)
authorJakub Jelinek <jakub@redhat.com>
Thu, 26 Jan 2017 21:44:49 +0000 (22:44 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 26 Jan 2017 21:44:49 +0000 (22:44 +0100)
PR debug/78835
* dwarf2out.c (prune_unused_types): Mark all functions with DIEs
which have direct callers with -fvar-tracking-assignments enabled
in the current TU.
(resolve_addr): Avoid adding skeleton DIEs for DW_AT_call_origin
inside of type units.

* g++.dg/debug/dwarf2/pr78835.C: New test.

From-SVN: r244954

gcc/ChangeLog
gcc/dwarf2out.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/debug/dwarf2/pr78835.C [new file with mode: 0644]

index 311e064c3ea54a48b432abfea95c2e0a1b56df05..553cf5ee0642da4f95d7472b107375181ba478ce 100644 (file)
@@ -1,3 +1,12 @@
+2017-01-26  Jakub Jelinek  <jakub@redhat.com>
+
+       PR debug/78835
+       * dwarf2out.c (prune_unused_types): Mark all functions with DIEs
+       which have direct callers with -fvar-tracking-assignments enabled
+       in the current TU.
+       (resolve_addr): Avoid adding skeleton DIEs for DW_AT_call_origin
+       inside of type units.
+
 2017-01-26  Martin Sebor  <msebor@redhat.com>
 
        PR middle-end/78703
index 46565705506dc97389487fa51dfe5a75ebec1ed9..f69c58850f3e2b4ba96762c9f5b34fb2d1be8a07 100644 (file)
@@ -27793,6 +27793,25 @@ prune_unused_types (void)
   for (i = 0; base_types.iterate (i, &base_type); i++)
     prune_unused_types_mark (base_type, 1);
 
+  /* For -fvar-tracking-assignments, also set the mark on nodes that could be
+     referenced by DW_TAG_call_site DW_AT_call_origin (i.e. direct call
+     callees).  */
+  cgraph_node *cnode;
+  FOR_EACH_FUNCTION (cnode)
+    if (cnode->referred_to_p (false))
+      {
+       dw_die_ref die = lookup_decl_die (cnode->decl);
+       if (die == NULL || die->die_mark)
+         continue;
+       for (cgraph_edge *e = cnode->callers; e; e = e->next_caller)
+         if (e->caller != cnode
+             && opt_for_fn (e->caller->decl, flag_var_tracking_assignments))
+           {
+             prune_unused_types_mark (die, 1);
+             break;
+           }
+      }
+
   if (debug_str_hash)
     debug_str_hash->empty ();
   if (skeleton_debug_str_hash)
@@ -28694,16 +28713,27 @@ resolve_addr (dw_die_ref die)
                && DECL_ABSTRACT_ORIGIN (tdecl) == NULL_TREE
                && (cdie = lookup_context_die (DECL_CONTEXT (tdecl))))
              {
-               /* Creating a full DIE for tdecl is overly expensive and
-                  at this point even wrong when in the LTO phase
-                  as it can end up generating new type DIEs we didn't
-                  output and thus optimize_external_refs will crash.  */
-               tdie = new_die (DW_TAG_subprogram, cdie, NULL_TREE);
-               add_AT_flag (tdie, DW_AT_external, 1);
-               add_AT_flag (tdie, DW_AT_declaration, 1);
-               add_linkage_attr (tdie, tdecl);
-               add_name_and_src_coords_attributes (tdie, tdecl);
-               equate_decl_number_to_die (tdecl, tdie);
+               dw_die_ref pdie = cdie;
+               /* Make sure we don't add these DIEs into type units.
+                  We could emit skeleton DIEs for context (namespaces,
+                  outer structs/classes) and a skeleton DIE for the
+                  innermost context with DW_AT_signature pointing to the
+                  type unit.  See PR78835.  */
+               while (pdie && pdie->die_tag != DW_TAG_type_unit)
+                 pdie = pdie->die_parent;
+               if (pdie == NULL)
+                 {
+                   /* Creating a full DIE for tdecl is overly expensive and
+                      at this point even wrong when in the LTO phase
+                      as it can end up generating new type DIEs we didn't
+                      output and thus optimize_external_refs will crash.  */
+                   tdie = new_die (DW_TAG_subprogram, cdie, NULL_TREE);
+                   add_AT_flag (tdie, DW_AT_external, 1);
+                   add_AT_flag (tdie, DW_AT_declaration, 1);
+                   add_linkage_attr (tdie, tdecl);
+                   add_name_and_src_coords_attributes (tdie, tdecl);
+                   equate_decl_number_to_die (tdecl, tdie);
+                 }
              }
            if (tdie)
              {
index a96fb1daa27ec0185a3429e0ee1cbbf666a5070c..bec6f154d4bc5e04bf42ba3c1fb927b24eead634 100644 (file)
@@ -1,3 +1,8 @@
+2017-01-26  Jakub Jelinek  <jakub@redhat.com>
+
+       PR debug/78835
+       * g++.dg/debug/dwarf2/pr78835.C: New test.
+
 2017-01-26  Martin Sebor  <msebor@redhat.com>
 
        PR middle-end/78703
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/pr78835.C b/gcc/testsuite/g++.dg/debug/dwarf2/pr78835.C
new file mode 100644 (file)
index 0000000..0b54639
--- /dev/null
@@ -0,0 +1,11 @@
+/* PR debug/78835 */
+/* { dg-do compile } */
+/* { dg-options "-gdwarf-4 -O2 -fdebug-types-section" } */
+
+struct A { void foo (); };
+
+void
+bar (A &x)
+{
+  x.foo ();
+}