diff options
Diffstat (limited to 'ld/testsuite/ld-ifunc/pr29216.c')
-rw-r--r-- | ld/testsuite/ld-ifunc/pr29216.c | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/ld/testsuite/ld-ifunc/pr29216.c b/ld/testsuite/ld-ifunc/pr29216.c new file mode 100644 index 0000000000..5019c723c2 --- /dev/null +++ b/ld/testsuite/ld-ifunc/pr29216.c @@ -0,0 +1,62 @@ +#include <stdio.h> + +static int +one (void) +{ + return -30; +} + +int foo (void) __attribute__ ((ifunc ("resolve_foo"))); + +void * +resolve_foo (void) +{ + return (void *) one; +} + +typedef int (*foo_p) (void); + +foo_p foo_ptr = foo; + +foo_p +__attribute__ ((noinline)) +get_foo_p (void) +{ + return foo_ptr; +} + +foo_p +__attribute__ ((noinline)) +get_foo (void) +{ + return foo; +} + +int +main (void) +{ + foo_p p; + + p = get_foo (); + if (p != foo) + __builtin_abort (); + if ((*p) () != -30) + __builtin_abort (); + + p = get_foo_p (); + if (p != foo) + __builtin_abort (); + if ((*p) () != -30) + __builtin_abort (); + + if (foo_ptr != foo) + __builtin_abort (); + if ((*foo_ptr) () != -30) + __builtin_abort (); + if (foo () != -30) + __builtin_abort (); + + printf ("PASS\n"); + + return 0; +} |