re PR bootstrap/66448 (Bootstrap fails on darwin after r224161)
authorAldy Hernandez <aldyh@redhat.com>
Thu, 11 Jun 2015 20:46:46 +0000 (20:46 +0000)
committerAldy Hernandez <aldyh@gcc.gnu.org>
Thu, 11 Jun 2015 20:46:46 +0000 (20:46 +0000)
PR bootstrap/66448
* dwarf2out.c (check_die): Check for common duplicate attributes.
(add_location_or_const_value_attribute): Do not add duplicate
attributes.
(gen_formal_parameter_die): Do not add DW_AT_artificial the second
time around.
(gen_struct_or_union_type_die): Bail early if TREE_ASM_WRITTEN.
(gen_type_die_with_usage): Call check_die.
(dwarf2out_decl): Only call check_die() when ENABLE_CHECKING.

From-SVN: r224393

gcc/ChangeLog
gcc/dwarf2out.c

index 57900cebcc2bbb13ce6e9ba3489893724ba10f74..fcfa033f18c448c1f4dc32e5155efe2e08074658 100644 (file)
@@ -1,3 +1,15 @@
+2015-06-11  Aldy Hernandez  <aldyh@redhat.com>
+
+       PR bootstrap/66448
+       * dwarf2out.c (check_die): Check for common duplicate attributes.
+       (add_location_or_const_value_attribute): Do not add duplicate
+       attributes.
+       (gen_formal_parameter_die): Do not add DW_AT_artificial the second
+       time around.
+       (gen_struct_or_union_type_die): Bail early if TREE_ASM_WRITTEN.
+       (gen_type_die_with_usage): Call check_die.
+       (dwarf2out_decl): Only call check_die() when ENABLE_CHECKING.
+
 2015-06-11  Jason Merrill  <jason@redhat.com>
 
        * dwarf2out.c (prune_unused_types): Handle unused top-level limbo
index 3a92b02560cd86d5a4802f0dbb69f83475adf8d9..92fa340a3721b707e5072d1bd38aded4e3222cde 100644 (file)
@@ -5692,20 +5692,55 @@ debug_dwarf (void)
 static void
 check_die (dw_die_ref die)
 {
-  /* A debugging information entry that is a member of an abstract
-     instance tree [that has DW_AT_inline] should not contain any
-     attributes which describe aspects of the subroutine which vary
-     between distinct inlined expansions or distinct out-of-line
-     expansions.  */
   unsigned ix;
   dw_attr_ref a;
   bool inline_found = false;
+  int n_location = 0, n_low_pc = 0, n_high_pc = 0, n_artificial = 0;
+  int n_decl_line = 0, n_decl_file = 0;
   FOR_EACH_VEC_SAFE_ELT (die->die_attr, ix, a)
-    if (a->dw_attr == DW_AT_inline && a->dw_attr_val.v.val_unsigned)
-      inline_found = true;
+    {
+      switch (a->dw_attr)
+       {
+       case DW_AT_inline:
+         if (a->dw_attr_val.v.val_unsigned)
+           inline_found = true;
+         break;
+       case DW_AT_location:
+         ++n_location;
+         break;
+       case DW_AT_low_pc:
+         ++n_low_pc;
+         break;
+       case DW_AT_high_pc:
+         ++n_high_pc;
+         break;
+       case DW_AT_artificial:
+         ++n_artificial;
+         break;
+       case DW_AT_decl_line:
+         ++n_decl_line;
+         break;
+       case DW_AT_decl_file:
+         ++n_decl_file;
+         break;
+       default:
+         break;
+       }
+    }
+  if (n_location > 1 || n_low_pc > 1 || n_high_pc > 1 || n_artificial > 1
+      || n_decl_line > 1 || n_decl_file > 1)
+    {
+      fprintf (stderr, "Duplicate attributes in DIE:\n");
+      debug_dwarf_die (die);
+      gcc_unreachable ();
+    }
   if (inline_found)
     {
-      /* Catch the most common mistakes.  */
+      /* A debugging information entry that is a member of an abstract
+        instance tree [that has DW_AT_inline] should not contain any
+        attributes which describe aspects of the subroutine which vary
+        between distinct inlined expansions or distinct out-of-line
+        expansions.  */
       FOR_EACH_VEC_SAFE_ELT (die->die_attr, ix, a)
        gcc_assert (a->dw_attr != DW_AT_low_pc
                    && a->dw_attr != DW_AT_high_pc
@@ -16097,6 +16132,9 @@ add_location_or_const_value_attribute (dw_die_ref die, tree decl, bool cache_p,
   if (TREE_CODE (decl) == ERROR_MARK)
     return false;
 
+  if (get_AT (die, attr))
+    return true;
+
   gcc_assert (TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == PARM_DECL
              || TREE_CODE (decl) == RESULT_DECL);
 
@@ -18057,10 +18095,9 @@ gen_formal_parameter_die (tree node, tree origin, bool emit_name_p,
                                decl_quals (node_or_origin),
                                context_die);
        }
-    add_location:
       if (origin == NULL && DECL_ARTIFICIAL (node))
        add_AT_flag (parm_die, DW_AT_artificial, 1);
-
+    add_location:
       if (node && node != origin)
         equate_decl_number_to_die (node, parm_die);
       if (! DECL_ABSTRACT_P (node_or_origin))
@@ -20356,15 +20393,15 @@ static void
 gen_struct_or_union_type_die (tree type, dw_die_ref context_die,
                                enum debug_info_usage usage)
 {
-  /* Fill in the bound of variable-length fields in late dwarf if
-     still incomplete.  */
-  if (TREE_ASM_WRITTEN (type)
-      && variably_modified_type_p (type, NULL)
-      && !early_dwarf)
+  if (TREE_ASM_WRITTEN (type))
     {
-      tree member;
-      for (member = TYPE_FIELDS (type); member; member = DECL_CHAIN (member))
-       fill_variable_array_bounds (TREE_TYPE (member));
+      /* Fill in the bound of variable-length fields in late dwarf if
+        still incomplete.  */
+      if (!early_dwarf && variably_modified_type_p (type, NULL))
+       for (tree member = TYPE_FIELDS (type);
+            member;
+            member = DECL_CHAIN (member))
+         fill_variable_array_bounds (TREE_TYPE (member));
       return;
     }
 
@@ -20844,7 +20881,15 @@ gen_type_die_with_usage (tree type, dw_die_ref context_die,
 static void
 gen_type_die (tree type, dw_die_ref context_die)
 {
-  gen_type_die_with_usage (type, context_die, DINFO_USAGE_DIR_USE);
+  if (type != error_mark_node)
+    {
+      gen_type_die_with_usage (type, context_die, DINFO_USAGE_DIR_USE);
+#ifdef ENABLE_CHECKING
+      dw_die_ref die = lookup_type_die (type);
+      if (die)
+       check_die (die);
+#endif
+    }
 }
 
 /* Generate a DW_TAG_lexical_block DIE followed by DIEs to represent all of the
@@ -21876,9 +21921,11 @@ dwarf2out_decl (tree decl)
 
   gen_decl_die (decl, NULL, context_die);
 
+#ifdef ENABLE_CHECKING
   dw_die_ref die = lookup_decl_die (decl);
   if (die)
     check_die (die);
+#endif
 }
 
 /* Write the debugging output for DECL.  */