aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMartin Jambor <mjambor@suse.cz>2019-11-28 15:39:48 +0000
committerMartin Jambor <mjambor@suse.cz>2019-11-28 15:39:48 +0000
commite87ceb1a048f9754adf8ee671e031eeb13b6d0a6 (patch)
treecd9141bc7986db875bf61ac841ff0f056253111b /gcc
parentaa0377d766db2c7ded20346770b2e2ff4255dfe4 (diff)
cgraph: ifunc resolvers cannot be made local (PR 92697)
2019-11-28 Martin Jambor <mjambor@suse.cz> PR ipa/92697 * cgraph.c (cgraph_node_cannot_be_local_p_1): Return true for ifunc_resolvers. * symtab.c (symtab_node::dump_base): Dump ifunc_resolver flag. Removed trailig whitespace. testsuite/ * g++.dg/ipa/pr92697.C: New. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@278812 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/cgraph.c1
-rw-r--r--gcc/symtab.c4
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/ipa/pr92697.C51
5 files changed, 68 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 064dd8ef83e..60863539404 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2019-11-28 Martin Jambor <mjambor@suse.cz>
+
+ PR ipa/92697
+ * cgraph.c (cgraph_node_cannot_be_local_p_1): Return true for
+ ifunc_resolvers.
+ * symtab.c (symtab_node::dump_base): Dump ifunc_resolver flag.
+ Removed trailig whitespace.
+
2019-11-28 Jan Hubicka <hubicka@ucw.cz>
* profile-count.h (profile_count::combine_with_ipa_count_within):
diff --git a/gcc/cgraph.c b/gcc/cgraph.c
index 1f7a5c58d98..dd07516b83e 100644
--- a/gcc/cgraph.c
+++ b/gcc/cgraph.c
@@ -2227,6 +2227,7 @@ static bool
cgraph_node_cannot_be_local_p_1 (cgraph_node *node, void *)
{
return !(!node->force_output
+ && !node->ifunc_resolver
&& ((DECL_COMDAT (node->decl)
&& !node->forced_by_abi
&& !node->used_from_object_file_p ()
diff --git a/gcc/symtab.c b/gcc/symtab.c
index 3e634e22c86..5a3122fc8bb 100644
--- a/gcc/symtab.c
+++ b/gcc/symtab.c
@@ -914,8 +914,10 @@ symtab_node::dump_base (FILE *f)
if (DECL_STATIC_DESTRUCTOR (decl))
fprintf (f, " destructor");
}
+ if (ifunc_resolver)
+ fprintf (f, " ifunc_resolver");
fprintf (f, "\n");
-
+
if (same_comdat_group)
fprintf (f, " Same comdat group as: %s\n",
same_comdat_group->dump_asm_name ());
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a7533838f98..eeb4379b5d0 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2019-11-28 Martin Jambor <mjambor@suse.cz>
+
+ PR ipa/92697
+ * g++.dg/ipa/pr92697.C: New.
+
2019-11-28 Richard Biener <rguenther@suse.de>
PR tree-optimization/92645
diff --git a/gcc/testsuite/g++.dg/ipa/pr92697.C b/gcc/testsuite/g++.dg/ipa/pr92697.C
new file mode 100644
index 00000000000..8958bd0dcf2
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ipa/pr92697.C
@@ -0,0 +1,51 @@
+/* { dg-do compile } */
+/* { dg-require-ifunc "" } */
+/* { dg-options "-O2 -fdump-ipa-sra" } */
+
+extern int have_avx2;
+extern int have_ssse3;
+
+namespace NTL
+{
+
+ static void randomstream_impl_init_base ()
+ {
+ __builtin_printf ("Frob1\n");
+ }
+
+ static void // __attribute__ ((target ("ssse3")))
+ randomstream_impl_init_ssse3 ()
+ {
+ __builtin_printf ("Frob2\n");
+ }
+
+ static void
+ //__attribute__ ((target ("avx2,fma,avx,pclmul,ssse3")))
+ randomstream_impl_init_avx2 ()
+ {
+ __builtin_printf ("Frob3\n");
+ }
+
+ extern "C"
+ {
+ static void (*resolve_randomstream_impl_init (void)) ()
+ {
+ if (have_avx2)
+ return &randomstream_impl_init_avx2;
+ if (have_ssse3)
+ return &randomstream_impl_init_ssse3;
+ return &randomstream_impl_init_base;
+ }
+ }
+ static void
+ __attribute__ ((ifunc ("resolve_" "randomstream_impl_init")))
+ randomstream_impl_init ();
+ void foo ()
+ {
+ randomstream_impl_init ();
+ }
+
+}
+
+
+/* { dg-final { scan-ipa-dump-not "Created new node" "sra" } } */