1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
|
#include <setjmp.h>
#ifdef SIGJMP
# define SETJMP(env) sigsetjmp (env, 1)
# define LONGJMP(env, x) siglongjmp (env, x)
#elif defined UNDERJMP
# define SETJMP(env) _setjmp (env)
# define LONGJMP(env, x) _longjmp (env, x)
#else
# define SETJMP(env) setjmp (env)
# define LONGJMP(env, x) longjmp (env, x)
#endif
struct env
{
jmp_buf jmp;
};
struct env saved;
void __attribute__ ((noinline))
jumper (struct env *env, int x)
{
if (x == 0)
siglongjmp (env->jmp, 1);
}
void __attribute__ ((noinline))
jumped (void)
{
asm volatile ("");
}
void __attribute__ ((noinline))
setter (void)
{
if (sigsetjmp (saved.jmp, 1) == 0)
jumper (&saved, 0);
else
jumped ();
}
int
main (void)
{
setter ();
return 0;
}
|