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; > }Non-volatile local variables are not preserved by setjmp(), so this program can print whatever it wants. /jakob
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/b16136dd/attachment.html> -------------- next part -------------- A non-text attachment was scrubbed... Name: setjmp6.arm.s Type: application/octet-stream Size: 1765 bytes Desc: not available URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20110427/b16136dd/attachment.obj> -------------- next part -------------- A non-text attachment was scrubbed... Name: dag.main.dot Type: application/msword Size: 8653 bytes Desc: not available URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20110427/b16136dd/attachment.dot>
Hi Akira,> 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).try marking gi2 volatile. Ciao, Duncan.
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>