[LLVMdev] __sync_add_and_fetch in objc block for global variable on ARM
Alexey Perevalov
alexey.perevalov at hotmail.com
Thu Apr 9 01:15:25 PDT 2015
Hi Tim, thank you for response and sorry my fault,
count name in example is too general, my objc runtime is using it for handling auto release pool
occupancy.
compiler is fine ;)
----------------------------------------
From: alexey.perevalov at hotmail.com
To: t.p.northover at gmail.com
Date: Thu, 9 Apr 2015 10:58:30 +0300
CC: llvmdev at cs.uiuc.edu
Subject: Re: [LLVMdev] __sync_add_and_fetch in objc block for global variable on ARM
Hi Tim
----------------------------------------
> Date: Wed, 8 Apr 2015 06:53:44 -0700
> Subject: Re: [LLVMdev] __sync_add_and_fetch in objc block for global variable on ARM
> From: t.p.northover at gmail.com
> To: alexey.perevalov at hotmail.com
> CC: llvmdev at cs.uiuc.edu
>
>> in disas I see dmb ish instruction, but I don't know is it enough.
>
> There should be 2 dmb instructions: one before the ldrex/strex loop
> and one after. But I wouldn't expect dropping one to actually cause a
> problem in the code you posted.
Yes, there are two dmb's
=> 0x00008ed8 <+224>: dmb ish
0x00008edc <+228>: movw r1, #10800 ; 0x2a30
0x00008ee0 <+232>: movt r1, #1
0x00008ee4 <+236>: str r0, [sp, #44] ; 0x2c
0x00008ee8 <+240>: str r1, [sp, #40] ; 0x28
0x00008eec <+244>: ldr r0, [sp, #40] ; 0x28
0x00008ef0 <+248>: ldrexb r1, [r0]
0x00008ef4 <+252>: ldr r2, [sp, #44] ; 0x2c
0x00008ef8 <+256>: add r3, r1, r2
0x00008efc <+260>: strexb r12, r3, [r0]
0x00008f00 <+264>: cmp r12, #0
0x00008f04 <+268>: str r1, [sp, #36] ; 0x24
---Type <return> to continue, or q <return> to quit---
0x00008f08 <+272>: bne 0x8eec <__main_block_invoke+244>
0x00008f0c <+276>: ldr r0, [sp, #36] ; 0x24
0x00008f10 <+280>: add r0, r0, #1
0x00008f14 <+284>: dmb ish
0x00008f18 <+288>: ldr r1, [sp, #40] ; 0x28
0x00008f1c <+292>: strb r0, [r1]
0x00008f20 <+296>: bl 0x8aa0 <pthread_self>
>
> In what way is "count" corrupted, and how do you observe it? What
> assembly is actually produced for the block?
The assembly for whole block is huge even for minimal test case. I attached source code.
I used cocotron derived framework, but due canaries was alive I don't think it's due runtime.
If you undef REPRODUCE_CASE in example, it will not reproduce, I think it's because of introducing
additional time interval.
The output of sample is following (when it reproduced):
after -1316199408 count addr 0x12a30, value 1
canary1 77, canary2 88
after -1324588016 count addr 0x12a30, value 2
canary1 77, canary2 88
after -1324588016 count addr 0x12a30, value 3
canary1 77, canary2 88
after -1324588016 count addr 0x12a30, value 33
canary1 77, canary2 88
after -1324588016 count addr 0x12a30, value 34
>
>> I understand, my clang is out of date. Moving to new version could be painful )
>> Maybe somebody knows, was that bug fixed?
>
> That area's certainly improved, but I'm not aware of any bugs on that
> scale ("can't dispatch 32 threads to atomically increment a single
> variable and print it") in clang 3.3 so I think something else is
> probably going on.
>
> A self-contained, minimal example we can examine would be useful.
>
> Cheers.
>
> Tim.
_______________________________________________
LLVM Developers mailing list
LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
More information about the llvm-dev
mailing list