[debug-early] Fill in array bounds for variable-length typedefs
diff mbox

Message ID 55142B1C.4030101@redhat.com
State New
Headers show

Commit Message

Aldy Hernandez March 26, 2015, 3:51 p.m. UTC
The following GDB test is failing because typedef's are being marked as 
completed after their type DIEs are generated in early debug:

	FAIL: gdb.base/vla-ptr.exp: print td_vla

We need to revisit the partially created DIE in late debug and fill in 
the bound information when available.  We were already doing this for 
variable-length arrays, but not for the variable-length arrays within a 
typedef.

Fixed thus.  Committed to mainline.  One more gdb regression down.

Oh yeah, I also abstracted some of the common code out.

Aldy
commit 826cf908f550484c0b3d972668a0a98fcf6c659b
Author: Aldy Hernandez <aldyh@redhat.com>
Date:   Thu Mar 26 08:47:34 2015 -0700

    Fill in array bounds for variable-length typedefs.

Patch
diff mbox

diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 4bc945f..1928846 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -17623,6 +17623,26 @@  decl_start_label (tree decl)
 }
 #endif
 
+/* For variable-length arrays that have been previously generated, but
+   may be incomplete due to missing subscript info, fill the subscript
+   info.  Return TRUE if this is one of those cases.  */
+static bool
+fill_variable_array_bounds (tree type)
+{
+  if (TREE_ASM_WRITTEN (type)
+      && TREE_CODE (type) == ARRAY_TYPE
+      && TYPE_SIZE (type)
+      && TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
+    {
+      dw_die_ref array_die = lookup_type_die (type);
+      if (!array_die)
+	return false;
+      add_subscript_info (array_die, type, !is_ada ());
+      return true;
+    }
+  return false;
+}
+
 /* These routines generate the internal representation of the DIE's for
    the compilation unit.  Debugging information is collected by walking
    the declaration trees passed in from dwarf2out_decl().  */
@@ -17644,22 +17664,8 @@  gen_array_type_die (tree type, dw_die_ref context_die)
 
   bool collapse_nested_arrays = !is_ada ();
 
-  /* For variable-length arrays that have been previously generated,
-     just fill in the possibly missing subscript info.  */
-  if (TREE_ASM_WRITTEN (type)
-      && TREE_CODE (type) == ARRAY_TYPE
-      && TYPE_SIZE (type)
-      && TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
-    {
-      array_die = lookup_type_die (type);
-      gcc_assert (array_die);
-      /* We could avoid calling add_subscript_info if
-	 DW_AT_{upper,lower}_bound is already present, though it's
-	 probably not worth it since we'll have to recurse through the
-	 DW_TAG_subrange_type anyhow.  */
-      add_subscript_info (array_die, type, collapse_nested_arrays);
-      return;
-    }
+  if (fill_variable_array_bounds (type))
+    return;
 
   dw_die_ref scope_die = scope_die_for (type, context_die);
   tree element_type;
@@ -20583,7 +20589,11 @@  gen_typedef_die (tree decl, dw_die_ref context_die)
   tree origin;
 
   if (TREE_ASM_WRITTEN (decl))
-    return;
+    {
+      if (DECL_ORIGINAL_TYPE (decl))
+	fill_variable_array_bounds (DECL_ORIGINAL_TYPE (decl));
+      return;
+    }
 
   TREE_ASM_WRITTEN (decl) = 1;
   type_die = new_die (DW_TAG_typedef, context_die, decl);