| /* { dg-do compile } */ |
| /* { dg-options "-O -fcf-protection" } */ |
| /* { dg-final { scan-assembler-times "endbr32" 3 { target ia32 } } } */ |
| /* { dg-final { scan-assembler-times "endbr64" 3 { target { ! ia32 } } } } */ |
| /* { dg-final { scan-assembler-times "rdssp\[dq]" 2 } } */ |
| /* { dg-final { scan-assembler-times "incssp\[dq]" 2 } } */ |
| |
| /* Based on gcc.dg/setjmp-3.c. */ |
| |
| void *buf[5]; |
| |
| extern void abort (void); |
| |
| void |
| raise0 (void) |
| { |
| __builtin_longjmp (buf, 1); |
| } |
| |
| __attribute__ ((noinline, noclone)) |
| static int |
| execute (int cmd) |
| { |
| int last = 0; |
| |
| if (__builtin_setjmp (buf) == 0) |
| while (1) |
| { |
| last = 1; |
| raise0 (); |
| } |
| |
| if (last == 0) |
| return 0; |
| else |
| return cmd; |
| } |
| |
| int main(void) |
| { |
| if (execute (1) == 0) |
| abort (); |
| |
| return 0; |
| } |