re PR debug/51695 (NOTE_INSN_VAR_LOCATION notes are sometimes too large)
authorJakub Jelinek <jakub@redhat.com>
Wed, 4 Jan 2012 19:58:03 +0000 (20:58 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 4 Jan 2012 19:58:03 +0000 (20:58 +0100)
PR debug/51695
* dwarf2out.c (output_loc_list): For now drop >= 64KB expressions
in .debug_loc on the floor.

* gcc.dg/pr51695.c: New test.

From-SVN: r182886

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

index f37ec08..fc64179 100644 (file)
@@ -1,3 +1,9 @@
+2012-01-04  Jakub Jelinek  <jakub@redhat.com>
+
+       PR debug/51695
+       * dwarf2out.c (output_loc_list): For now drop >= 64KB expressions
+       in .debug_loc on the floor.
+
 2012-01-04  Andrew Pinski  <apinski@cavium.com>
 
        * doc/invoke.texi (-march=@var{arch}): Add octeon+ and octeon2.
index d8c1817..f9f4295 100644 (file)
@@ -8166,6 +8166,13 @@ output_loc_list (dw_loc_list_ref list_head)
       /* Don't output an entry that starts and ends at the same address.  */
       if (strcmp (curr->begin, curr->end) == 0 && !curr->force)
        continue;
+      size = size_of_locs (curr->expr);
+      /* If the expression is too large, drop it on the floor.  We could
+        perhaps put it into DW_TAG_dwarf_procedure and refer to that
+        in the expression, but >= 64KB expressions for a single value
+        in a single range are unlikely very useful.  */
+      if (size > 0xffff)
+       continue;
       if (!have_multiple_function_sections)
        {
          dw2_asm_output_delta (DWARF2_ADDR_SIZE, curr->begin, curr->section,
@@ -8184,7 +8191,6 @@ output_loc_list (dw_loc_list_ref list_head)
                               "Location list end address (%s)",
                               list_head->ll_symbol);
        }
-      size = size_of_locs (curr->expr);
 
       /* Output the block length for this list of location operations.  */
       gcc_assert (size <= 0xffff);
index 576d6c5..d4a5c9c 100644 (file)
@@ -1,3 +1,8 @@
+2012-01-04  Jakub Jelinek  <jakub@redhat.com>
+
+       PR debug/51695
+       * gcc.dg/pr51695.c: New test.
+
 2012-01-04  Andrew Pinski  <apinski@cavium.com>
 
        * gcc.target/mips/mips64-dsp-ldx1.c: New test.
diff --git a/gcc/testsuite/gcc.dg/pr51695.c b/gcc/testsuite/gcc.dg/pr51695.c
new file mode 100644 (file)
index 0000000..6eb4540
--- /dev/null
@@ -0,0 +1,52 @@
+/* PR debug/51695 */
+/* { dg-do compile { target { int32plus } } } */
+/* { dg-options "-O2 -g" } */
+
+typedef struct
+{
+  struct { unsigned int t1, t2, t3, t4, t5, t6; } t;
+  int p;
+  struct { double X, Y, Z; } r;
+} T;
+typedef struct { T *h; } S;
+
+static unsigned int v = 0x12345678;
+
+int
+foo (void)
+{
+  v = (v & 0x80000000) ? ((v << 1) ^ 0xa398655d) : (v << 1);
+  return 0;
+}
+
+double
+bar (void)
+{
+  unsigned int o;
+  v = (v & 0x80000000) ? ((v << 1) ^ 0xa398655d) : (v << 1);
+  o = v & 0xffff;
+  return (double) o / 32768.0;
+}
+
+int
+baz (void)
+{
+  foo ();
+  return 0;
+}
+
+void
+test (S *x)
+{
+  T *t = x->h;
+  t->t.t1 = foo ();
+  t->t.t2 = foo ();
+  t->t.t3 = foo ();
+  t->t.t4 = foo ();
+  t->t.t5 = foo ();
+  t->t.t6 = foo ();
+  t->p = baz ();
+  t->r.X = bar ();
+  t->r.Y = bar ();
+  t->r.Z = bar ();
+}