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

--- Comment #4 from Joshua Kinard <kumba at gentoo dot org> ---
It looks like the bug might be somewhere in __cxa_guard_acquire() in
libstdc++-v3/lubsupc++/guard.cc, as that references glibc and futexes.  strace
indicates that the same syscall was invoked twice in a row -- could this be a
double-locking bug?

This is what I traced out in gdb:

   ¦0x77ed91cc <__cxa_guard_acquire+336>    sw     zero,32(sp)
B+>¦0x77ed91d0 <__cxa_guard_acquire+340>    b      0x77ed9144
<__cxa_guard_acquire+200>
    |
    |->¦0x77ed9144 <__cxa_guard_acquire+200>    lw     t9,-28620(gp)
       ¦0x77ed9148 <__cxa_guard_acquire+204>    li     a0,4238
       ¦0x77ed914c <__cxa_guard_acquire+208>    move   a1,s0
       ¦0x77ed9150 <__cxa_guard_acquire+212>    move   a2,zero
       ¦0x77ed9154 <__cxa_guard_acquire+216>    lw     a3,32(sp)
       ¦0x77ed9158 <__cxa_guard_acquire+220>    jalr   t9
        |
        |->¦0x77d50850 <syscall>    lui    gp,0x9
           ¦0x77d50854 <syscall+4>  addiu  gp,gp,-2624
           ¦0x77d50858 <syscall+8>  addu   gp,gp,t9
           ¦0x77d5085c <syscall+12> li     v0,4000
           ¦0x77d50860 <syscall+16> syscall
               <HANGS HERE>
           ¦0x77d50864 <syscall+20> bnez   a3,0x77d50840
           ¦0x77d50868 <syscall+24> nop
           ¦0x77d5086c <syscall+28> jr     ra
           ¦0x77d50870 <syscall+32> nop
           ¦0x77d50874 <syscall+36> nop
           ¦0x77d50878              nop
           ¦0x77d5087c              nop

I can see the first futex syscall (li a0,4238), and I think it looks like
inside that syscall, it's doing some loads and adds, then makes a "generic"
syscall (#4000), probably passing the computed 0x108e value as the first
argument, which would translate into another futex syscall, which jives with
what strace says.  Is taking a futex inside of a futex a good thing?  It's
obvious that something with the R1x000 CPU is coming into play as well, but I
don't know what exactly.

Reply via email to