Hi.
This fixed issue where we have an ifunc function called from another ifunc
function.
One needs to properly make a reference redirection.
Patch can bootstrap on ppc64le-redhat-linux and survives regression tests.
MVC tests on x86_64 also work fine.
Ready for trunk?
Thanks,
Martin
gcc/ChangeLog:
2018-03-13 Martin Liska <[email protected]>
PR ipa/84833
* multiple_target.c (create_dispatcher_calls): Redirect
reference in the symbol table.
gcc/testsuite/ChangeLog:
2018-03-13 Martin Liska <[email protected]>
PR ipa/84833
* gcc.target/i386/mvc11.c: New test.
---
gcc/multiple_target.c | 4 ++++
gcc/testsuite/gcc.target/i386/mvc11.c | 28 ++++++++++++++++++++++++++++
2 files changed, 32 insertions(+)
create mode 100644 gcc/testsuite/gcc.target/i386/mvc11.c
diff --git a/gcc/multiple_target.c b/gcc/multiple_target.c
index a6767985774..46cf7a30733 100644
--- a/gcc/multiple_target.c
+++ b/gcc/multiple_target.c
@@ -144,6 +144,10 @@ create_dispatcher_calls (struct cgraph_node *node)
if (ref->referring->decl != resolver_decl)
walk_gimple_stmt (&it, NULL, replace_function_decl, &wi);
}
+
+ symtab_node *source = ref->referring;
+ ref->remove_reference ();
+ source->create_reference (inode, IPA_REF_ADDR);
}
else
gcc_unreachable ();
diff --git a/gcc/testsuite/gcc.target/i386/mvc11.c b/gcc/testsuite/gcc.target/i386/mvc11.c
new file mode 100644
index 00000000000..5bd10f4651d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/mvc11.c
@@ -0,0 +1,28 @@
+/* { dg-do run } */
+/* { dg-require-ifunc "" } */
+/* { dg-options "-std=gnu99" } */
+
+__attribute__((noipa)) int
+baz (int (*fn) (void))
+{
+ asm volatile ("" : "+g" (fn) : : "memory");
+ return fn ();
+}
+
+__attribute__((target_clones("arch=sandybridge", "default"))) static int
+bar (void)
+{
+ return 1;
+}
+
+__attribute__((target_clones("arch=sandybridge", "default"))) int
+foo (void)
+{
+ baz (bar) - 1;
+}
+
+int
+main ()
+{
+ foo ();
+}