aboutsummaryrefslogtreecommitdiff
path: root/gcc/cgraph.c
diff options
context:
space:
mode:
authorH.J. Lu <hongjiu.lu@intel.com>2018-05-22 19:10:34 +0000
committerH.J. Lu <hjl@gcc.gnu.org>2018-05-22 12:10:34 -0700
commitaab778d3825052d262e3fc6d87af67e7cc196273 (patch)
treef88364764fd0a5dbf2703b09f278a52dcaaddaef /gcc/cgraph.c
parent58c2ad42a89438281327c74afb3f7483ffe22514 (diff)
downloadgcc-aab778d3825052d262e3fc6d87af67e7cc196273.zip
gcc-aab778d3825052d262e3fc6d87af67e7cc196273.tar.gz
gcc-aab778d3825052d262e3fc6d87af67e7cc196273.tar.bz2
Don't mark IFUNC resolver as only called directly
Since IFUNC resolver is called indirectly, don't mark IFUNC resolver as only called directly. This patch adds ifunc_resolver to cgraph_node, sets ifunc_resolver for ifunc attribute and checks ifunc_resolver instead of looking up ifunc attribute. gcc/ PR target/85345 * cgraph.h (cgraph_node::create): Set ifunc_resolver for ifunc attribute. (cgraph_node::create_alias): Likewise. (cgraph_node::get_availability): Check ifunc_resolver instead of looking up ifunc attribute. * cgraphunit.c (maybe_diag_incompatible_alias): Likewise. * varasm.c (do_assemble_alias): Likewise. (assemble_alias): Likewise. (default_binds_local_p_3): Likewise. * cgraph.h (cgraph_node): Add ifunc_resolver. (cgraph_node::only_called_directly_or_aliased_p): Return false for IFUNC resolver. * lto-cgraph.c (input_node): Set ifunc_resolver for ifunc attribute. * symtab.c (symtab_node::verify_base): Verify that ifunc_resolver is equivalent to lookup_attribute ("ifunc", DECL_ATTRIBUTES (decl)). (symtab_node::binds_to_current_def_p): Check ifunc_resolver instead of looking up ifunc attribute. gcc/testsuite/ PR target/85345 * gcc.target/i386/pr85345.c: New test. From-SVN: r260547
Diffstat (limited to 'gcc/cgraph.c')
-rw-r--r--gcc/cgraph.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/gcc/cgraph.c b/gcc/cgraph.c
index 9a7d54d..9f3a292 100644
--- a/gcc/cgraph.c
+++ b/gcc/cgraph.c
@@ -517,6 +517,9 @@ cgraph_node::create (tree decl)
g->have_offload = true;
}
+ if (lookup_attribute ("ifunc", DECL_ATTRIBUTES (decl)))
+ node->ifunc_resolver = true;
+
node->register_symbol ();
if (DECL_CONTEXT (decl) && TREE_CODE (DECL_CONTEXT (decl)) == FUNCTION_DECL)
@@ -575,6 +578,8 @@ cgraph_node::create_alias (tree alias, tree target)
alias_node->alias = true;
if (lookup_attribute ("weakref", DECL_ATTRIBUTES (alias)) != NULL)
alias_node->transparent_alias = alias_node->weakref = true;
+ if (lookup_attribute ("ifunc", DECL_ATTRIBUTES (alias)))
+ alias_node->ifunc_resolver = true;
return alias_node;
}
@@ -2299,7 +2304,7 @@ cgraph_node::get_availability (symtab_node *ref)
avail = AVAIL_AVAILABLE;
else if (transparent_alias)
ultimate_alias_target (&avail, ref);
- else if (lookup_attribute ("ifunc", DECL_ATTRIBUTES (decl))
+ else if (ifunc_resolver
|| lookup_attribute ("noipa", DECL_ATTRIBUTES (decl)))
avail = AVAIL_INTERPOSABLE;
else if (!externally_visible)