| /* { dg-do compile } */ |
| /* { dg-options "-O -fcf-protection" } */ |
| /* { dg-final { scan-assembler-times "endbr32" 2 { target ia32 } } } */ |
| /* { dg-final { scan-assembler-times "endbr64" 2 { target { ! ia32 } } } } */ |
| /* { dg-final { scan-assembler-times "call _?setjmp" 1 } } */ |
| /* { dg-final { scan-assembler-times "call _?longjmp" 1 } } */ |
| |
| #include <stdio.h> |
| #include <setjmp.h> |
| |
| jmp_buf buf; |
| static int bar (int); |
| |
| __attribute__ ((noinline, noclone)) |
| static int |
| foo (int i) |
| { |
| int j = i * 11; |
| |
| if (!setjmp (buf)) |
| { |
| j += 33; |
| printf ("After setjmp: j = %d\n", j); |
| bar (j); |
| } |
| |
| return j + i; |
| } |
| |
| __attribute__ ((noinline, noclone)) |
| static int |
| bar (int i) |
| { |
| int j = i; |
| |
| j -= 111; |
| printf ("In longjmp: j = %d\n", j); |
| longjmp (buf, 1); |
| |
| return j; |
| } |
| |
| int |
| main () |
| { |
| foo (10); |
| return 0; |
| } |