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  <mli...@suse.cz>

        PR ipa/84833
        * multiple_target.c (create_dispatcher_calls): Redirect
        reference in the symbol table.

gcc/testsuite/ChangeLog:

2018-03-13  Martin Liska  <mli...@suse.cz>

        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 ();
+}

Reply via email to