]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR debug/48466 (Wrong variable locations at -O0 on i686)
authorJakub Jelinek <jakub@redhat.com>
Thu, 7 Apr 2011 18:30:36 +0000 (20:30 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 7 Apr 2011 18:30:36 +0000 (20:30 +0200)
Backported from mainline
2011-04-06  Jakub Jelinek  <jakub@redhat.com>

PR debug/48466
* dwarf2out.c (based_loc_descr): If drap_reg is INVALID_REGNUM, use
as base_reg whatever register reg has been eliminated to, instead
of hardcoding STACK_POINTER_REGNUM.

* gcc.dg/guality/pr36977.c: New test.
* gcc.dg/guality/pr48466.c: New test.

From-SVN: r172118

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

index 181277fe7df71a217d3db66a78a7ac5a27c0a6e4..3611039e1d649e0c498ce968e9be18316345a217 100644 (file)
@@ -1,6 +1,13 @@
 2011-04-07  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
+       2011-04-06  Jakub Jelinek  <jakub@redhat.com>
+
+       PR debug/48466
+       * dwarf2out.c (based_loc_descr): If drap_reg is INVALID_REGNUM, use
+       as base_reg whatever register reg has been eliminated to, instead
+       of hardcoding STACK_POINTER_REGNUM.
+
        2011-03-24  Jakub Jelinek  <jakub@redhat.com>
 
        PR debug/48204
index 2df1bd6aa9a3c2c44f04f83bd7fecf6a625007d2..27f8f0c135b25730631d821647e6c09568b222cf 100644 (file)
@@ -12781,7 +12781,7 @@ based_loc_descr (rtx reg, HOST_WIDE_INT offset,
              int base_reg
                = DWARF_FRAME_REGNUM ((fde && fde->drap_reg != INVALID_REGNUM)
                                      ? HARD_FRAME_POINTER_REGNUM
-                                     : STACK_POINTER_REGNUM);
+                                     : REGNO (elim));
              return new_reg_loc_descr (base_reg, offset);
            }
 
index 185b616707f449897c5926c8f2a4dcde2baa2351..fc10aad646b1873794adfcbbfbbbee01d0d9c235 100644 (file)
@@ -1,6 +1,12 @@
 2011-04-07  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
+       2011-04-06  Jakub Jelinek  <jakub@redhat.com>
+
+       PR debug/48466
+       * gcc.dg/guality/pr36977.c: New test.
+       * gcc.dg/guality/pr48466.c: New test.
+
        2011-03-24  Jakub Jelinek  <jakub@redhat.com>
 
        PR debug/48204
diff --git a/gcc/testsuite/gcc.dg/guality/pr36977.c b/gcc/testsuite/gcc.dg/guality/pr36977.c
new file mode 100644 (file)
index 0000000..3689fae
--- /dev/null
@@ -0,0 +1,32 @@
+/* PR debug/36977 */
+/* { dg-do run } */
+/* { dg-options "-g" } */
+/* { dg-skip-if "" { *-*-* }  { "*" } { "-O0" } } */
+
+void
+foo ()
+{
+}
+
+int
+main ()
+{
+  struct { char c[100]; } cbig;
+  struct { int i[800]; } ibig;
+  struct { long l[900]; } lbig;
+  struct { float f[200]; } fbig;
+  struct { double d[300]; } dbig;
+  struct { short s[400]; } sbig;
+
+  ibig.i[0] = 55;              /* { dg-final { gdb-test 30 "ibig.i\[0\]" "55" } } */
+  ibig.i[100] = 5;             /* { dg-final { gdb-test 30 "ibig.i\[100\]" "5" } } */
+  cbig.c[0] = '\0';            /* { dg-final { gdb-test 30 "cbig.c\[0\]" "'\\0'" } } */
+  cbig.c[99] = 'A';            /* { dg-final { gdb-test 30 "cbig.c\[99\]" "'A'" } } */
+  fbig.f[100] = 11.0;          /* { dg-final { gdb-test 30 "fbig.f\[100\]" "11" } } */
+  dbig.d[202] = 9.0;           /* { dg-final { gdb-test 30 "dbig.d\[202\]" "9" } } */
+  sbig.s[90] = 255;            /* { dg-final { gdb-test 30 "sbig.s\[90\]" "255" } } */
+  lbig.l[333] = 999;           /* { dg-final { gdb-test 30 "lbig.l\[333\]" "999" } } */
+
+  foo ();
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/guality/pr48466.c b/gcc/testsuite/gcc.dg/guality/pr48466.c
new file mode 100644 (file)
index 0000000..8d5426a
--- /dev/null
@@ -0,0 +1,41 @@
+/* PR debug/48466 */
+/* { dg-do run } */
+/* { dg-options "-g" } */
+/* { dg-skip-if "" { *-*-* }  { "*" } { "-O0" } } */
+
+struct S { unsigned int a; unsigned int *b; };
+struct T { struct S a; struct S b; };
+struct U { const char *u; };
+int n[10];
+volatile int v;
+
+struct U
+foo (const char *s)
+{
+  struct U r;
+  r.u = s;
+  return r;
+}
+
+void
+bar (struct T *s, int a, int b)
+{
+  s->a.a = a;
+  s->a.b = &s->a.a;
+  s->b.a = b;
+  s->b.b = &s->b.a;
+}
+
+int
+main ()
+{
+  struct T t;
+  struct U x = foo ("this is x");
+  struct S y, z;
+  y.b = n;             /* { dg-final { gdb-test 38 "t.a.a" "17" } } */
+  y.a = 0;             /* { dg-final { gdb-test 38 "*t.a.b" "17" } } */
+  bar (&t, 17, 21);    /* { dg-final { gdb-test 38 "t.b.a" "21" } } */
+  v++;                 /* { dg-final { gdb-test 38 "*t.b.b" "21" } } */
+  z = y;
+  return 0;
+}