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 9int global __attribute__ ((visibility ("hidden"))) = -1; 10 11static int 12one (void) 13{ 14 return 1; 15} 16 17static int 18minus_one (void) 19{ 20 return -1; 21} 22 23static int 24zero (void) 25{ 26 return 0; 27} 28 29void * foo_ifunc (void) __asm__ ("foo"); 30__asm__(".type foo, %gnu_indirect_function"); 31 32void * 33foo_ifunc (void) 34{ 35 return ifunc_sel (one, minus_one, zero); 36} 37 38void * foo_hidden_ifunc (void) __asm__ ("foo_hidden"); 39__asm__(".type foo_hidden, %gnu_indirect_function"); 40 41void * 42foo_hidden_ifunc (void) 43{ 44 return ifunc_sel (minus_one, one, zero); 45} 46 47void * foo_protected_ifunc (void) __asm__ ("foo_protected"); 48__asm__(".type foo_protected, %gnu_indirect_function"); 49 50void * 51foo_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 62extern int foo (void); 63extern int foo_hidden (void); 64extern int foo_protected (void); 65extern int ret_foo; 66extern int ret_foo_hidden; 67extern int ret_foo_protected; 68 69#define FOO_P 70typedef int (*foo_p) (void); 71 72extern foo_p get_foo_p (void); 73extern foo_p get_foo_hidden_p (void); 74extern foo_p get_foo_protected_p (void); 75 76foo_p 77get_foo_p (void) 78{ 79 ret_foo = foo (); 80 return foo; 81} 82 83foo_p 84get_foo_hidden_p (void) 85{ 86 ret_foo_hidden = foo_hidden (); 87 return foo_hidden; 88} 89 90foo_p 91get_foo_protected_p (void) 92{ 93 ret_foo_protected = foo_protected (); 94 return foo_protected; 95} 96