diff mbox series

Redirect reference in the symbol table (PR ipa/84833).

Message ID 74a3a5dd-2562-a5fc-53a6-93ca823f62ac@suse.cz
State New
Headers show
Series Redirect reference in the symbol table (PR ipa/84833). | expand

Commit Message

Martin Liška March 13, 2018, 1:35 p.m. UTC
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  <mliska@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  <mliska@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

Comments

Martin Liška March 16, 2018, 2:50 p.m. UTC | #1
On 03/13/2018 02:35 PM, Martin Liška wrote:
> 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  <mliska@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  <mliska@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
> 
> 

Honza approved that offline.

Martin
diff mbox series

Patch

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