On Wed, Apr 6, 2011 at 12:43 AM, Jakub Jelinek <ja...@redhat.com> wrote: > Hi! > > On the pr48466.c testcase below on i?86 -m32 -g -O0 we generate wrong debug > info for some of the variables in main. This was caused by PR36977 fix, > crtl->stack_realign_tried is true, but fde->drap_reg is INVALID_REGNUM, > but frame_pointer_rtx is being eliminated to hard_frame_pointer_regnum > rather than stack_pointer_regnum. Fixed by using hfp instead of sp > in that case, the patch is also adding a testcase from PR36977 to make sure > it doesn't regress. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
Ok. Thanks, Richard. > 2011-04-06 Jakub Jelinek <ja...@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. > > --- gcc/dwarf2out.c.jj 2011-04-04 08:56:08.000000000 +0200 > +++ gcc/dwarf2out.c 2011-04-05 20:51:53.000000000 +0200 > @@ -13383,7 +13383,7 @@ based_loc_descr (rtx reg, HOST_WIDE_INT > 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); > } > > --- gcc/testsuite/gcc.dg/guality/pr36977.c.jj 2011-04-05 20:39:10.000000000 > +0200 > +++ gcc/testsuite/gcc.dg/guality/pr36977.c 2011-04-05 20:41:27.000000000 > +0200 > @@ -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; > +} > --- gcc/testsuite/gcc.dg/guality/pr48466.c.jj 2011-04-05 20:46:25.000000000 > +0200 > +++ gcc/testsuite/gcc.dg/guality/pr48466.c 2011-04-05 20:51:29.000000000 > +0200 > @@ -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; > +} > > Jakub >