[lldb-dev] Can't step over __sync_bool_compare_and_swap on ARM
Mario Zechner
badlogicgames at gmail.com
Thu Dec 11 01:43:00 PST 2014
Using the OS atomic cmp/swp works (step over/into does not go into infinite
loop):
#include <libkern/OSAtomic.h>
int main(int argc, char * argv[]) {
int c = 0;
while(1) {
if(OSAtomicCompareAndSwap32(0, 1, &c)) {
break;
}
}
printf("%d\n", c);
}
This means we have a fix for our use case, but i assume that others may use
the intrinsic and be surprised at LLDB's behaviour.
On Thu, Dec 11, 2014 at 10: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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-dev/attachments/20141211/0f5103dd/attachment.html>
More information about the lldb-dev
mailing list