(root)/
binutils-2.41/
ld/
testsuite/
ld-ifunc/
pr29216.c
       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  }