diff options
Diffstat (limited to 'gcc/testsuite')
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/stack-check-12.c | 1 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/stack-check-17.c | 37 |
3 files changed, 43 insertions, 1 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2c66a0d..1b8e7ad 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2018-01-03 Jeff Law <law@redhat.com> + + PR target/83641 + * gcc.target/i386/stack-check-17.c: New test. + * gcc.target/i386/stack-check-12.c: Drop unnecessary asm. + 2018-01-03 Jakub Jelinek <jakub@redhat.com> PR debug/83621 diff --git a/gcc/testsuite/gcc.target/i386/stack-check-12.c b/gcc/testsuite/gcc.target/i386/stack-check-12.c index 9804169..74d3a26 100644 --- a/gcc/testsuite/gcc.target/i386/stack-check-12.c +++ b/gcc/testsuite/gcc.target/i386/stack-check-12.c @@ -7,7 +7,6 @@ __attribute__ ((noreturn)) void exit (int); __attribute__ ((noreturn)) void f (void) { - asm volatile ("nop" ::: "edi"); exit (1); } diff --git a/gcc/testsuite/gcc.target/i386/stack-check-17.c b/gcc/testsuite/gcc.target/i386/stack-check-17.c new file mode 100644 index 0000000..d2ef83b3 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/stack-check-17.c @@ -0,0 +1,37 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fstack-clash-protection -mtune=generic -fomit-frame-pointer" } */ +/* { dg-require-effective-target supports_stack_clash_protection } */ + + +int x0, x1; +void f1 (void); +void f2 (int, int); + +__attribute__ ((noreturn)) +void +f3 (void) +{ + int y0 = x0; + int y1 = x1; + f1 (); + f2 (y0, y1); + while (1); +} + +/* Verify no explicit probes. */ +/* { dg-final { scan-assembler-not "or\[ql\]" } } */ + +/* We also want to verify we did not use a push/pop sequence + to probe *sp as the callee register saves are sufficient + to probe *sp. + + y0/y1 are live across the call and thus must be allocated + into either a stack slot or callee saved register. The former + would be rather dumb. So assume it does not happen. + + So search for two/four pushes for the callee register saves/argument + pushes and no pops (since the function has no reachable epilogue). */ +/* { dg-final { scan-assembler-times "push\[ql\]" 2 { target { ! ia32 } } } } */ +/* { dg-final { scan-assembler-times "push\[ql\]" 4 { target { ia32 } } } } */ +/* { dg-final { scan-assembler-not "pop" } } */ + |