From 5f7cbeec7d698c4881ffbb55d9c3288536098d32 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Thu, 20 Nov 2014 10:48:47 -0800 Subject: [PATCH] Add ifunc-main IFUNC tests * 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. --- ld/testsuite/ChangeLog | 7 +++++++ ld/testsuite/ld-ifunc/ifunc-lib.c | 29 ++++++++++++++++++++++++++++ ld/testsuite/ld-ifunc/ifunc-main.c | 29 ++++++++++++++++++++++++++++ ld/testsuite/ld-ifunc/ifunc-main.out | 1 + ld/testsuite/ld-ifunc/ifunc.exp | 28 +++++++++++++++++++++++++++ 5 files changed, 94 insertions(+) create mode 100644 ld/testsuite/ld-ifunc/ifunc-lib.c create mode 100644 ld/testsuite/ld-ifunc/ifunc-main.c create mode 100644 ld/testsuite/ld-ifunc/ifunc-main.out diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index f8478bd7017..555d6bf6741 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2014-11-20 H.J. Lu + + * 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 * lib/ld-lib.exp (check_ifunc_available): New. diff --git a/ld/testsuite/ld-ifunc/ifunc-lib.c b/ld/testsuite/ld-ifunc/ifunc-lib.c new file mode 100644 index 00000000000..13ca25065a9 --- /dev/null +++ b/ld/testsuite/ld-ifunc/ifunc-lib.c @@ -0,0 +1,29 @@ +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; +} diff --git a/ld/testsuite/ld-ifunc/ifunc-main.c b/ld/testsuite/ld-ifunc/ifunc-main.c new file mode 100644 index 00000000000..a320cfbddaa --- /dev/null +++ b/ld/testsuite/ld-ifunc/ifunc-main.c @@ -0,0 +1,29 @@ +#include + +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; +} diff --git a/ld/testsuite/ld-ifunc/ifunc-main.out b/ld/testsuite/ld-ifunc/ifunc-main.out new file mode 100644 index 00000000000..d86bac9de59 --- /dev/null +++ b/ld/testsuite/ld-ifunc/ifunc-main.out @@ -0,0 +1 @@ +OK diff --git a/ld/testsuite/ld-ifunc/ifunc.exp b/ld/testsuite/ld-ifunc/ifunc.exp index d2382f891ba..03789a95028 100644 --- a/ld/testsuite/ld-ifunc/ifunc.exp +++ b/ld/testsuite/ld-ifunc/ifunc.exp @@ -418,6 +418,17 @@ if { ![check_ifunc_available] } { 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" \ @@ -428,4 +439,21 @@ run_ld_link_exec_tests [] [list \ "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" \ + ] \ ] -- 2.30.2