1 #include <stdio.h>
2
3 static int
4 one (void)
5 {
6 return -30;
7 }
8
9 int foo (void) __attribute__ ((ifunc ("resolve_foo")));
10
11 void *
12 resolve_foo (void)
13 {
14 return (void *) one;
15 }
16
17 typedef int (*foo_p) (void);
18
19 foo_p foo_ptr = foo;
20
21 foo_p
22 __attribute__ ((noinline))
23 get_foo_p (void)
24 {
25 return foo_ptr;
26 }
27
28 foo_p
29 __attribute__ ((noinline))
30 get_foo (void)
31 {
32 return foo;
33 }
34
35 int
36 main (void)
37 {
38 foo_p p;
39
40 p = get_foo ();
41 if (p != foo)
42 __builtin_abort ();
43 if ((*p) () != -30)
44 __builtin_abort ();
45
46 p = get_foo_p ();
47 if (p != foo)
48 __builtin_abort ();
49 if ((*p) () != -30)
50 __builtin_abort ();
51
52 if (foo_ptr != foo)
53 __builtin_abort ();
54 if ((*foo_ptr) () != -30)
55 __builtin_abort ();
56 if (foo () != -30)
57 __builtin_abort ();
58
59 printf ("PASS\n");
60
61 return 0;
62 }