PR debug/43237
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 3 Mar 2010 07:02:37 +0000 (07:02 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 3 Mar 2010 07:02:37 +0000 (07:02 +0000)
* dwarf2out.c (add_bound_info): If a decl bound doesn't have decl_die,
fallthrough to default handling, just with want_address 0 instead of 2.
For single element lists, add_AT_loc directly, otherwise create an
artificial variable DIE and stick location list to it.

* gcc.dg/debug/dwarf2/pr43237.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@157190 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/dwarf2out.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/debug/dwarf2/pr43237.c [new file with mode: 0644]

index 3e9a644..e31d206 100644 (file)
@@ -1,5 +1,11 @@
 2010-03-03  Jakub Jelinek  <jakub@redhat.com>
 
+       PR debug/43237
+       * dwarf2out.c (add_bound_info): If a decl bound doesn't have decl_die,
+       fallthrough to default handling, just with want_address 0 instead of 2.
+       For single element lists, add_AT_loc directly, otherwise create an
+       artificial variable DIE and stick location list to it.
+
        PR debug/43177
        * var-tracking.c (loc_cmp): Don't assert VALUEs have the same mode.
        (VAL_EXPR_HAS_REVERSE): Define.
index 2e8712f..2595119 100644 (file)
@@ -16275,6 +16275,8 @@ add_comp_dir_attribute (dw_die_ref die)
 static void
 add_bound_info (dw_die_ref subrange_die, enum dwarf_attribute bound_attr, tree bound)
 {
+  int want_address = 2;
+
   switch (TREE_CODE (bound))
     {
     case ERROR_MARK:
@@ -16324,7 +16326,6 @@ add_bound_info (dw_die_ref subrange_die, enum dwarf_attribute bound_attr, tree b
     case RESULT_DECL:
       {
        dw_die_ref decl_die = lookup_decl_die (bound);
-       dw_loc_list_ref loc;
 
        /* ??? Can this happen, or should the variable have been bound
           first?  Probably it can, since I imagine that we try to create
@@ -16332,14 +16333,13 @@ add_bound_info (dw_die_ref subrange_die, enum dwarf_attribute bound_attr, tree b
           the list, and won't have created a forward reference to a
           later parameter.  */
        if (decl_die != NULL)
-         add_AT_die_ref (subrange_die, bound_attr, decl_die);
-       else
          {
-           loc = loc_list_from_tree (bound, 0);
-           add_AT_location_description (subrange_die, bound_attr, loc);
+           add_AT_die_ref (subrange_die, bound_attr, decl_die);
+           break;
          }
-       break;
+       want_address = 0;
       }
+      /* FALLTHRU */
 
     default:
       {
@@ -16349,10 +16349,16 @@ add_bound_info (dw_die_ref subrange_die, enum dwarf_attribute bound_attr, tree b
        dw_die_ref ctx, decl_die;
        dw_loc_list_ref list;
 
-       list = loc_list_from_tree (bound, 2);
+       list = loc_list_from_tree (bound, want_address);
        if (list == NULL)
          break;
 
+       if (single_element_loc_list_p (list))
+         {
+           add_AT_loc (subrange_die, bound_attr, list->expr);
+           break;
+         }
+
        if (current_function_decl == 0)
          ctx = comp_unit_die;
        else
@@ -16361,11 +16367,7 @@ add_bound_info (dw_die_ref subrange_die, enum dwarf_attribute bound_attr, tree b
        decl_die = new_die (DW_TAG_variable, ctx, bound);
        add_AT_flag (decl_die, DW_AT_artificial, 1);
        add_type_attribute (decl_die, TREE_TYPE (bound), 1, 0, ctx);
-       if (list->dw_loc_next)
-         add_AT_loc_list (decl_die, DW_AT_location, list);
-       else
-         add_AT_loc (decl_die, DW_AT_location, list->expr);
-
+       add_AT_location_description (decl_die, DW_AT_location, list);
        add_AT_die_ref (subrange_die, bound_attr, decl_die);
        break;
       }
index 747dc6c..6e53f48 100644 (file)
@@ -1,5 +1,8 @@
 2010-03-03  Jakub Jelinek  <jakub@redhat.com>
 
+       PR debug/43237
+       * gcc.dg/debug/dwarf2/pr43237.c: New test.
+
        PR debug/43177
        * gcc.dg/guality/pr43177.c: New test.
 
diff --git a/gcc/testsuite/gcc.dg/debug/dwarf2/pr43237.c b/gcc/testsuite/gcc.dg/debug/dwarf2/pr43237.c
new file mode 100644 (file)
index 0000000..21262c3
--- /dev/null
@@ -0,0 +1,31 @@
+/* PR debug/43237 */
+/* { dg-do compile } */
+/* { dg-options "-g -O2 -dA -fno-merge-debug-strings" } */
+
+struct S
+{
+  int *a;
+  int b;
+  int **c;
+  int d;
+};
+
+void foo (struct S *);
+void bar (struct S *);
+
+int
+baz (void)
+{
+  struct S s;
+  foo (&s);
+  {
+    int a[s.b];
+    int *c[s.d];
+    s.a = a;
+    s.c = c;
+    bar (&s);
+  }
+  return 0;
+}
+
+/* { dg-final { scan-assembler-not "LLST\[^\\r\\n\]*DW_AT_upper_bound" } } */