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 <badlogicga...@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 <gclay...@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 <badlogicga...@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@cs.uiuc.edu > > http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev > _______________________________________________ lldb-dev mailing list lldb-dev@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev