[LLVMdev] built-in longjmp and setjmp
Akira Hatanaka
ahatanak at gmail.com
Wed Apr 27 13:22:08 PDT 2011
I declared gi2 as "volatile" and I think gi2 is still incremented once.
Here is a snippet of the code. Line 39 - 42 increments gi2.
According to the standard, shouldn't ++gi2 be executed twice regardless of
whether gi2 is volatile or not? Isn't the missing chain from EH_SJLJ_SETJMP
node to load/store nodes that access gi2 causing this problem (please see
attached file in my previous email)?
# line 39 - 47
ldr r1, LCPI1_1
ldr r2, [r1]
add r2, r2, #1
str r2, [r1]
add r4, pc, #8 @ eh_setjmp begin
str r4, [r0, #4]
mov r0, #0
add pc, pc, #0
mov r0, #1 @ eh_setjmp end
...
LCPI1_1:
.long _gi2
.align 2
On Wed, Apr 27, 2011 at 11:38 AM, Akira Hatanaka <ahatanak at gmail.com> wrote:
> I have another basic question about setjmp/longjmp.
>
> When I compile and run the following program, is it expected that global
> variable gi2 will be incremented twice? It seems that the code generated
> with clang and llc increments it only once (line 37-43 of attached file).
>
> $ clang setjmp6.c -o setjmp6.arm.ll -emit-llvm -O3 -S -ccc-host-triple
> arm-unknown-darwin -ccc-clang-archs arm
> $ llc setjmp6.arm.ll -o setjmp6.arm.s
>
>
> #include <stdio.h>
> #include <stdlib.h>
> void *buf[20];
>
> int gi2 = 0;
>
>
> void __attribute__ ((noinline)) sub2 (void)
> {
> __builtin_longjmp (buf, 1);
>
> }
>
> int
> main (int argc, char **argv)
> {
> int n = atoi (argv[1]);
> int r = __builtin_setjmp (buf);
> ++gi2;
>
> if (r)
> {
> printf ("setjmp %d\n", n + gi2);
> return 0;
> }
>
> sub2 ();
>
> return 0;
> }
>
>
> On Wed, Apr 13, 2011 at 10:05 AM, Jakob Stoklund Olesen <stoklund at 2pi.dk>wrote:
>
>>
>> On Apr 13, 2011, at 9:51 AM, Akira Hatanaka wrote:
>>
>> > int
>> > main (int argc, char** argv)
>> > {
>> > int n = atoi(argv[1]), r;
>> >
>> > if ((r = setjmp (buf)))
>> > {
>> > printf("n = %d\n", n);
>> > return 0;
>> > }
>>
>>
>> /jakob
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20110427/fff9bc0c/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: f.s
Type: application/octet-stream
Size: 1791 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20110427/fff9bc0c/attachment.obj>
More information about the llvm-dev
mailing list