2011-02-04 09:45:46 -02:00
# ifndef __PERF_ANNOTATE_H
# define __PERF_ANNOTATE_H
# include <stdbool.h>
# include "types.h"
# include "symbol.h"
# include <linux/list.h>
# include <linux/rbtree.h>
struct objdump_line {
struct list_head node ;
s64 offset ;
char * line ;
} ;
void objdump_line__free ( struct objdump_line * self ) ;
struct objdump_line * objdump__get_next_ip_line ( struct list_head * head ,
struct objdump_line * pos ) ;
struct sym_hist {
u64 sum ;
u64 addr [ 0 ] ;
} ;
struct source_line {
struct rb_node node ;
double percent ;
char * path ;
} ;
2011-02-08 13:27:39 -02:00
/** struct annotated_source - symbols with hits have this attached as in sannotation
2011-02-04 13:43:24 -02:00
*
* @ histogram : Array of addr hit histograms per event being monitored
2011-02-08 13:27:39 -02:00
* @ lines : If ' print_lines ' is specified , per source code line percentages
* @ source : source parsed from objdump - dS
2011-02-04 13:43:24 -02:00
*
2011-02-08 13:27:39 -02:00
* lines is allocated , percentages calculated and all sorted by percentage
2011-02-04 13:43:24 -02: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 13:27:39 -02:00
struct annotated_source {
struct list_head source ;
struct source_line * lines ;
2011-02-06 14:54:44 -02:00
int nr_histograms ;
2011-02-04 13:43:24 -02:00
int sizeof_sym_hist ;
2011-02-08 13:27:39 -02:00
struct sym_hist histograms [ 0 ] ;
} ;
struct annotation {
pthread_mutex_t lock ;
struct annotated_source * src ;
2011-02-04 09:45:46 -02:00
} ;
struct sannotation {
struct annotation annotation ;
struct symbol symbol ;
} ;
2011-02-04 13:43:24 -02:00
static inline struct sym_hist * annotation__histogram ( struct annotation * notes , int idx )
{
2011-02-08 13:27:39 -02:00
return ( ( ( void * ) & notes - > src - > histograms ) +
( notes - > src - > sizeof_sym_hist * idx ) ) ;
2011-02-04 13:43:24 -02:00
}
2011-02-04 09:45:46 -02: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 13:43:24 -02:00
int symbol__inc_addr_samples ( struct symbol * sym , struct map * map ,
int evidx , u64 addr ) ;
2011-11-11 22:17:32 -02:00
int symbol__alloc_hist ( struct symbol * sym ) ;
2011-02-06 14:54:44 -02:00
void symbol__annotate_zero_histograms ( struct symbol * sym ) ;
2011-02-04 09:45:46 -02:00
2011-02-08 13:27:39 -02:00
int symbol__annotate ( struct symbol * sym , struct map * map , size_t privsize ) ;
int symbol__annotate_init ( struct map * map __used , struct symbol * sym ) ;
int symbol__annotate_printf ( struct symbol * sym , struct map * map , int evidx ,
2011-02-08 15:29:25 -02:00
bool full_paths , int min_pcnt , int max_lines ,
int context ) ;
2011-02-06 14:54:44 -02:00
void symbol__annotate_zero_histogram ( struct symbol * sym , int evidx ) ;
2011-02-08 13:27:39 -02:00
void symbol__annotate_decay_histogram ( struct symbol * sym , int evidx ) ;
2011-02-05 18:51:38 -02:00
void objdump_line_list__purge ( struct list_head * head ) ;
2011-02-04 09:45:46 -02:00
2011-02-04 13:43:24 -02:00
int symbol__tty_annotate ( struct symbol * sym , struct map * map , int evidx ,
2011-02-05 15:37:31 -02:00
bool print_lines , bool full_paths , int min_pcnt ,
int max_lines ) ;
2011-02-04 09:45:46 -02:00
# ifdef NO_NEWT_SUPPORT
2011-02-07 15:32:18 +01:00
static inline int symbol__tui_annotate ( struct symbol * sym __used ,
2011-02-22 12:02:07 -03:00
struct map * map __used ,
2011-10-05 19:11:32 -03:00
int evidx __used ,
void ( * timer ) ( void * arg ) __used ,
void * arg __used , int delay_secs __used )
2011-02-04 09:45:46 -02:00
{
return 0 ;
}
# else
2011-02-22 12:02:07 -03:00
int symbol__tui_annotate ( struct symbol * sym , struct map * map , int evidx ,
2011-11-11 22:17:32 -02:00
void ( * timer ) ( void * arg ) , void * arg , int delay_secs ) ;
2011-02-04 09:45:46 -02:00
# endif
2011-09-15 14:31:41 -07:00
extern const char * disassembler_style ;
2011-02-04 09:45:46 -02:00
# endif /* __PERF_ANNOTATE_H */