* ld-ifunc/ifunc.exp: Run ifunc-main.
* ld-ifunc/ifunc-lib.c: New file.
* ld-ifunc/ifunc-main.c: Likewise.
* ld-ifunc/ifunc-main.out: Likewise.
+2014-11-20 H.J. Lu <hongjiu.lu@intel.com>
+
+ * ld-ifunc/ifunc.exp: Run ifunc-main.
+ * ld-ifunc/ifunc-lib.c: New file.
+ * ld-ifunc/ifunc-main.c: Likewise.
+ * ld-ifunc/ifunc-main.out: Likewise.
+
2014-11-20 H.J. Lu <hongjiu.lu@intel.com>
* lib/ld-lib.exp (check_ifunc_available): New.
--- /dev/null
+static int
+one (void)
+{
+ return 1;
+}
+
+static int
+minus_one (void)
+{
+ return -1;
+}
+
+void * foo_ifunc (void) __asm__ ("foo");
+__asm__(".type foo, %gnu_indirect_function");
+
+void *
+foo_ifunc (void)
+{
+ return one;
+}
+
+void * bar_ifunc (void) __asm__ ("bar");
+__asm__(".type bar, %gnu_indirect_function");
+
+void *
+bar_ifunc (void)
+{
+ return minus_one;
+}
--- /dev/null
+#include <stdio.h>
+
+extern int foo(void);
+extern int bar(void);
+
+int (*foo_ptr)(void) = foo;
+
+int
+main (void)
+{
+ int (*bar_ptr)(void) = bar;
+ if (bar_ptr != bar)
+ __builtin_abort ();
+ if (bar_ptr() != -1)
+ __builtin_abort ();
+ if (bar() != -1)
+ __builtin_abort ();
+
+ if (foo_ptr != foo)
+ __builtin_abort ();
+ if (foo_ptr() != 1)
+ __builtin_abort ();
+ if (foo() != 1)
+ __builtin_abort ();
+
+ printf ("OK\n");
+
+ return 0;
+}
return
}
+run_cc_link_tests [list \
+ [list \
+ "Build ifunc-lib.so" \
+ "-shared" \
+ "-fPIC" \
+ { ifunc-lib.c } \
+ {} \
+ "libifunc-lib.so" \
+ ] \
+]
+
run_ld_link_exec_tests [] [list \
[list \
"Run pr16467" \
"pr16467.out" \
"" \
] \
+ [list \
+ "Run ifunc-main" \
+ "tmpdir/libifunc-lib.so" \
+ "" \
+ { ifunc-main.c } \
+ "ifunc-main" \
+ "ifunc-main.out" \
+ ] \
+ [list \
+ "Run ifunc-main with -fpic" \
+ "tmpdir/libifunc-lib.so" \
+ "" \
+ { ifunc-main.c } \
+ "ifunc-main" \
+ "ifunc-main.out" \
+ "-fpic" \
+ ] \
]