> 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

Reply via email to