From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2140) id 09FB2385740A; Thu, 4 Aug 2022 14:16:27 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 09FB2385740A Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Alexandre Oliva To: gcc-cvs@gcc.gnu.org Subject: [gcc(refs/users/aoliva/heads/testme)] ifunc alias: follow alias links testing for ifunc_resolver X-Act-Checkin: gcc X-Git-Author: Alexandre Oliva X-Git-Refname: refs/users/aoliva/heads/testme X-Git-Oldrev: 075683767abe15b936ad41792da6ee71e9eda449 X-Git-Newrev: 893ce0c3c7005715157dd9e8ebb4fe5633d94d90 Message-Id: <20220804141627.09FB2385740A@sourceware.org> Date: Thu, 4 Aug 2022 14:16:27 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 04 Aug 2022 14:16:27 -0000 https://gcc.gnu.org/g:893ce0c3c7005715157dd9e8ebb4fe5633d94d90 commit 893ce0c3c7005715157dd9e8ebb4fe5633d94d90 Author: Alexandre Oliva Date: Thu Aug 4 09:21:15 2022 -0300 ifunc alias: follow alias links testing for ifunc_resolver Diff: --- gcc/cgraph.cc | 4 ++-- gcc/cgraph.h | 12 +++++++++++- gcc/config/i386/i386.cc | 4 ++-- gcc/symtab.cc | 2 +- gcc/tree-ssa-structalias.cc | 4 ++-- gcc/varasm.cc | 2 +- 6 files changed, 19 insertions(+), 9 deletions(-) diff --git a/gcc/cgraph.cc b/gcc/cgraph.cc index 8d6ed38efa2..29f60d8a227 100644 --- a/gcc/cgraph.cc +++ b/gcc/cgraph.cc @@ -2369,7 +2369,7 @@ cgraph_node::get_availability (symtab_node *ref) avail = AVAIL_AVAILABLE; else if (transparent_alias) ultimate_alias_target (&avail, ref); - else if (ifunc_resolver + else if (ifunc_resolver_p () || lookup_attribute ("noipa", DECL_ATTRIBUTES (decl))) avail = AVAIL_INTERPOSABLE; else if (!externally_visible) @@ -2408,7 +2408,7 @@ static bool cgraph_node_cannot_be_local_p_1 (cgraph_node *node, void *) { return !(!node->force_output - && !node->ifunc_resolver + && !node->ifunc_resolver_p () /* Limitation of gas requires us to output targets of symver aliases as global symbols. This is binutils PR 25295. */ && !node->symver diff --git a/gcc/cgraph.h b/gcc/cgraph.h index 4be67e3cea9..2b81c06b047 100644 --- a/gcc/cgraph.h +++ b/gcc/cgraph.h @@ -1283,6 +1283,16 @@ struct GTY((tag ("SYMTAB_FUNCTION"))) cgraph_node : public symtab_node calls_comdat_local flag after function transformations. */ bool check_calls_comdat_local_p (); + /* Check if function is an [alias to] ifunc resolver. */ + bool ifunc_resolver_p () { + if (ifunc_resolver) + return true; + if (!alias) + return false; + cgraph_node *node = get_alias_target (); + return node && node->ifunc_resolver_p (); + } + /* Return true if function should be optimized for size. */ enum optimize_size_level optimize_for_size_p (void); @@ -3127,7 +3137,7 @@ cgraph_node::can_remove_if_no_direct_calls_and_refs_p (void) return false; /* Only COMDAT functions can be removed if externally visible. */ if (externally_visible - && ((!DECL_COMDAT (decl) || ifunc_resolver) + && ((!DECL_COMDAT (decl) || ifunc_resolver_p ()) || forced_by_abi || used_from_object_file_p ())) return false; diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc index 5e30dc884bf..e88621611c3 100644 --- a/gcc/config/i386/i386.cc +++ b/gcc/config/i386/i386.cc @@ -1020,7 +1020,7 @@ ix86_function_ok_for_sibcall (tree decl, tree exp) /* When PIC register is used, it must be restored after ifunc function returns. */ cgraph_node *node = cgraph_node::get (decl); - if (node && node->ifunc_resolver) + if (node && node->ifunc_resolver_p ()) return false; } @@ -16062,7 +16062,7 @@ ix86_call_use_plt_p (rtx call_op) /* NB: All ifunc functions must be called via PLT. */ cgraph_node *node = cgraph_node::get (SYMBOL_REF_DECL (call_op)); - if (node && node->ifunc_resolver) + if (node && node->ifunc_resolver_p ()) return true; } return false; diff --git a/gcc/symtab.cc b/gcc/symtab.cc index f2d96c0268b..b3176f729ab 100644 --- a/gcc/symtab.cc +++ b/gcc/symtab.cc @@ -2480,7 +2480,7 @@ symtab_node::binds_to_current_def_p (symtab_node *ref) return definition && get_alias_target()->binds_to_current_def_p (ref); cgraph_node *cnode = dyn_cast (this); - if (cnode && cnode->ifunc_resolver) + if (cnode && cnode->ifunc_resolver_p ()) return false; if (decl_binds_to_current_def_p (decl)) return true; diff --git a/gcc/tree-ssa-structalias.cc b/gcc/tree-ssa-structalias.cc index dcf13d939bd..6612ac917d4 100644 --- a/gcc/tree-ssa-structalias.cc +++ b/gcc/tree-ssa-structalias.cc @@ -6381,7 +6381,7 @@ create_variable_info_for (tree decl, const char *name, bool add_id) if (in_ipa_mode && TREE_CODE (decl) == FUNCTION_DECL && (node = cgraph_node::get (decl)) - && node->ifunc_resolver) + && node->ifunc_resolver_p ()) { varinfo_t fi = get_vi_for_tree (node->get_alias_target ()->decl); constraint_expr rhs @@ -8150,7 +8150,7 @@ associate_varinfo_to_alias (struct cgraph_node *node, void *data) || (node->thunk && ! node->inlined_to)) && node->analyzed - && !node->ifunc_resolver) + && !node->ifunc_resolver_p ()) insert_vi_for_tree (node->decl, (varinfo_t)data); return false; } diff --git a/gcc/varasm.cc b/gcc/varasm.cc index 4db8506b106..f5cbe67f3f1 100644 --- a/gcc/varasm.cc +++ b/gcc/varasm.cc @@ -7486,7 +7486,7 @@ default_binds_local_p_3 (const_tree exp, bool shlib, bool weak_dominate, || (!targetm.ifunc_ref_local_ok () && TREE_CODE (exp) == FUNCTION_DECL && cgraph_node::get (exp) - && cgraph_node::get (exp)->ifunc_resolver)) + && cgraph_node::get (exp)->ifunc_resolver_p ())) return false; /* Static variables are always local. */