From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2140) id D1B043857007; Thu, 4 Aug 2022 14:24:32 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org D1B043857007 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: f4b1a9fc2a729c93263f4fb19fb1614a8df21d32 Message-Id: <20220804142432.D1B043857007@sourceware.org> Date: Thu, 4 Aug 2022 14:24:32 +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:24:32 -0000 https://gcc.gnu.org/g:f4b1a9fc2a729c93263f4fb19fb1614a8df21d32 commit f4b1a9fc2a729c93263f4fb19fb1614a8df21d32 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 | 2 +- gcc/cgraph.h | 10 ++++++++++ gcc/config/i386/i386.cc | 4 ++-- gcc/symtab.cc | 2 +- gcc/tree-ssa-structalias.cc | 4 ++-- gcc/varasm.cc | 2 +- 6 files changed, 17 insertions(+), 7 deletions(-) diff --git a/gcc/cgraph.cc b/gcc/cgraph.cc index 8d6ed38efa2..69988c6854a 100644 --- a/gcc/cgraph.cc +++ b/gcc/cgraph.cc @@ -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..649f14b9cb4 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); 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. */