Message ID | 20100720124018.GA19172@tyan-ft48-01.lab.bos.redhat.com |
---|---|
State | New |
Headers | show |
On Tue, 20 Jul 2010, Jakub Jelinek wrote: > Hi! > > As the attached testcase shows, expand_debug_expr was generating wrong > extension (based on TYPE_UNSIGNED of the result rather than operand, > so for unsigned short x; DEBUG y => (int) x was SIGN_EXTEND instead of > ZERO_EXTEND and vice versa). > > Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux. Ok for > trunk? Ok. Thanks, Richard. > 2010-07-20 Jakub Jelinek <jakub@redhat.com> > > PR debug/45003 > * cfgexpand.c (expand_debug_expr) <case NOP_EXPR>: Use ZERO_EXTEND > or SIGN_EXTEND depending on TYPE_UNSIGNED of the operand's type > instead of the result's type. > > * gcc.dg/guality/pr45003-1.c: New test. > > --- gcc/cfgexpand.c.jj 2010-06-20 17:13:36.000000000 +0200 > +++ gcc/cfgexpand.c 2010-07-20 11:21:17.000000000 +0200 > @@ -2164,7 +2164,7 @@ expand_debug_expr (tree exp) > op0 = simplify_gen_subreg (mode, op0, inner_mode, > subreg_lowpart_offset (mode, > inner_mode)); > - else if (unsignedp) > + else if (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0)))) > op0 = gen_rtx_ZERO_EXTEND (mode, op0); > else > op0 = gen_rtx_SIGN_EXTEND (mode, op0); > --- gcc/testsuite/gcc.dg/guality/pr45003-1.c.jj 2010-07-20 13:56:34.000000000 +0200 > +++ gcc/testsuite/gcc.dg/guality/pr45003-1.c 2010-07-20 13:58:38.000000000 +0200 > @@ -0,0 +1,31 @@ > +/* PR debug/45003 */ > +/* { dg-do run { target { x86_64-*-* && lp64 } } } */ > +/* { dg-options "-g" } */ > + > +int __attribute__((noinline)) > +foo (unsigned short *p) > +{ > + int a = *p; > + asm volatile ("nop"); > + asm volatile ("nop" : : "D" (a)); /* { dg-final { gdb-test 10 "a" "0x8078" } } */ > + return 0; > +} > + > +int __attribute__((noinline)) > +bar (short *p) > +{ > + unsigned int a = *p; > + asm volatile ("nop"); > + asm volatile ("nop" : : "D" (a)); /* { dg-final { gdb-test 19 "a" "0xffff8078" } } */ > + return 0; > +} > + > +int > +main () > +{ > + unsigned short us = 0x8078; > + foo (&us); > + short s = -32648; > + bar (&s); > + return 0; > +} > > Jakub > >
--- gcc/cfgexpand.c.jj 2010-06-20 17:13:36.000000000 +0200 +++ gcc/cfgexpand.c 2010-07-20 11:21:17.000000000 +0200 @@ -2164,7 +2164,7 @@ expand_debug_expr (tree exp) op0 = simplify_gen_subreg (mode, op0, inner_mode, subreg_lowpart_offset (mode, inner_mode)); - else if (unsignedp) + else if (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0)))) op0 = gen_rtx_ZERO_EXTEND (mode, op0); else op0 = gen_rtx_SIGN_EXTEND (mode, op0); --- gcc/testsuite/gcc.dg/guality/pr45003-1.c.jj 2010-07-20 13:56:34.000000000 +0200 +++ gcc/testsuite/gcc.dg/guality/pr45003-1.c 2010-07-20 13:58:38.000000000 +0200 @@ -0,0 +1,31 @@ +/* PR debug/45003 */ +/* { dg-do run { target { x86_64-*-* && lp64 } } } */ +/* { dg-options "-g" } */ + +int __attribute__((noinline)) +foo (unsigned short *p) +{ + int a = *p; + asm volatile ("nop"); + asm volatile ("nop" : : "D" (a)); /* { dg-final { gdb-test 10 "a" "0x8078" } } */ + return 0; +} + +int __attribute__((noinline)) +bar (short *p) +{ + unsigned int a = *p; + asm volatile ("nop"); + asm volatile ("nop" : : "D" (a)); /* { dg-final { gdb-test 19 "a" "0xffff8078" } } */ + return 0; +} + +int +main () +{ + unsigned short us = 0x8078; + foo (&us); + short s = -32648; + bar (&s); + return 0; +}