2011-02-04 14:45:46 +03:00
# ifndef __PERF_ANNOTATE_H
# define __PERF_ANNOTATE_H
# include <stdbool.h>
2012-04-25 21:16:03 +04:00
# include <stdint.h>
2014-04-25 23:31:02 +04:00
# include <linux/types.h>
2011-02-04 14:45:46 +03:00
# include "symbol.h"
2012-11-02 09:50:05 +04:00
# include "hist.h"
2013-02-07 13:02:08 +04:00
# include "sort.h"
2011-02-04 14:45:46 +03:00
# include <linux/list.h>
# include <linux/rbtree.h>
2012-09-08 04:43:19 +04:00
# include <pthread.h>
2011-02-04 14:45:46 +03:00
2012-04-19 17:16:27 +04:00
struct ins ;
2012-04-20 21:38:46 +04:00
struct ins_operands {
char * raw ;
2012-04-25 15:00:23 +04:00
struct {
2012-05-11 23:48:49 +04:00
char * raw ;
2012-04-25 15:00:23 +04:00
char * name ;
u64 addr ;
2012-05-11 23:48:49 +04:00
u64 offset ;
2012-04-25 15:00:23 +04:00
} target ;
2012-05-12 20:15:34 +04:00
union {
struct {
char * raw ;
char * name ;
u64 addr ;
} source ;
struct {
struct ins * ins ;
struct ins_operands * ops ;
} locked ;
} ;
2012-04-20 21:38:46 +04:00
} ;
2012-04-18 20:58:34 +04:00
struct ins_ops {
2012-05-12 20:26:20 +04:00
void ( * free ) ( struct ins_operands * ops ) ;
2012-04-20 21:38:46 +04:00
int ( * parse ) ( struct ins_operands * ops ) ;
2012-04-19 17:16:27 +04:00
int ( * scnprintf ) ( struct ins * ins , char * bf , size_t size ,
2012-05-08 01:54:16 +04:00
struct ins_operands * ops ) ;
2012-04-18 20:58:34 +04:00
} ;
struct ins {
const char * name ;
struct ins_ops * ops ;
} ;
bool ins__is_jump ( const struct ins * ins ) ;
2012-04-18 23:07:38 +04:00
bool ins__is_call ( const struct ins * ins ) ;
2012-05-08 01:54:16 +04:00
int ins__scnprintf ( struct ins * ins , char * bf , size_t size , struct ins_operands * ops ) ;
2012-04-18 20:58:34 +04:00
2013-03-05 09:53:30 +04:00
struct annotation ;
2012-04-15 22:24:39 +04:00
struct disasm_line {
2012-04-20 21:38:46 +04:00
struct list_head node ;
s64 offset ;
char * line ;
char * name ;
struct ins * ins ;
2014-11-13 05:05:26 +03:00
int line_nr ;
2012-04-20 21:38:46 +04:00
struct ins_operands ops ;
2011-02-04 14:45:46 +03:00
} ;
2012-04-25 21:16:03 +04:00
static inline bool disasm_line__has_offset ( const struct disasm_line * dl )
{
return dl - > ops . target . offset ! = UINT64_MAX ;
}
2012-04-15 22:24:39 +04:00
void disasm_line__free ( struct disasm_line * dl ) ;
struct disasm_line * disasm__get_next_ip_line ( struct list_head * head , struct disasm_line * pos ) ;
2012-05-08 01:54:16 +04:00
int disasm_line__scnprintf ( struct disasm_line * dl , char * bf , size_t size , bool raw ) ;
2012-04-15 22:52:18 +04:00
size_t disasm__fprintf ( struct list_head * head , FILE * fp ) ;
2013-03-05 09:53:30 +04:00
double disasm__calc_percent ( struct annotation * notes , int evidx , s64 offset ,
s64 end , const char * * path ) ;
2011-02-04 14:45:46 +03:00
struct sym_hist {
u64 sum ;
u64 addr [ 0 ] ;
} ;
2013-03-05 09:53:27 +04:00
struct source_line_percent {
2011-02-04 14:45:46 +03:00
double percent ;
2012-11-09 09:58:49 +04:00
double percent_sum ;
2013-03-05 09:53:27 +04:00
} ;
struct source_line {
struct rb_node node ;
2011-02-04 14:45:46 +03:00
char * path ;
2013-03-05 09:53:28 +04:00
int nr_pcnt ;
2013-03-05 09:53:27 +04:00
struct source_line_percent p [ 1 ] ;
2011-02-04 14:45:46 +03:00
} ;
2011-02-08 18:27:39 +03:00
/** struct annotated_source - symbols with hits have this attached as in sannotation
2011-02-04 18:43:24 +03:00
*
* @ histogram : Array of addr hit histograms per event being monitored
2011-02-08 18:27:39 +03:00
* @ lines : If ' print_lines ' is specified , per source code line percentages
2012-04-15 22:24:39 +04:00
* @ source : source parsed from a disassembler like objdump - dS
2011-02-04 18:43:24 +03:00
*
2011-02-08 18:27:39 +03:00
* lines is allocated , percentages calculated and all sorted by percentage
2011-02-04 18:43:24 +03:00
* when the annotation is about to be presented , so the percentages are for
* one of the entries in the histogram array , i . e . for the event / counter being
* presented . It is deallocated right after symbol__ { tui , tty , etc } _annotate
* returns .
*/
2011-02-08 18:27:39 +03:00
struct annotated_source {
struct list_head source ;
struct source_line * lines ;
2011-02-06 19:54:44 +03:00
int nr_histograms ;
2011-02-04 18:43:24 +03:00
int sizeof_sym_hist ;
2011-02-08 18:27:39 +03:00
struct sym_hist histograms [ 0 ] ;
} ;
struct annotation {
pthread_mutex_t lock ;
struct annotated_source * src ;
2011-02-04 14:45:46 +03:00
} ;
2011-02-04 18:43:24 +03:00
static inline struct sym_hist * annotation__histogram ( struct annotation * notes , int idx )
{
2011-02-08 18:27:39 +03:00
return ( ( ( void * ) & notes - > src - > histograms ) +
( notes - > src - > sizeof_sym_hist * idx ) ) ;
2011-02-04 18:43:24 +03:00
}
2011-02-04 14:45:46 +03:00
static inline struct annotation * symbol__annotation ( struct symbol * sym )
{
2015-01-14 14:18:05 +03:00
return ( void * ) sym - symbol_conf . priv_size ;
2011-02-04 14:45:46 +03:00
}
2013-12-18 23:48:29 +04:00
int addr_map_symbol__inc_samples ( struct addr_map_symbol * ams , int evidx ) ;
2013-12-19 00:10:15 +04:00
int hist_entry__inc_addr_samples ( struct hist_entry * he , int evidx , u64 addr ) ;
2011-11-12 04:17:32 +04:00
int symbol__alloc_hist ( struct symbol * sym ) ;
2011-02-06 19:54:44 +03:00
void symbol__annotate_zero_histograms ( struct symbol * sym ) ;
2011-02-04 14:45:46 +03:00
2011-02-08 18:27:39 +03:00
int symbol__annotate ( struct symbol * sym , struct map * map , size_t privsize ) ;
2013-12-19 00:10:15 +04:00
int hist_entry__annotate ( struct hist_entry * he , size_t privsize ) ;
2012-09-11 02:15:03 +04:00
int symbol__annotate_init ( struct map * map __maybe_unused , struct symbol * sym ) ;
2013-03-05 09:53:21 +04:00
int symbol__annotate_printf ( struct symbol * sym , struct map * map ,
struct perf_evsel * evsel , bool full_paths ,
int min_pcnt , int max_lines , int context ) ;
2011-02-06 19:54:44 +03:00
void symbol__annotate_zero_histogram ( struct symbol * sym , int evidx ) ;
2011-02-08 18:27:39 +03:00
void symbol__annotate_decay_histogram ( struct symbol * sym , int evidx ) ;
2012-04-15 22:24:39 +04:00
void disasm__purge ( struct list_head * head ) ;
2011-02-04 14:45:46 +03:00
2014-02-20 05:32:53 +04:00
bool ui__has_annotation ( void ) ;
2013-03-05 09:53:21 +04:00
int symbol__tty_annotate ( struct symbol * sym , struct map * map ,
struct perf_evsel * evsel , bool print_lines ,
bool full_paths , int min_pcnt , int max_lines ) ;
2011-02-04 14:45:46 +03:00
2013-09-30 14:07:11 +04:00
# ifdef HAVE_SLANG_SUPPORT
2013-03-05 09:53:21 +04:00
int symbol__tui_annotate ( struct symbol * sym , struct map * map ,
struct perf_evsel * evsel ,
2012-11-02 09:50:05 +04:00
struct hist_browser_timer * hbt ) ;
2012-09-28 13:32:02 +04:00
# else
2012-09-11 02:15:03 +04:00
static inline int symbol__tui_annotate ( struct symbol * sym __maybe_unused ,
2013-03-05 09:53:21 +04:00
struct map * map __maybe_unused ,
struct perf_evsel * evsel __maybe_unused ,
struct hist_browser_timer * hbt
__maybe_unused )
2011-02-04 14:45:46 +03:00
{
return 0 ;
}
# endif
2011-09-16 01:31:41 +04:00
extern const char * disassembler_style ;
2011-02-04 14:45:46 +03:00
# endif /* __PERF_ANNOTATE_H */