blob: 481a0e78a10b93feaaa6be6788bc6ebfd1efc4f3 [file] [log] [blame]
/* { 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;
}