/* { dg-do run } */ /* { dg-options "-O" } */ #if defined(__x86_64__) # define CHAIN "%r10" #elif defined(__i386__) # define CHAIN "%ecx" #elif defined(__aarch64__) # define CHAIN "x18" #elif defined(__alpha__) # define CHAIN "$1" #elif defined(__arm__) # define CHAIN "ip" #elif defined(__powerpc__) # define CHAIN "11" #elif defined(__s390__) # define CHAIN "%r0" #elif defined(__sparc__) # ifdef __arch64__ # define CHAIN "%g5" # else # define CHAIN "%g2" # endif #endif #ifdef CHAIN void *__attribute__((noinline, noclone)) foo(void) { register void *chain __asm__(CHAIN); return chain; } void * (*ptr)(void) = foo; extern void abort(void); int main() { char c; void *x = __builtin_call_with_static_chain(ptr(), &c); if (x != &c) abort(); return 0; } #else int main() { return 0; } #endif