Does the X86 backend (or any other backend) correctly implement support for __builtin_setjmp and __builtin_longjmp? I don't get the correct result when I compile and run the following code with clang. # clang foo.c -O3; ./a.out #include <stdio.h> void *buf[20]; void __attribute__((noinline)) foo (void) { __builtin_longjmp (buf, 1); } int main (int argc, char** argv) { if (__builtin_setjmp (buf)) { printf("return\n"); return 0; } printf("call foo\n"); foo (); return 1; } -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20110412/f99a0f29/attachment.html>
ARM/Darwin implements them. I'm not aware of any others. That said, they are designed for internal use by the compiler for exception handling. Calling them directly like this is very much not recommended. Using the system library setjmp()/longjmp() functions is preferred. -Jim On Apr 12, 2011, at 1:56 PM, Akira Hatanaka wrote:> Does the X86 backend (or any other backend) correctly implement support for __builtin_setjmp and __builtin_longjmp? > I don't get the correct result when I compile and run the following code with clang. > > # clang foo.c -O3; ./a.out > > #include <stdio.h> > void *buf[20]; > void __attribute__((noinline)) > foo (void) > { > __builtin_longjmp (buf, 1); > } > > int > main (int argc, char** argv) > { > if (__builtin_setjmp (buf)) > { > printf("return\n"); > return 0; > } > > printf("call foo\n"); > foo (); > > return 1; > } > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
What would be the best way to convert built-in setjmp and longjmp tp library calls? Should it be implemented in clang or in backends? On Tue, Apr 12, 2011 at 2:38 PM, Jim Grosbach <grosbach at apple.com> wrote:> ARM/Darwin implements them. I'm not aware of any others. > > That said, they are designed for internal use by the compiler for exception > handling. Calling them directly like this is very much not recommended. > Using the system library setjmp()/longjmp() functions is preferred. > > -Jim > > On Apr 12, 2011, at 1:56 PM, Akira Hatanaka wrote: > > > Does the X86 backend (or any other backend) correctly implement support > for __builtin_setjmp and __builtin_longjmp? > > I don't get the correct result when I compile and run the following code > with clang. > > > > # clang foo.c -O3; ./a.out > > > > #include <stdio.h> > > void *buf[20]; > > void __attribute__((noinline)) > > foo (void) > > { > > __builtin_longjmp (buf, 1); > > } > > > > int > > main (int argc, char** argv) > > { > > if (__builtin_setjmp (buf)) > > { > > printf("return\n"); > > return 0; > > } > > > > printf("call foo\n"); > > foo (); > > > > return 1; > > } > > > > _______________________________________________ > > LLVM Developers mailing list > > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev > >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20110412/af1213be/attachment.html>