at v3.2 3.2 kB view raw
1#ifndef __PERF_ANNOTATE_H 2#define __PERF_ANNOTATE_H 3 4#include <stdbool.h> 5#include "types.h" 6#include "symbol.h" 7#include <linux/list.h> 8#include <linux/rbtree.h> 9 10struct objdump_line { 11 struct list_head node; 12 s64 offset; 13 char *line; 14}; 15 16void objdump_line__free(struct objdump_line *self); 17struct objdump_line *objdump__get_next_ip_line(struct list_head *head, 18 struct objdump_line *pos); 19 20struct sym_hist { 21 u64 sum; 22 u64 addr[0]; 23}; 24 25struct source_line { 26 struct rb_node node; 27 double percent; 28 char *path; 29}; 30 31/** struct annotated_source - symbols with hits have this attached as in sannotation 32 * 33 * @histogram: Array of addr hit histograms per event being monitored 34 * @lines: If 'print_lines' is specified, per source code line percentages 35 * @source: source parsed from objdump -dS 36 * 37 * lines is allocated, percentages calculated and all sorted by percentage 38 * when the annotation is about to be presented, so the percentages are for 39 * one of the entries in the histogram array, i.e. for the event/counter being 40 * presented. It is deallocated right after symbol__{tui,tty,etc}_annotate 41 * returns. 42 */ 43struct annotated_source { 44 struct list_head source; 45 struct source_line *lines; 46 int nr_histograms; 47 int sizeof_sym_hist; 48 struct sym_hist histograms[0]; 49}; 50 51struct annotation { 52 pthread_mutex_t lock; 53 struct annotated_source *src; 54}; 55 56struct sannotation { 57 struct annotation annotation; 58 struct symbol symbol; 59}; 60 61static inline struct sym_hist *annotation__histogram(struct annotation *notes, int idx) 62{ 63 return (((void *)&notes->src->histograms) + 64 (notes->src->sizeof_sym_hist * idx)); 65} 66 67static inline struct annotation *symbol__annotation(struct symbol *sym) 68{ 69 struct sannotation *a = container_of(sym, struct sannotation, symbol); 70 return &a->annotation; 71} 72 73int symbol__inc_addr_samples(struct symbol *sym, struct map *map, 74 int evidx, u64 addr); 75int symbol__alloc_hist(struct symbol *sym, int nevents); 76void symbol__annotate_zero_histograms(struct symbol *sym); 77 78int symbol__annotate(struct symbol *sym, struct map *map, size_t privsize); 79int symbol__annotate_init(struct map *map __used, struct symbol *sym); 80int symbol__annotate_printf(struct symbol *sym, struct map *map, int evidx, 81 bool full_paths, int min_pcnt, int max_lines, 82 int context); 83void symbol__annotate_zero_histogram(struct symbol *sym, int evidx); 84void symbol__annotate_decay_histogram(struct symbol *sym, int evidx); 85void objdump_line_list__purge(struct list_head *head); 86 87int symbol__tty_annotate(struct symbol *sym, struct map *map, int evidx, 88 bool print_lines, bool full_paths, int min_pcnt, 89 int max_lines); 90 91#ifdef NO_NEWT_SUPPORT 92static inline int symbol__tui_annotate(struct symbol *sym __used, 93 struct map *map __used, 94 int evidx __used, 95 void(*timer)(void *arg) __used, 96 void *arg __used, int delay_secs __used) 97{ 98 return 0; 99} 100#else 101int symbol__tui_annotate(struct symbol *sym, struct map *map, int evidx, 102 int nr_events, void(*timer)(void *arg), void *arg, 103 int delay_secs); 104#endif 105 106extern const char *disassembler_style; 107 108#endif /* __PERF_ANNOTATE_H */