]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fix PR debug/101947
authorEric Botcazou <ebotcazou@adacore.com>
Tue, 7 Sep 2021 13:41:49 +0000 (15:41 +0200)
committerEric Botcazou <ebotcazou@adacore.com>
Tue, 7 Sep 2021 13:42:51 +0000 (15:42 +0200)
This is the recent LTO bootstrap failure with Ada enabled.  The compiler now
generates DW_OP_deref_type for a unit of the Ada front-end, which means that
the offset of base types in the CU must be computed during early DWARF too.

gcc/
PR debug/101947
* dwarf2out.c (mark_base_types): New overloaded function.
(dwarf2out_early_finish): Invoke it on the COMDAT type list as well
as the compilation unit, and call move_marked_base_types afterward.

gcc/dwarf2out.c

index 4f100606618674fa3a5cc495fd728d4118e87ea8..fbad269b566716b6b946309771f6421835322f18 100644 (file)
@@ -30295,6 +30295,40 @@ mark_base_types (dw_loc_descr_ref loc)
     }
 }
 
+/* Stripped-down variant of resolve_addr, mark DW_TAG_base_type nodes
+   referenced from typed stack ops and count how often they are used.  */
+
+static void
+mark_base_types (dw_die_ref die)
+{
+  dw_die_ref c;
+  dw_attr_node *a;
+  dw_loc_list_ref *curr;
+  unsigned ix;
+
+  FOR_EACH_VEC_SAFE_ELT (die->die_attr, ix, a)
+    switch (AT_class (a))
+      {
+      case dw_val_class_loc_list:
+       curr = AT_loc_list_ptr (a);
+       while (*curr)
+         {
+           mark_base_types ((*curr)->expr);
+           curr = &(*curr)->dw_loc_next;
+         }
+       break;
+
+      case dw_val_class_loc:
+       mark_base_types (AT_loc (a));
+       break;
+
+      default:
+       break;
+      }
+
+  FOR_EACH_CHILD (die, c, mark_base_types (c));
+}
+
 /* Comparison function for sorting marked base types.  */
 
 static int
@@ -32697,6 +32731,7 @@ ctf_debug_do_cu (dw_die_ref die)
 static void
 dwarf2out_early_finish (const char *filename)
 {
+  comdat_type_node *ctnode;
   set_early_dwarf s;
   char dl_section_ref[MAX_ARTIFICIAL_LABEL_BYTES];
 
@@ -32776,8 +32811,7 @@ dwarf2out_early_finish (const char *filename)
       /* For each new comdat type unit, copy declarations for incomplete
          types to make the new unit self-contained (i.e., no direct
          references to the main compile unit).  */
-      for (comdat_type_node *ctnode = comdat_type_list;
-          ctnode != NULL; ctnode = ctnode->next)
+      for (ctnode = comdat_type_list; ctnode != NULL; ctnode = ctnode->next)
         copy_decls_for_unworthy_types (ctnode->root_die);
       copy_decls_for_unworthy_types (comp_unit_die ());
 
@@ -32792,8 +32826,7 @@ dwarf2out_early_finish (const char *filename)
   note_variable_value (comp_unit_die ());
   for (limbo_die_node *node = cu_die_list; node; node = node->next)
     note_variable_value (node->die);
-  for (comdat_type_node *ctnode = comdat_type_list; ctnode != NULL;
-       ctnode = ctnode->next)
+  for (ctnode = comdat_type_list; ctnode != NULL; ctnode = ctnode->next)
     note_variable_value (ctnode->root_die);
   for (limbo_die_node *node = limbo_die_list; node; node = node->next)
     note_variable_value (node->die);
@@ -32845,13 +32878,17 @@ dwarf2out_early_finish (const char *filename)
      location related output removed and some LTO specific changes.
      Some refactoring might make both smaller and easier to match up.  */
 
+  for (ctnode = comdat_type_list; ctnode != NULL; ctnode = ctnode->next)
+    mark_base_types (ctnode->root_die);
+  mark_base_types (comp_unit_die ());
+  move_marked_base_types ();
+
   /* Traverse the DIE's and add sibling attributes to those DIE's
      that have children.  */
   add_sibling_attributes (comp_unit_die ());
   for (limbo_die_node *node = limbo_die_list; node; node = node->next)
     add_sibling_attributes (node->die);
-  for (comdat_type_node *ctnode = comdat_type_list;
-       ctnode != NULL; ctnode = ctnode->next)
+  for (ctnode = comdat_type_list; ctnode != NULL; ctnode = ctnode->next)
     add_sibling_attributes (ctnode->root_die);
 
   /* AIX Assembler inserts the length, so adjust the reference to match the
@@ -32881,8 +32918,7 @@ dwarf2out_early_finish (const char *filename)
     output_comp_unit (node->die, 0, NULL);
 
   hash_table<comdat_type_hasher> comdat_type_table (100);
-  for (comdat_type_node *ctnode = comdat_type_list;
-       ctnode != NULL; ctnode = ctnode->next)
+  for (ctnode = comdat_type_list; ctnode != NULL; ctnode = ctnode->next)
     {
       comdat_type_node **slot = comdat_type_table.find_slot (ctnode, INSERT);