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>
2011-02-04 14:45:46 +03:00
# include "types.h"
# include "symbol.h"
# 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
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 ;
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 ) ;
2011-02-04 14:45:46 +03:00
struct sym_hist {
u64 sum ;
u64 addr [ 0 ] ;
} ;
struct source_line {
struct rb_node node ;
double percent ;
char * path ;
} ;
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
} ;
struct sannotation {
struct annotation annotation ;
struct symbol symbol ;
} ;
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 )
{
struct sannotation * a = container_of ( sym , struct sannotation , symbol ) ;
return & a - > annotation ;
}
2011-02-04 18:43:24 +03:00
int symbol__inc_addr_samples ( struct symbol * sym , struct map * map ,
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 ) ;
2012-09-11 02:15:03 +04:00
int symbol__annotate_init ( struct map * map __maybe_unused , struct symbol * sym ) ;
2011-02-08 18:27:39 +03:00
int symbol__annotate_printf ( struct symbol * sym , struct map * map , int evidx ,
2011-02-08 20:29:25 +03:00
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
2011-02-04 18:43:24 +03:00
int symbol__tty_annotate ( struct symbol * sym , struct map * map , int evidx ,
2011-02-05 20:37:31 +03:00
bool print_lines , bool full_paths , int min_pcnt ,
int max_lines ) ;
2011-02-04 14:45:46 +03:00
2012-09-28 13:32:02 +04:00
# ifdef NEWT_SUPPORT
int symbol__tui_annotate ( struct symbol * sym , struct map * map , int evidx ,
void ( * timer ) ( void * arg ) , void * arg , int delay_secs ) ;
# else
2012-09-11 02:15:03 +04:00
static inline int symbol__tui_annotate ( struct symbol * sym __maybe_unused ,
struct map * map __maybe_unused ,
int evidx __maybe_unused ,
void ( * timer ) ( void * arg ) __maybe_unused ,
void * arg __maybe_unused ,
int delay_secs __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 */