https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98692

--- Comment #14 from Will Schmidt <willschm at gcc dot gnu.org> ---


Using gdb/vgdb to view the valgrind shadow register values, it looks like
the uninitialized values are being loaded in via the
_restgpr0_25 call being made at the end of isVariable().

Dump of assembler code for function isVariable(char*):
   0x00000000100006ac <+0>:     lis     r2,4098
   0x00000000100006b0 <+4>:     addi    r2,r2,32512
   0x00000000100006b4 <+8>:     mflr    r0
   0x00000000100006b8 <+12>:    addis   r9,r2,-2
   0x00000000100006bc <+16>:    addi    r9,r9,-30152

(here: r1 is 0x1fff00e440 ; shadow registers r24..r31 show zero).

   0x00000000100006c0 <+20>:    bl      0x10000820 <_savegpr0_25>

savegpr0_25 stores r25 thru r31 into the stack (offset of r1)

   0x00000000100006c4 <+24>:    stdu    r1,-128(r1)

And stack pointer updates itself.   r1 is now 0x1fff00e3c0


   0x00000000100006c8 <+28>:    ld      r29,0(r9)
   0x00000000100006cc <+32>:    ld      r28,8(r9)
   0x00000000100006d0 <+36>:    nop
   0x00000000100006d4 <+40>:    mr      r30,r3
   0x00000000100006d8 <+44>:    ld      r27,16(r9)
   0x00000000100006dc <+48>:    li      r31,0
   0x00000000100006e0 <+52>:    addi    r25,r2,-32456
   0x00000000100006e4 <+56>:    addi    r26,r1,32
   0x00000000100006e8 <+60>:    std     r29,32(r1)
   0x00000000100006ec <+64>:    std     r28,40(r1)
   0x00000000100006f0 <+68>:    rldicr  r9,r31,3,60
   0x00000000100006f4 <+72>:    li      r5,2
   0x00000000100006f8 <+76>:    std     r27,48(r1)
   0x00000000100006fc <+80>:    mr      r3,r30
   0x0000000010000700 <+84>:    ldx     r4,r26,r9
   0x0000000010000704 <+88>:    bl      0x100004c0
<00000023.plt_call.strncmp@@GLIBC_2.17>
   0x0000000010000708 <+92>:    ld      r2,24(r1)
   0x000000001000070c <+96>:    mr.     r9,r3
   0x0000000010000710 <+100>:   bne     0x10000718 <isVariable(char*)+108>
   0x0000000010000714 <+104>:   stw     r9,0(r25)
   0x0000000010000718 <+108>:   cmpldi  r31,1
   0x000000001000071c <+112>:   bne     0x10000728 <isVariable(char*)+124>

r1 still 0x1fff00e3c0

   0x0000000010000720 <+116>:   addi    r1,r1,128

now r1 is 0x1fff00e440

   0x0000000010000724 <+120>:   b       0x10000844 <_restgpr0_25>

and as we progress through restoring the regs, the valgrind shadow registers
are indicating the values are uninitialized as they are restored off the stack
(r1).

   0x10000964 <_restgpr0_25>:   ld      r25,-56(r1)

(gdb) p/x $r25s1
$29 = 0xffffffffffffffff

(gdb) p/x $r26s1        
$31 = 0x0
=> 0x10000968 <_restgpr0_26>:   ld      r26,-48(r1)
(gdb) p/x $r26s1
$32 = 0xffffffffffffffff

   0x1000096c <_restgpr0_27>:   ld      r27,-40(r1)
   0x10000970 <_restgpr0_28>:   ld      r28,-32(r1)
   0x10000974 <_restgpr0_29>:   ld      r0,16(r1)



The _restgpr* and _savegpr* functions are not referenced when the test is built
at other optimization levels.  (I've looked at disassembly from -O0 .. -O4).

I do note that the _restgpr and _savegpr functions are called differently. 
savegpr is called with bl while the restgpr is called via a direct branch; i
can't immediately tell if this is by design or if it is in error.


    100007d0:   71 01 00 48     bl      10000940 <_savegpr0_25>
    10000834:   30 01 00 48     b       10000964 <_restgpr0_25>

Reply via email to