/* 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; }