111
|
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
|