2018-03-08 Richard Biener <rguenther@suse.de>
[official-gcc.git] / gcc / testsuite / gcc.target / i386 / cet-rdssp-1.c
blob6cd24f63384b943851a6e87fbda1d32ad38132f6
1 /* { dg-do run { target cet } } */
2 /* { dg-options "-O2 -fcf-protection -mcet" } */
4 void _exit(int status) __attribute__ ((__noreturn__));
6 #ifdef __x86_64__
7 # define incssp(x) __builtin_ia32_incsspq (x)
8 # define rdssp() __builtin_ia32_rdsspq ()
9 #else
10 # define incssp(x) __builtin_ia32_incsspd (x)
11 # define rdssp() __builtin_ia32_rdsspd ()
12 #endif
14 static void
15 __attribute__ ((noinline, noclone))
16 test (unsigned long frames)
18 unsigned long ssp;
19 ssp = rdssp ();
20 if (ssp != 0)
22 unsigned long tmp = frames;
23 while (tmp > 255)
25 incssp (tmp);
26 tmp -= 255;
28 incssp (tmp);
30 /* We must call _exit since shadow stack is incorrect now. */
31 _exit (0);
34 int
35 main ()
37 test (1);
38 return 0;