diff options
Diffstat (limited to 'gcc/testsuite/gcc.target/s390/return-addr2.c')
-rw-r--r-- | gcc/testsuite/gcc.target/s390/return-addr2.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.target/s390/return-addr2.c b/gcc/testsuite/gcc.target/s390/return-addr2.c new file mode 100644 index 000000000..c94d05284 --- /dev/null +++ b/gcc/testsuite/gcc.target/s390/return-addr2.c @@ -0,0 +1,45 @@ +/* builtin_return_address(n) with n>0 has always been troublesome. */ + +/* { dg-do run } */ +/* { dg-options "-O3 -fno-optimize-sibling-calls -mbackchain" } */ + +void *addr1; + +extern void abort (void); + +void * __attribute__((noinline)) +foo1 () +{ + addr1 = __builtin_return_address (2); +} + +void * __attribute__((noinline)) +foo2 () +{ + foo1 (); +} + +void * __attribute__((noinline)) +foo3 () +{ + foo2 (); +} + +void __attribute__((noinline)) +bar () +{ + void *addr2; + + foo3 (); + asm volatile ("basr %0,0\n\t" : "=d" (addr2)); + /* basr is two bytes in length. */ + if (addr2 - addr1 != 2) + abort (); +} + +int +main () +{ + bar(); + return 0; +} |