@@ -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 ()
@@ -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 ());
new file mode 100644
@@ -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" } } */