2021-04-17 06:14:21 -04:00
|
|
|
dnl -*- Autoconf -*-
|
2018-01-20 02:05:25 -05:00
|
|
|
AC_DEFUN([RUBY_CHECK_BUILTIN_SETJMP], [
|
|
|
|
AS_IF([test x"${ac_cv_func___builtin_setjmp}" = xyes], [
|
|
|
|
unset ac_cv_func___builtin_setjmp
|
|
|
|
])
|
|
|
|
AC_CACHE_CHECK(for __builtin_setjmp, ac_cv_func___builtin_setjmp,
|
|
|
|
[
|
|
|
|
ac_cv_func___builtin_setjmp=no
|
|
|
|
for cast in "" "(void **)"; do
|
|
|
|
RUBY_WERROR_FLAG(
|
2020-12-12 08:55:09 -05:00
|
|
|
[AC_LINK_IFELSE([AC_LANG_PROGRAM([[@%:@include <setjmp.h>
|
2018-01-20 02:05:25 -05:00
|
|
|
@%:@include <stdio.h>
|
|
|
|
jmp_buf jb;
|
|
|
|
@%:@ifdef NORETURN
|
|
|
|
NORETURN(void t(void));
|
|
|
|
@%:@endif
|
|
|
|
void t(void) {__builtin_longjmp($cast jb, 1);}
|
2020-12-12 08:55:09 -05:00
|
|
|
int jump(void) {(void)(__builtin_setjmp($cast jb) ? 1 : 0); return 0;}]],
|
|
|
|
[[
|
2018-01-20 02:05:25 -05:00
|
|
|
void (*volatile f)(void) = t;
|
|
|
|
if (!jump()) printf("%d\n", f != 0);
|
2020-12-12 08:55:09 -05:00
|
|
|
]])],
|
2018-01-20 02:05:25 -05:00
|
|
|
[ac_cv_func___builtin_setjmp="yes with cast ($cast)"])
|
|
|
|
])
|
|
|
|
test "$ac_cv_func___builtin_setjmp" = no || break
|
|
|
|
done])
|
|
|
|
])dnl
|