aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2012-01-04 20:58:03 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2012-01-04 20:58:03 +0100
commit5dc28f42b4522c1ba7446174282496a3e54014d2 (patch)
treeaf140ca4a2f43d4298d8e2199c1b85c8ba511715 /gcc
parent03a9ba1e28339288fcbdbb3a70f6487a88104df7 (diff)
downloadgcc-5dc28f42b4522c1ba7446174282496a3e54014d2.zip
gcc-5dc28f42b4522c1ba7446174282496a3e54014d2.tar.gz
gcc-5dc28f42b4522c1ba7446174282496a3e54014d2.tar.bz2
re PR debug/51695 (NOTE_INSN_VAR_LOCATION notes are sometimes too large)
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/dwarf2out.c8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr51695.c52
4 files changed, 70 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f37ec08..fc64179 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index d8c1817..f9f4295 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -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);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 576d6c5..d4a5c9c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..6eb4540
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr51695.c
@@ -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 ();
+}