| /* { dg-require-effective-target indirect_jumps } */ |
| /* { dg-additional-options "-fomit-frame-pointer -fno-inline" } */ |
| |
| extern void abort (void); |
| |
| void |
| broken_longjmp (void *p) |
| { |
| __builtin_longjmp (p, 1); |
| } |
| |
| volatile int x = 256; |
| void *volatile p = (void*)&x; |
| void *volatile p1; |
| |
| void |
| test (void) |
| { |
| void *buf[5]; |
| void *volatile q = p; |
| |
| if (!__builtin_setjmp (buf)) |
| broken_longjmp (buf); |
| |
| /* Fails if stack pointer corrupted. */ |
| if (p != q) |
| abort (); |
| } |
| |
| void |
| test2 (void) |
| { |
| void *volatile q = p; |
| p1 = __builtin_alloca (x); |
| test (); |
| |
| /* Fails if frame pointer corrupted. */ |
| if (p != q) |
| abort (); |
| } |
| |
| int |
| main (void) |
| { |
| void *volatile q = p; |
| test (); |
| test2 (); |
| /* Fails if stack pointer corrupted. */ |
| if (p != q) |
| abort (); |
| |
| return 0; |
| } |