47 lines
821 B
C
47 lines
821 B
C
/* { 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
|