GCC Middle and Back End API Reference
value-prof.h File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  histogram_value_t

Macros

#define COUNTER_FOR_HIST_TYPE(TYPE)   ((int) (TYPE) + GCOV_FIRST_VALUE_COUNTER)
#define HIST_TYPE_FOR_COUNTER(COUNTER)   ((enum hist_type) ((COUNTER) - GCOV_FIRST_VALUE_COUNTER))

Typedefs

typedef struct histogram_value_thistogram_value
typedef struct histogram_value_tconst_histogram_value
typedef vec< histogram_valuehistogram_values

Enumerations

enum  hist_type {
  HIST_TYPE_INTERVAL, HIST_TYPE_POW2, HIST_TYPE_SINGLE_VALUE, HIST_TYPE_CONST_DELTA,
  HIST_TYPE_INDIR_CALL, HIST_TYPE_AVERAGE, HIST_TYPE_IOR, HIST_TYPE_MAX
}

Functions

void gimple_find_values_to_profile (histogram_values *)
bool gimple_value_profile_transformations (void)
histogram_value gimple_histogram_value (struct function *, gimple)
histogram_value gimple_histogram_value_of_type (struct function *, gimple, enum hist_type)
void gimple_add_histogram_value (struct function *, gimple, histogram_value)
void dump_histograms_for_stmt (struct function *, FILE *, gimple)
void gimple_remove_histogram_value (struct function *, gimple, histogram_value)
void gimple_remove_stmt_histograms (struct function *, gimple)
void gimple_duplicate_stmt_histograms (struct function *, gimple, struct function *, gimple)
void gimple_move_stmt_histograms (struct function *, gimple, gimple)
void verify_histograms (void)
void free_histograms (void)
void stringop_block_profile (gimple, unsigned int *, HOST_WIDE_INT *)
gimple gimple_ic (gimple, struct cgraph_node *, int, gcov_type, gcov_type)
void gimple_init_edge_profiler (void)
void gimple_gen_edge_profiler (int, edge)
void gimple_gen_interval_profiler (histogram_value, unsigned, unsigned)
void gimple_gen_pow2_profiler (histogram_value, unsigned, unsigned)
void gimple_gen_one_value_profiler (histogram_value, unsigned, unsigned)
void gimple_gen_ic_profiler (histogram_value, unsigned, unsigned)
void gimple_gen_ic_func_profiler (void)
void gimple_gen_const_delta_profiler (histogram_value, unsigned, unsigned)
void gimple_gen_average_profiler (histogram_value, unsigned, unsigned)
void gimple_gen_ior_profiler (histogram_value, unsigned, unsigned)
void stream_out_histogram_value (struct output_block *, histogram_value)
void stream_in_histogram_value (struct lto_input_block *, gimple)
struct cgraph_nodefind_func_by_profile_id (int func_id)
void init_branch_prob (void)
void branch_prob (void)
void end_branch_prob (void)

Macro Definition Documentation

#define COUNTER_FOR_HIST_TYPE (   TYPE)    ((int) (TYPE) + GCOV_FIRST_VALUE_COUNTER)
#define HIST_TYPE_FOR_COUNTER (   COUNTER)    ((enum hist_type) ((COUNTER) - GCOV_FIRST_VALUE_COUNTER))

Typedef Documentation


Enumeration Type Documentation

enum hist_type

Definitions for transformations based on profile information for values. Copyright (C) 2003-2013 Free Software Foundation, Inc.

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/. Supported histogram types.

Enumerator:
HIST_TYPE_INTERVAL 
HIST_TYPE_POW2 
HIST_TYPE_SINGLE_VALUE 
HIST_TYPE_CONST_DELTA 
HIST_TYPE_INDIR_CALL 
HIST_TYPE_AVERAGE 
HIST_TYPE_IOR 
HIST_TYPE_MAX 

Function Documentation

void branch_prob ( void  )

Instrument and/or analyze program behavior based on program the CFG.

This function creates a representation of the control flow graph (of the function being compiled) that is suitable for the instrumentation of edges and/or converting measured edge counts to counts on the complete CFG.

When FLAG_PROFILE_ARCS is nonzero, this function instruments the edges in the flow graph that are needed to reconstruct the dynamic behavior of the flow graph. This data is written to the gcno file for gcov.

When FLAG_BRANCH_PROBABILITIES is nonzero, this function reads auxiliary information from the gcda file containing edge count information from previous executions of the function being compiled. In this case, the control flow graph is annotated with actual execution counts by compute_branch_probabilities().

Main entry point of this file.

 We can't handle cyclic regions constructed using abnormal edges.
 To avoid these we replace every source of abnormal edge by a fake
 edge from entry node and every destination by fake edge to exit.
 This keeps graph acyclic and our calculation exact for all normal
 edges except for exit and entrance ones.

 We also add fake exit edges for each call and asm statement in the
 basic, since it may not return.   
     Functions returning multiple times are not handled by extra edges.
     Instead we simply allow negative counts on edges from exit to the
     block past call and corresponding probabilities.  We can't go
     with the extra edges because that would result in flowgraph that
     needs to have fake edges outside the spanning tree.   
         It may happen that there are compiler generated statements
         without a locus at all.  Go through the basic block from the
         last to the first statement looking for a locus.   
         Edge with goto locus might get wrong coverage info unless
         it is the only edge out of BB.
         Don't do that when the locuses match, so
         if (blah) goto something;
         is not computed twice.   
         Avoid bbs that have both fake entry edge and also some
         exit edge.  One of those edges wouldn't be added to the
         spanning tree, but we can't instrument any of them.   
             Don't split the bbs containing __builtin_setjmp_receiver
             or __builtin_setjmp_dispatcher calls.  These are very
             special and don't expect anything to be inserted before
             them.   
 The basic blocks are expected to be numbered sequentially.   
     Mark edges we've replaced by fake edges above as ignored.   
 Create spanning tree from basic block graph, mark each edge that is
 on the spanning tree.  We insert as many abnormal and critical edges
 as possible to minimize number of edge splits necessary.   
 Fake edges that are not on the tree will not be instrumented, so
 mark them ignored.   
 Compute two different checksums. Note that we want to compute
 the checksum in only once place, since it depends on the shape
 of the control flow which can change during 
 various transformations.   
 Write the data from which gcov can reconstruct the basic block
 graph and function line numbers (the gcno file).   
     Basic block flags  
     Arcs  
                 On trees we don't have fallthru flags, but we can
                 recompute them from CFG shape.   
     Line numbers.   
     Initialize the output.   
         Notice GOTO expressions eliminated while constructing the CFG.   
             A file of NULL indicates the end of run.   
 For each edge not on the spanning tree, add counting code.   
     Commit changes done by instrumentation.   

References gimple_has_location(), and gsi_stmt().

void dump_histograms_for_stmt ( struct function ,
FILE *  ,
gimple   
)
void end_branch_prob ( void  )

Performs file-level cleanup after branch-prob processing is completed.

Referenced by rest_of_type_compilation().

struct cgraph_node* find_func_by_profile_id ( int  func_id)
read
void gimple_add_histogram_value ( struct function fun,
gimple  stmt,
histogram_value  hist 
)
void gimple_duplicate_stmt_histograms ( struct function fun,
gimple  stmt,
struct function ofun,
gimple  ostmt 
)
void gimple_find_values_to_profile ( histogram_values )
void gimple_gen_average_profiler ( histogram_value  ,
unsigned  ,
unsigned   
)
void gimple_gen_const_delta_profiler ( histogram_value  value,
unsigned  tag,
unsigned  base 
)

Output instructions as GIMPLE trees for code to find the most common value of a difference between two evaluations of an expression. VALUE is the expression whose value is profiled. TAG is the tag of the section for counters, BASE is offset of the counter position.

FIXME implement this.

Referenced by instrument_values().

void gimple_gen_edge_profiler ( int  ,
edge   
)
void gimple_gen_ic_func_profiler ( void  )

Output instructions as GIMPLE trees for code to find the most common called function in indirect call. Insert instructions at the beginning of every possible called function.

 Insert code:

stmt1: __gcov_indirect_call_profiler_v2 (profile_id,
                                         &current_function_decl)
 Workaround for binutils bug 14342.  Once it is fixed, remove lto path.   
 Set __gcov_indirect_call_callee to 0,
 so that calls from other modules won't get misattributed
 to the last caller of the current callee.  
void gimple_gen_ic_profiler ( histogram_value  ,
unsigned  ,
unsigned   
)
void gimple_gen_interval_profiler ( histogram_value  ,
unsigned  ,
unsigned   
)
void gimple_gen_ior_profiler ( histogram_value  ,
unsigned  ,
unsigned   
)
void gimple_gen_one_value_profiler ( histogram_value  ,
unsigned  ,
unsigned   
)
void gimple_gen_pow2_profiler ( histogram_value  ,
unsigned  ,
unsigned   
)
histogram_value gimple_histogram_value ( struct function ,
gimple   
)
histogram_value gimple_histogram_value_of_type ( struct function fun,
gimple  stmt,
enum hist_type  type 
)
gimple gimple_ic ( gimple  icall_stmt,
struct cgraph_node direct_call,
int  prob,
gcov_type  count,
gcov_type  all 
)

Do transformation

if (actual_callee_address == address_of_most_common_function/method) do direct call else old call

 Fix CFG.  
 Edge e_cd connects cond_bb to dcall_bb, etc; note the first letters.  
 Do not disturb existing EH edges from the indirect call.   
     The indirect call might be noreturn.   
 Insert PHI node for the call result if necessary.   
 Build an EH edge for the direct call if necessary.   
void gimple_init_edge_profiler ( void  )

In tree-profile.c.

Create the type and function decls for the interface with gcov.

     void (*) (gcov_type *, gcov_type, int, unsigned)   
     void (*) (gcov_type *, gcov_type)   
     void (*) (gcov_type *, gcov_type)   
     Workaround for binutils bug 14342.  Once it is fixed, remove lto path.   
         void (*) (gcov_type, void *)   
         void (*) (gcov_type, void *)   
     void (*) (gcov_type *, gcov_type)   
     LTO streamer needs assembler names.  Because we create these decls
     late, we need to initialize them by hand.   

References build_fn_decl(), build_function_type_list(), build_pointer_type(), DECL_ASSEMBLER_NAME, DECL_ATTRIBUTES, get_gcov_type(), get_identifier(), init_ic_make_global_vars(), integer_type_node, NULL, NULL_TREE, tree_cons, TREE_NOTHROW, unsigned_type_node, and void_type_node.

void gimple_move_stmt_histograms ( struct function ,
gimple  ,
gimple   
)
void gimple_remove_histogram_value ( struct function fun,
gimple  stmt,
histogram_value  hist 
)

Remove histogram HIST from STMT's histogram list.

References histogram_value_t::hvalue, and histogram_value_t::next.

void gimple_remove_stmt_histograms ( struct function ,
gimple   
)
bool gimple_value_profile_transformations ( void  )

GIMPLE based transformations.

         Transformations:   
         The order of things in this conditional controls which
         transformation is used when more than one is applicable.   
         It is expected that any code added by the transformations
         will be added before the current statement, and that the
         current statement remain valid (although possibly
         modified) upon return.   
             Original statement may no longer be in the same block.  

References gimple_bb(), gsi_for_stmt(), and gsi_stmt().

void init_branch_prob ( void  )

In profile.c.

Perform file-level initialization for branch-prob processing.

void stream_in_histogram_value ( struct lto_input_block ,
gimple   
)
void stream_out_histogram_value ( struct output_block ,
histogram_value   
)
void stringop_block_profile ( gimple  ,
unsigned int *  ,
HOST_WIDE_INT  
)

Even if we can hold bigger value in SIZE, INT_MAX is safe "infinity" for code generation strategies.

References build2, cfun, gimple_alloc_histogram_value(), histogram_value_t::hdata, HIST_TYPE_INTERVAL, HIST_TYPE_POW2, and histogram_value_t::intvl.

void verify_histograms ( void  )

Verify sanity of the histograms.