GCC Middle and Back End API Reference
tree-profile.cc File Reference
#include "config.h"
#include "system.h"
#include "coretypes.h"
#include "memmodel.h"
#include "backend.h"
#include "target.h"
#include "tree.h"
#include "gimple.h"
#include "cfghooks.h"
#include "tree-pass.h"
#include "ssa.h"
#include "cgraph.h"
#include "coverage.h"
#include "diagnostic-core.h"
#include "fold-const.h"
#include "varasm.h"
#include "tree-nested.h"
#include "gimplify.h"
#include "gimple-iterator.h"
#include "gimplify-me.h"
#include "tree-cfg.h"
#include "tree-into-ssa.h"
#include "value-prof.h"
#include "profile.h"
#include "tree-cfgcleanup.h"
#include "stringpool.h"
#include "attribs.h"
#include "tree-pretty-print.h"
#include "langhooks.h"
#include "stor-layout.h"
#include "xregex.h"
#include "alloc-pool.h"
#include "symbol-summary.h"
#include "symtab-thunks.h"
#include "cfganal.h"
#include "gt-tree-profile.h"
Include dependency graph for tree-profile.cc:

Data Structures

struct  condcov
 

Macros

#define CONDITIONS_MAX_TERMS   (TYPE_PRECISION (gcov_type_node))
 
#define EDGE_CONDITION   (EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)
 
#define HAVE_sync_compare_and_swapsi   0
 
#define HAVE_atomic_compare_and_swapsi   0
 
#define HAVE_sync_compare_and_swapdi   0
 
#define HAVE_atomic_compare_and_swapdi   0
 

Enumerations

enum  counter_update_method { COUNTER_UPDATE_SINGLE_THREAD , COUNTER_UPDATE_ATOMIC_BUILTIN , COUNTER_UPDATE_ATOMIC_SPLIT , COUNTER_UPDATE_ATOMIC_PARTIAL }
 

Functions

size_t cov_length (const struct condcov *cov)
 
array_slice< basic_blockcov_blocks (struct condcov *cov, size_t n)
 
array_slice< uint64_tcov_masks (struct condcov *cov, size_t n)
 
array_slice< sbitmapcov_maps (struct condcov *cov, size_t n)
 
void cov_free (struct condcov *cov)
 
struct condcovfind_conditions (struct function *fn)
 
size_t instrument_decisions (array_slice< basic_block > expr, size_t condno, array_slice< sbitmap > maps, array_slice< uint64_t > masks)
 
static void init_ic_make_global_vars (void)
 
void gimple_init_gcov_profiler (void)
 
static void gen_assign_counter_update (gimple_stmt_iterator *gsi, gcall *call, tree func, tree result, const char *name)
 
static void gen_counter_update (gimple_stmt_iterator *gsi, tree counter, tree result, const char *name)
 
void gimple_gen_edge_profiler (int edgeno, edge e)
 
static tree prepare_instrumented_value (gimple_stmt_iterator *gsi, histogram_value value)
 
void gimple_gen_interval_profiler (histogram_value value, unsigned tag)
 
void gimple_gen_pow2_profiler (histogram_value value, unsigned tag)
 
void gimple_gen_topn_values_profiler (histogram_value value, unsigned tag)
 
void gimple_gen_ic_profiler (histogram_value value, unsigned tag)
 
void gimple_gen_ic_func_profiler (void)
 
void gimple_gen_time_profiler (unsigned tag)
 
void gimple_gen_average_profiler (histogram_value value, unsigned tag)
 
void gimple_gen_ior_profiler (histogram_value value, unsigned tag)
 
static void parse_profile_filter (const char *regex, vec< regex_t > *v, const char *flag_name)
 
static void parse_profile_file_filtering ()
 
static void release_profile_file_filtering ()
 
static bool include_source_file_for_profile (const char *filename)
 
static unsigned int tree_profiling (void)
 
simple_ipa_opt_passmake_pass_ipa_tree_profile (gcc::context *ctxt)
 

Variables

static tree gcov_type_node
 
static tree tree_interval_profiler_fn
 
static tree tree_pow2_profiler_fn
 
static tree tree_topn_values_profiler_fn
 
static tree tree_indirect_call_profiler_fn
 
static tree tree_average_profiler_fn
 
static tree tree_ior_profiler_fn
 
static tree tree_time_profiler_counter
 
static tree ic_tuple_var
 
static tree ic_tuple_counters_field
 
static tree ic_tuple_callee_field
 
static counter_update_method counter_update = COUNTER_UPDATE_SINGLE_THREAD
 
static vec< regex_tprofile_filter_files
 
static vec< regex_tprofile_exclude_files
 

Macro Definition Documentation

◆ CONDITIONS_MAX_TERMS

#define CONDITIONS_MAX_TERMS   (TYPE_PRECISION (gcov_type_node))
Only instrument terms with fewer than number of bits in a (wide) gcov
integer, which is probably 64.  The algorithm itself does not impose this
limitation, but it makes for a simpler implementation.

* Allocating the output data structure (coverage_counter_alloc ()) can
  assume pairs of gcov_type_unsigned and not use a separate length field.
* A pair gcov_type_unsigned can be used as accumulators.
* Updating accumulators is can use the bitwise operations |=, &= and not
  custom operators that work for arbitrary-sized bit-sets.

Most real-world code should be unaffected by this, but it is possible
(especially for generated code) to exceed this limit.   

Referenced by find_conditions().

◆ EDGE_CONDITION

#define EDGE_CONDITION   (EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)

Referenced by instrument_decisions().

◆ HAVE_atomic_compare_and_swapdi

#define HAVE_atomic_compare_and_swapdi   0

Referenced by tree_profiling().

◆ HAVE_atomic_compare_and_swapsi

#define HAVE_atomic_compare_and_swapsi   0

Referenced by tree_profiling().

◆ HAVE_sync_compare_and_swapdi

#define HAVE_sync_compare_and_swapdi   0

Referenced by tree_profiling().

◆ HAVE_sync_compare_and_swapsi

#define HAVE_sync_compare_and_swapsi   0

Referenced by tree_profiling().

Enumeration Type Documentation

◆ counter_update_method

Types of counter update methods.

By default, the counter updates are done for a single threaded system
(COUNTER_UPDATE_SINGLE_THREAD).

If the user selected atomic profile counter updates
(-fprofile-update=atomic), then the counter updates will be done atomically
on a best-effort basis.  One of three methods to do the counter updates is
selected according to the target capabilities.

Ideally, the counter updates are done through atomic operations in hardware
(COUNTER_UPDATE_ATOMIC_BUILTIN).

If the target supports only 32-bit atomic increments and gcov_type_node is a
64-bit integer type, then for the profile edge counters the increment is
performed through two separate 32-bit atomic increments
(COUNTER_UPDATE_ATOMIC_SPLIT or COUNTER_UPDATE_ATOMIC_PARTIAL).  If the
target supports libatomic (targetm.have_libatomic), then other counter
updates are carried out by libatomic calls (COUNTER_UPDATE_ATOMIC_SPLIT).
If the target does not support libatomic, then the other counter updates are
not done atomically (COUNTER_UPDATE_ATOMIC_PARTIAL) and a warning is
issued.

If the target does not support atomic operations in hardware, however,  it
supports libatomic, then all updates are carried out by libatomic calls
(COUNTER_UPDATE_ATOMIC_BUILTIN).   
Enumerator
COUNTER_UPDATE_SINGLE_THREAD 
COUNTER_UPDATE_ATOMIC_BUILTIN 
COUNTER_UPDATE_ATOMIC_SPLIT 
COUNTER_UPDATE_ATOMIC_PARTIAL 

Function Documentation

◆ cov_blocks()

array_slice< basic_block > cov_blocks ( struct condcov * cov,
size_t n )
The subgraph, exluding intermediates, for the nth Boolean expression.   

References begin(), end(), ggc_alloc(), and array_slice< T >::invalid().

Referenced by branch_prob(), and find_conditions().

◆ cov_free()

void cov_free ( struct condcov * cov)
Deleter for condcov.   

References ggc_alloc(), and sbitmap_vector_free().

Referenced by branch_prob().

◆ cov_length()

size_t cov_length ( const struct condcov * cov)
Get the length, that is the number of Boolean expression found.  cov_length
is the one-past index for cov_{blocks,masks,maps}.   

References ggc_alloc().

Referenced by branch_prob(), and find_conditions().

◆ cov_maps()

array_slice< sbitmap > cov_maps ( struct condcov * cov,
size_t n )
The maps for the nth Boolean expression.   

References begin(), end(), ggc_alloc(), and array_slice< T >::invalid().

Referenced by branch_prob(), and find_conditions().

◆ cov_masks()

array_slice< uint64_t > cov_masks ( struct condcov * cov,
size_t n )
The masks for the nth Boolean expression.   

References begin(), end(), ggc_alloc(), and array_slice< T >::invalid().

Referenced by branch_prob(), and find_conditions().

◆ find_conditions()

struct condcov * find_conditions ( struct function * fn)
Condition coverage (MC/DC)

Whalen, Heimdahl, De Silva in "Efficient Test Coverage Measurement for
MC/DC" describe an algorithm for modified condition/decision coverage based
on AST analysis.  This algorithm does analyzes the control flow graph
(interpreted as a binary decision diagram) to determine the masking vectors.
The individual phases are described in more detail closer to the
implementation.

The coverage only considers the positions, not the symbols, in a
conditional, e.g. !A || (!B && A) is a 3-term conditional even though A
appears twice.  Subexpressions have no effect on term ordering:
(a && (b || (c && d)) || e) comes out as [a b c d e].  Functions whose
arguments are Boolean expressions are treated as separate expressions, that
is, a && fn (b || c) && d is treated as [a _fn d] and [b c], not [a b c d].

The output for gcov is a vector of pairs of unsigned integers, interpreted
as bit-sets, where the bit index corresponds to the index of the condition
in the expression.

The returned condcov should be released by the caller with cov_free.   

References b, basic_block_info_for_fn, bitmap_set_bit, calculate_dominance_info(), CDI_DOMINATORS, CDI_POST_DOMINATORS, condcov::condcov(), CONDITIONS_MAX_TERMS, cov_blocks(), cov_length(), cov_maps(), cov_masks(), condcov::ctx, dom_info_available_p(), exprs, free_dominance_info(), ggc_alloc(), gimple_location(), gsi_last_bb(), gsi_stmt(), i, mark_dfs_back_edges(), n_basic_blocks_for_fn, and warning_at().

Referenced by branch_prob().

◆ gen_assign_counter_update()

static void gen_assign_counter_update ( gimple_stmt_iterator * gsi,
gcall * call,
tree func,
tree result,
const char * name )
inlinestatic
If RESULT is not null, then output instructions as GIMPLE trees to assign
the updated counter from CALL of FUNC to RESULT.  Insert the CALL and the
optional assignment instructions to GSI.  Use NAME for temporary values.   

References ggc_alloc(), gimple_build_assign(), gimple_set_lhs(), gsi_insert_after(), GSI_NEW_STMT, make_temp_ssa_name(), NULL, and TREE_TYPE.

Referenced by gen_counter_update().

◆ gen_counter_update()

◆ gimple_gen_average_profiler()

void gimple_gen_average_profiler ( histogram_value value,
unsigned tag )
Output instructions as GIMPLE trees to increment the average histogram
counter.  VALUE is the expression whose value is profiled.  TAG is the
tag of the section for counters, BASE is offset of the counter position.   

References force_gimple_operand_gsi(), ggc_alloc(), gimple_build_call(), gsi_for_stmt(), gsi_insert_before(), GSI_NEW_STMT, GSI_SAME_STMT, histogram_value_t::hvalue, NULL_TREE, prepare_instrumented_value(), histogram_value_t::stmt, tree_average_profiler_fn, and tree_coverage_counter_addr().

Referenced by instrument_values().

◆ gimple_gen_edge_profiler()

void gimple_gen_edge_profiler ( int edgeno,
edge e )
Output instructions as GIMPLE trees to increment the edge
execution count, and insert them on E.   

References gen_counter_update(), ggc_alloc(), gsi_last(), NULL_TREE, PENDING_STMT, and tree_coverage_counter_ref().

Referenced by instrument_edges().

◆ gimple_gen_ic_func_profiler()

◆ gimple_gen_ic_profiler()

void gimple_gen_ic_profiler ( histogram_value value,
unsigned tag )
Output instructions as GIMPLE trees for code to find the most
common called function in indirect call.
VALUE is the call expression whose indirect callee is profiled.
TAG is the tag of the section for counters.   

References build3(), build_pointer_type(), force_gimple_operand_gsi(), get_gcov_type(), ggc_alloc(), gimple_build_assign(), gsi_for_stmt(), gsi_insert_before(), GSI_SAME_STMT, histogram_value_t::hvalue, ic_tuple_callee_field, ic_tuple_counters_field, ic_tuple_var, make_temp_ssa_name(), NULL, NULL_TREE, ptr_type_node, histogram_value_t::stmt, tree_coverage_counter_addr(), unshare_expr(), and histogram_value_t::value.

Referenced by instrument_values().

◆ gimple_gen_interval_profiler()

void gimple_gen_interval_profiler ( histogram_value value,
unsigned tag )

◆ gimple_gen_ior_profiler()

void gimple_gen_ior_profiler ( histogram_value value,
unsigned tag )
Output instructions as GIMPLE trees to increment the ior histogram
counter.  VALUE is the expression whose value is profiled.  TAG is the
tag of the section for counters, BASE is offset of the counter position.   

References force_gimple_operand_gsi(), ggc_alloc(), gimple_build_call(), gsi_for_stmt(), gsi_insert_before(), GSI_NEW_STMT, GSI_SAME_STMT, histogram_value_t::hvalue, NULL_TREE, prepare_instrumented_value(), histogram_value_t::stmt, tree_coverage_counter_addr(), and tree_ior_profiler_fn.

Referenced by instrument_values().

◆ gimple_gen_pow2_profiler()

void gimple_gen_pow2_profiler ( histogram_value value,
unsigned tag )
Output instructions as GIMPLE trees to increment the power of two histogram
counter.  VALUE is the expression whose value is profiled.  TAG is the tag
of the section for counters.   

References force_gimple_operand_gsi(), ggc_alloc(), gimple_build_call(), gsi_for_stmt(), gsi_insert_before(), GSI_NEW_STMT, GSI_SAME_STMT, histogram_value_t::hvalue, NULL_TREE, prepare_instrumented_value(), histogram_value_t::stmt, tree_coverage_counter_addr(), and tree_pow2_profiler_fn.

Referenced by instrument_values().

◆ gimple_gen_time_profiler()

void gimple_gen_time_profiler ( unsigned tag)
Output instructions as GIMPLE tree at the beginning for each function.
TAG is the tag of the section for counters, BASE is offset of the
counter position and GSI is the iterator we place the counter.   

References build_int_cst(), cfun, ENTRY_BLOCK_PTR_FOR_FN, force_gimple_operand_gsi(), gen_counter_update(), get_gcov_type(), ggc_alloc(), gimple_build_cond(), gsi_insert_before(), GSI_NEW_STMT, GSI_SAME_STMT, gsi_start_bb(), make_edge(), NULL, NULL_TREE, single_succ_edge(), split_edge(), tree_coverage_counter_ref(), tree_time_profiler_counter, and profile_probability::unlikely().

Referenced by instrument_values().

◆ gimple_gen_topn_values_profiler()

void gimple_gen_topn_values_profiler ( histogram_value value,
unsigned tag )
Output instructions as GIMPLE trees for code to find the most N common
values.  VALUE is the expression whose value is profiled.  TAG is the tag
of the section for counters.   

References force_gimple_operand_gsi(), ggc_alloc(), gimple_build_call(), gsi_for_stmt(), gsi_insert_before(), GSI_NEW_STMT, GSI_SAME_STMT, histogram_value_t::hvalue, NULL_TREE, prepare_instrumented_value(), histogram_value_t::stmt, tree_coverage_counter_addr(), and tree_topn_values_profiler_fn.

Referenced by instrument_values().

◆ gimple_init_gcov_profiler()

◆ include_source_file_for_profile()

static bool include_source_file_for_profile ( const char * filename)
static
Return true when FILENAME should be instrumented based on
-fprofile-filter-files and -fprofile-exclude-files options.   

References ggc_alloc(), i, NULL, profile_exclude_files, and profile_filter_files.

Referenced by tree_profiling().

◆ init_ic_make_global_vars()

static void init_ic_make_global_vars ( void )
static
Do initialization work for the edge profiler.   
Add code:
  __thread gcov*        __gcov_indirect_call.counters; // pointer to actual counter
  __thread void*        __gcov_indirect_call.callee; // actual callee address
  __thread int __gcov_function_counter; // time profiler function counter

References build_decl(), build_pointer_type(), BUILTINS_LOCATION, DECL_ARTIFICIAL, DECL_CHAIN, decl_default_tls_model(), DECL_EXTERNAL, DECL_INITIAL, finish_builtin_struct(), get_gcov_type(), get_identifier(), ggc_alloc(), ic_tuple_callee_field, ic_tuple_counters_field, ic_tuple_var, lang_hooks_for_types::make_type, NULL, NULL_TREE, ptr_type_node, set_decl_tls_model(), targetm, TREE_PUBLIC, lang_hooks::types, and UNKNOWN_LOCATION.

Referenced by gimple_init_gcov_profiler().

◆ instrument_decisions()

size_t instrument_decisions ( array_slice< basic_block > expr,
size_t condno,
array_slice< sbitmap > maps,
array_slice< uint64_t > masks )
Add instrumentation to a decision subgraph.  EXPR should be the
(topologically sorted) block of nodes returned by cov_blocks, MAPS the
bitmaps returned by cov_maps, and MASKS the block of bitsets returned by
cov_masks.  CONDNO should be the index of this condition in the function,
i.e. the same argument given to cov_{masks,graphs}.  EXPR may contain nodes
in-between the conditions, e.g.  when an operand contains a function call,
or there is a setjmp and the cfg is filled with complex edges.

Every node is annotated with three counters; the true, false, and mask
value.  First, walk the graph and determine what if there are multiple
possible values for either accumulator depending on the path taken, in which
case a phi node is created and registered as the accumulator.  Then, those
values are pushed as accumulators to the immediate successors.  For some
very particular programs there may be multiple paths into the expression
(e.g. when prior terms are determined by a surrounding conditional) in which
case the default zero-counter is pushed, otherwise all predecessors will
have been considered before the successor because of topologically ordered
traversal.  Finally, expr is traversed again to look for edges to the
outcomes, that is, edges with a destination outside of expr, and the local
accumulators are flushed to the global gcov counters on these edges.  In
some cases there are edge splits that cause 3+ edges to the two outcome
nodes.

If a complex edge is taken (e.g. on a longjmp) the accumulators are
attempted poisoned so that there would be no change to the global counters,
but this has proven unreliable in the presence of undefined behavior, see
the setjmp003 test.

It is important that the flushes happen on the basic condition outgoing
edge, otherwise flushes could be lost to exception handling or other
abnormal control flow.   

References b, bitmap_bit_p, bitmap_count_bits(), build_addr(), build_int_cst(), builtin_decl_explicit(), candidates, EDGE_COMPLEX, EDGE_CONDITION, expr, gcc_assert, gcc_checking_assert, gcov_type_node, ggc_alloc(), gimple_build_call(), gsi_insert_on_edge(), integer_type_node, MEMMODEL_RELAXED, NULL, PROFILE_UPDATE_ATOMIC, table, tree_coverage_counter_ref(), TYPE_PRECISION, and unshare_expr().

Referenced by branch_prob().

◆ make_pass_ipa_tree_profile()

simple_ipa_opt_pass * make_pass_ipa_tree_profile ( gcc::context * ctxt)

References ggc_alloc().

◆ parse_profile_file_filtering()

static void parse_profile_file_filtering ( )
static
Parse values of -fprofile-filter-files and -fprofile-exclude-files
options.   

References ggc_alloc(), parse_profile_filter(), profile_exclude_files, and profile_filter_files.

Referenced by tree_profiling().

◆ parse_profile_filter()

static void parse_profile_filter ( const char * regex,
vec< regex_t > * v,
const char * flag_name )
static
Parse list of provided REGEX (separated with semi-collon) and
create expressions (of type regex_t) and save them into V vector.
If there is a regular expression parsing error, error message is
printed for FLAG_NAME.   

References error(), ggc_alloc(), NULL, and r.

Referenced by parse_profile_file_filtering().

◆ prepare_instrumented_value()

◆ release_profile_file_filtering()

static void release_profile_file_filtering ( )
static
Parse vectors of regular expressions.   

References profile_exclude_files, and profile_filter_files.

Referenced by tree_profiling().

◆ tree_profiling()

static unsigned int tree_profiling ( void )
static
Profile all functions in the callgraph.   

References AVAIL_NOT_AVAILABLE, branch_prob(), build_qualified_type(), BUILTINS_LOCATION, CDI_DOMINATORS, CDI_POST_DOMINATORS, cfun, cleanup_tree_cfg(), cgraph_node::clone_of, counter_update, COUNTER_UPDATE_ATOMIC_BUILTIN, COUNTER_UPDATE_ATOMIC_PARTIAL, COUNTER_UPDATE_ATOMIC_SPLIT, symtab_node::decl, DECL_ATTRIBUTES, DECL_EXTERNAL, DECL_SOURCE_LOCATION, DECL_STRUCT_FUNCTION, del_node_map(), dump_file, dump_flags, dump_function_header(), execute_fixup_cfg(), expand_thunk(), FOR_EACH_BB_FN, FOR_EACH_DEFINED_FUNCTION, free_dominance_info(), gcc_assert, cgraph_node::get(), cgraph_node::get_availability(), get_gcov_type(), ggc_alloc(), gimple_call_fndecl(), gimple_call_fntype(), gimple_call_internal_p(), gimple_call_set_fntype(), gimple_gen_ic_func_profiler(), gimple_has_body_p(), gimple_value_profile_transformations(), gsi_end_p(), gsi_next(), gsi_start_bb(), gsi_stmt(), handle_missing_profiles(), HAVE_atomic_compare_and_swapdi, HAVE_atomic_compare_and_swapsi, HAVE_sync_compare_and_swapdi, HAVE_sync_compare_and_swapsi, include_source_file_for_profile(), init_node_map(), IPA_SSA, LOCATION_FILE, lookup_attribute(), parse_profile_file_filtering(), pop_cfun(), PROFILE_READ, profile_status_for_fn, PROFILE_UPDATE_ATOMIC, PROFILE_UPDATE_PREFER_ATOMIC, PROFILE_UPDATE_SINGLE, push_cfun(), read_thunk_profile(), cgraph_edge::rebuild_edges(), release_profile_file_filtering(), cgraph_node::set_const_flag(), cgraph_node::set_pure_flag(), symbol_table::state, stdarg_p(), symtab, targetm, cgraph_node::thunk, TODO_cleanup_cfg, TODO_update_ssa, tree_to_uhwi(), TREE_TYPE, TYPE_QUALS, TYPE_READONLY, TYPE_SIZE_UNIT, update_ssa(), update_stmt(), and warning().

Variable Documentation

◆ counter_update

◆ gcov_type_node

tree gcov_type_node
static
Calculate branch probabilities, and basic block execution counts.
   Copyright (C) 1990-2024 Free Software Foundation, Inc.
   Contributed by James E. Wilson, UC Berkeley/Cygnus Support;
   based on some ideas from Dain Samples of UC Berkeley.
   Further mangling by Bob Manson, Cygnus Support.
   Converted to use trees by Dale Johannesen, Apple Computer.

This file is part of GCC.

GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 3, or (at your option) any later
version.

GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.

You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.   
Generate basic block profile instrumentation and auxiliary files.
Tree-based version.  See profile.cc for overview.   

Referenced by gen_counter_update(), gimple_gen_ic_func_profiler(), gimple_init_gcov_profiler(), instrument_decisions(), prepare_instrumented_value(), tree_coverage_counter_addr(), and tree_coverage_counter_ref().

◆ ic_tuple_callee_field

◆ ic_tuple_counters_field

tree ic_tuple_counters_field
static

◆ ic_tuple_var

◆ profile_exclude_files

◆ profile_filter_files

◆ tree_average_profiler_fn

tree tree_average_profiler_fn
static

◆ tree_indirect_call_profiler_fn

tree tree_indirect_call_profiler_fn
static

◆ tree_interval_profiler_fn

tree tree_interval_profiler_fn
static

◆ tree_ior_profiler_fn

tree tree_ior_profiler_fn
static

◆ tree_pow2_profiler_fn

tree tree_pow2_profiler_fn
static

◆ tree_time_profiler_counter

tree tree_time_profiler_counter
static

◆ tree_topn_values_profiler_fn

tree tree_topn_values_profiler_fn
static