| /* { dg-do run { target cet } } */ |
| /* { dg-options "-O2 -fcf-protection -mshstk" } */ |
| |
| void _exit(int status) __attribute__ ((__noreturn__)); |
| |
| #ifdef __x86_64__ |
| # define incssp(x) __builtin_ia32_incsspq (x) |
| # define rdssp() __builtin_ia32_rdsspq () |
| #else |
| # define incssp(x) __builtin_ia32_incsspd (x) |
| # define rdssp() __builtin_ia32_rdsspd () |
| #endif |
| |
| static void |
| __attribute__ ((noinline, noclone)) |
| test (unsigned long frames) |
| { |
| unsigned long ssp; |
| ssp = rdssp (); |
| if (ssp != 0) |
| { |
| unsigned long tmp = frames; |
| while (tmp > 255) |
| { |
| incssp (tmp); |
| tmp -= 255; |
| } |
| incssp (tmp); |
| } |
| /* We must call _exit since shadow stack is incorrect now. */ |
| _exit (0); |
| } |
| |
| int |
| main () |
| { |
| test (1); |
| return 0; |
| } |