1  /* { dg-do run } */
       2  /* { dg-options "-O" } */
       3  
       4  #if defined(__x86_64__)
       5  # define CHAIN	"%r10"
       6  #elif defined(__i386__)
       7  # define CHAIN  "%ecx"
       8  #elif defined(__aarch64__)
       9  # define CHAIN  "x18"
      10  #elif defined(__alpha__)
      11  # define CHAIN  "$1"
      12  #elif defined(__arm__)
      13  # define CHAIN  "ip"
      14  #elif defined(__powerpc__)
      15  # define CHAIN  "11"
      16  #elif defined(__s390__)
      17  # define CHAIN  "%r0"
      18  #elif defined(__sparc__)
      19  # ifdef __arch64__
      20  #  define CHAIN "%g5"
      21  # else
      22  #  define CHAIN "%g2"
      23  # endif
      24  #endif
      25  
      26  #ifdef CHAIN
      27  void *__attribute__((noinline, noclone)) foo(void)
      28  {
      29    register void *chain __asm__(CHAIN);
      30    return chain;
      31  }
      32  
      33  void * (*ptr)(void) = foo;
      34  extern void abort(void);
      35  
      36  int main()
      37  {
      38    char c;
      39    void *x = __builtin_call_with_static_chain(ptr(), &c);
      40    if (x != &c)
      41      abort();
      42    return 0;
      43  }
      44  #else
      45  int main() { return 0; }
      46  #endif