diff options
author | H.J. Lu <hongjiu.lu@intel.com> | 2018-05-22 19:10:34 +0000 |
---|---|---|
committer | H.J. Lu <hjl@gcc.gnu.org> | 2018-05-22 12:10:34 -0700 |
commit | aab778d3825052d262e3fc6d87af67e7cc196273 (patch) | |
tree | f88364764fd0a5dbf2703b09f278a52dcaaddaef /gcc/cgraph.c | |
parent | 58c2ad42a89438281327c74afb3f7483ffe22514 (diff) | |
download | gcc-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.c | 7 |
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) |