[lldb-dev] Can't step over __sync_bool_compare_and_swap on ARM
Greg Clayton
gclayton at apple.com
Thu Dec 11 14:44:43 PST 2014
If we are single stepping then we set the BVR/BCR regs to say "stop when the PC is not equal to its current value". If we are settings breakpoints, we just write a trap into memory and continue. Jim pointed out we are setting a breakpoint after the atomic instruction and not on it, so I don't know how this would affect things...
> On Dec 11, 2014, at 2:21 PM, Mario Zechner <badlogicgames at gmail.com> wrote:
>
> Using "slow-stepping" doesn't fix the issue. It appears that the debugger is setting some flags when hitting the breakpoint and stepping which prohibit the intrinsic to evaluate the conditionals properly.
>
> On Thu, Dec 11, 2014 at 8:25 PM, Greg Clayton <gclayton at apple.com> wrote:
> Does this work if you first type:
>
> (lldb) setting set target.use-fast-stepping false
>
> Then step?
>
>
> > On Dec 11, 2014, at 1:38 AM, Mario Zechner <badlogicgames at gmail.com> wrote:
> >
> > Hi,
> >
> > we are running into a problem with the __sync_bool_compare_and_swap intrinsic on ARM. Trying to step over the call to __sync_bool_compare_and_swap will put LLDB into a sort of infinite loop.
> >
> > This is reproduceable in the latest XCode (6.1.1 (6A2008a)). Create an iOS project with the following main function:
> >
> > int main(int argc, char * argv[]) {
> > int c = 0;
> > while(1) {
> > if(__sync_bool_compare_and_swap(&c, 0, 1)) {
> > break;
> > }
> > }
> > printf("%d\n", c);
> > }
> >
> > The intrinsic compiles down to:
> >
> > 0xb7010: dmb ish
> > 0xb7014: movs r0, #0x1
> > 0xb7016: movs r1, #0x0
> > 0xb7018: add r2, sp, #0x14
> > 0xb701a: str r0, [sp, #0x10]
> > 0xb701c: str r1, [sp, #0xc]
> > 0xb701e: str r2, [sp, #0x8]
> > -> 0xb7020: ldr r0, [sp, #0x8]
> > 0xb7022: ldrex r1, [r0]
> > 0xb7026: ldr r2, [sp, #0xc]
> > 0xb7028: cmp r1, r2
> > 0xb702a: str r1, [sp, #0x4]
> > 0xb702c: bne 0xb703a ; main + 62 at main.m:15
> > 0xb702e: ldr r1, [sp, #0x10]
> > 0xb7030: ldr r2, [sp, #0x8]
> > 0xb7032: strex r0, r1, [r2]
> > 0xb7036: cmp r0, #0x0
> > 0xb7038: bne 0xb7020 ; main + 36 at main.m:15
> > 0xb703a: dmb ish
> >
> > When stepping over, LLDB will first set a breakpoint on 0xb702c: bne 0xb703a. Next it executes a single step, moving PC to 0xb702e: ldr r1, [sp, #0x10] as the condition is not meet.
> >
> > LLDB then sets a breakpoint on the next branch instruction at 0xb7038: bne 0xb7020. It single steps the instruction, the condition is meet, and we end up at 0xb7020 again.
> >
> > The code never breaks out of this loop, LLDB will continue to set the breakpoints indefinitely.
> >
> > Any idea how to fix this?
> >
> > Thanks,
> > Mario
> > _______________________________________________
> > lldb-dev mailing list
> > lldb-dev at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev
>
More information about the lldb-dev
mailing list