> We can't profile indirect calls to IFUNC resolvers nor their callees as > it requires TLS which hasn't been set up yet when the dynamic linker is > resolving IFUNC symbols. > > Add an IFUNC resolver caller marker to cgraph_node and set it if the > function is called by an IFUNC resolver. Disable indirect call profiling > for IFUNC resolvers and their callees. > > Tested with profiledbootstrap on Fedora 39/x86-64. > > gcc/ChangeLog: > > PR tree-optimization/114115 > * cgraph.h (symtab_node): Add check_ifunc_callee_symtab_nodes. > (cgraph_node): Add called_by_ifunc_resolver. > * cgraphunit.cc (symbol_table::compile): Call > symtab_node::check_ifunc_callee_symtab_nodes. > * symtab.cc (check_ifunc_resolver): New. > (ifunc_ref_map): Likewise. > (is_caller_ifunc_resolver): Likewise. > (symtab_node::check_ifunc_callee_symtab_nodes): Likewise. > * tree-profile.cc (gimple_gen_ic_func_profiler): Disable indirect > call profiling for IFUNC resolvers and their callees. > > gcc/testsuite/ChangeLog: > > PR tree-optimization/114115 > * gcc.dg/pr114115.c: New test. > +/* { dg-final { scan-tree-dump-not "__gcov_indirect_call_profiler_v" > "optimized" } } */ > diff --git a/gcc/tree-profile.cc b/gcc/tree-profile.cc > index aed13e2b1bc..373dbd60481 100644 > --- a/gcc/tree-profile.cc > +++ b/gcc/tree-profile.cc > @@ -520,7 +520,10 @@ gimple_gen_ic_func_profiler (void) > gcall *stmt1; > tree tree_uid, cur_func, void0; > > - if (c_node->only_called_directly_p ()) > + /* Disable indirect call profiling for an IFUNC resolver and its > + callees. */ Please add a comment here referring to the PR and need to have TLS initialized.
OK witht that change. Honza