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 10 struct objdump_line { 11 struct list_head node; 12 s64 offset; 13 char *line; 14 }; 15 16 void objdump_line__free(struct objdump_line *self); 17 struct objdump_line *objdump__get_next_ip_line(struct list_head *head, 18 struct objdump_line *pos); 19 20 struct sym_hist { 21 u64 sum; 22 u64 addr[0]; 23 }; 24 25 struct 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 */ 43 struct 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 51 struct annotation { 52 pthread_mutex_t lock; 53 struct annotated_source *src; 54 }; 55 56 struct sannotation { 57 struct annotation annotation; 58 struct symbol symbol; 59 }; 60 61 static inline struct sym_hist *annotation__histogram(struct annotation *notes, int idx) 62 { 63 return (((void *)¬es->src->histograms) + 64 (notes->src->sizeof_sym_hist * idx)); 65 } 66 67 static 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 73 int symbol__inc_addr_samples(struct symbol *sym, struct map *map, 74 int evidx, u64 addr); 75 int symbol__alloc_hist(struct symbol *sym, int nevents); 76 void symbol__annotate_zero_histograms(struct symbol *sym); 77 78 int symbol__annotate(struct symbol *sym, struct map *map, size_t privsize); 79 int symbol__annotate_init(struct map *map __used, struct symbol *sym); 80 int symbol__annotate_printf(struct symbol *sym, struct map *map, int evidx, 81 bool full_paths, int min_pcnt, int max_lines, 82 int context); 83 void symbol__annotate_zero_histogram(struct symbol *sym, int evidx); 84 void symbol__annotate_decay_histogram(struct symbol *sym, int evidx); 85 void objdump_line_list__purge(struct list_head *head); 86 87 int 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 92 static inline int symbol__tui_annotate(struct symbol *sym __used, 93 struct map *map __used, 94 int evidx __used, int refresh __used) 95 { 96 return 0; 97 } 98 #else 99 int symbol__tui_annotate(struct symbol *sym, struct map *map, int evidx, 100 int refresh); 101 #endif 102 103 #endif /* __PERF_ANNOTATE_H */ 104