Home | History | Annotate | Download | only in testsuite
      1 /* Test STT_GNU_IFUNC symbols:
      2 
      3    1. Direct function call.
      4    2. Function pointer.
      5    3. Visibility.
      6  */
      7 #include "ifunc-sel.h"
      8 
      9 int global __attribute__ ((visibility ("hidden"))) = -1;
     10 
     11 static int
     12 one (void)
     13 {
     14   return 1;
     15 }
     16 
     17 static int
     18 minus_one (void)
     19 {
     20   return -1;
     21 }
     22 
     23 static int
     24 zero (void)
     25 {
     26   return 0;
     27 }
     28 
     29 void * foo_ifunc (void) __asm__ ("foo");
     30 __asm__(".type foo, %gnu_indirect_function");
     31 
     32 void *
     33 foo_ifunc (void)
     34 {
     35   return ifunc_sel (one, minus_one, zero);
     36 }
     37 
     38 void * foo_hidden_ifunc (void) __asm__ ("foo_hidden");
     39 __asm__(".type foo_hidden, %gnu_indirect_function");
     40 
     41 void *
     42 foo_hidden_ifunc (void)
     43 {
     44   return ifunc_sel (minus_one, one, zero);
     45 }
     46 
     47 void * foo_protected_ifunc (void) __asm__ ("foo_protected");
     48 __asm__(".type foo_protected, %gnu_indirect_function");
     49 
     50 void *
     51 foo_protected_ifunc (void)
     52 {
     53   return ifunc_sel (one, zero, minus_one);
     54 }
     55 
     56 /* Test hidden indirect function.  */
     57 __asm__(".hidden foo_hidden");
     58 
     59 /* Test protected indirect function.  */
     60 __asm__(".protected foo_protected");
     61 
     62 extern int foo (void);
     63 extern int foo_hidden (void);
     64 extern int foo_protected (void);
     65 extern int ret_foo;
     66 extern int ret_foo_hidden;
     67 extern int ret_foo_protected;
     68 
     69 #define FOO_P
     70 typedef int (*foo_p) (void);
     71 
     72 extern foo_p get_foo_p (void);
     73 extern foo_p get_foo_hidden_p (void);
     74 extern foo_p get_foo_protected_p (void);
     75 
     76 foo_p
     77 get_foo_p (void)
     78 {
     79   ret_foo = foo ();
     80   return foo;
     81 }
     82 
     83 foo_p
     84 get_foo_hidden_p (void)
     85 {
     86   ret_foo_hidden = foo_hidden ();
     87   return foo_hidden;
     88 }
     89 
     90 foo_p
     91 get_foo_protected_p (void)
     92 {
     93   ret_foo_protected = foo_protected ();
     94   return foo_protected;
     95 }
     96