1 /* Test 3 STT_GNU_IFUNC symbols.  */
2 
3 #include "ifunc-sel.h"
4 
5 int global = -1;
6 /* Can't use __attribute__((visibility("protected"))) until the GCC bug:
7 
8    https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65248
9 
10    is fixed.  */
11 asm (".protected global");
12 
13 static int
one(void)14 one (void)
15 {
16   return 1;
17 }
18 
19 static int
minus_one(void)20 minus_one (void)
21 {
22   return -1;
23 }
24 
25 static int
zero(void)26 zero (void)
27 {
28   return 0;
29 }
30 
31 void * foo1_ifunc (void) __asm__ ("foo1");
32 __asm__(".type foo1, %gnu_indirect_function");
33 
34 void *
35 inhibit_stack_protector
foo1_ifunc(void)36 foo1_ifunc (void)
37 {
38   return ifunc_sel (one, minus_one, zero);
39 }
40 
41 void * foo2_ifunc (void) __asm__ ("foo2");
42 __asm__(".type foo2, %gnu_indirect_function");
43 
44 void *
45 inhibit_stack_protector
foo2_ifunc(void)46 foo2_ifunc (void)
47 {
48   return ifunc_sel (minus_one, one, zero);
49 }
50 
51 void * foo3_ifunc (void) __asm__ ("foo3");
52 __asm__(".type foo3, %gnu_indirect_function");
53 
54 void *
55 inhibit_stack_protector
foo3_ifunc(void)56 foo3_ifunc (void)
57 {
58   return ifunc_sel (one, zero, minus_one);
59 }
60