1 #ifndef __PERF_ANNOTATE_H
2 #define __PERF_ANNOTATE_H
6 #include <linux/types.h>
10 #include <linux/list.h>
11 #include <linux/rbtree.h>
37 struct ins_operands *ops;
45 void (*free)(struct ins_operands *ops);
46 int (*parse)(struct arch *arch, struct ins_operands *ops, struct map *map);
47 int (*scnprintf)(struct ins *ins, char *bf, size_t size,
48 struct ins_operands *ops);
51 bool ins__is_jump(const struct ins *ins);
52 bool ins__is_call(const struct ins *ins);
53 bool ins__is_ret(const struct ins *ins);
54 int ins__scnprintf(struct ins *ins, char *bf, size_t size, struct ins_operands *ops);
59 struct list_head node;
66 struct ins_operands ops;
69 static inline bool disasm_line__has_offset(const struct disasm_line *dl)
71 return dl->ops.target.offset != UINT64_MAX;
74 void disasm_line__free(struct disasm_line *dl);
75 struct disasm_line *disasm__get_next_ip_line(struct list_head *head, struct disasm_line *pos);
76 int disasm_line__scnprintf(struct disasm_line *dl, char *bf, size_t size, bool raw);
77 size_t disasm__fprintf(struct list_head *head, FILE *fp);
78 double disasm__calc_percent(struct annotation *notes, int evidx, s64 offset,
79 s64 end, const char **path, u64 *nr_samples);
97 struct source_line_samples {
107 struct source_line_samples samples[1];
110 /** struct annotated_source - symbols with hits have this attached as in sannotation
112 * @histogram: Array of addr hit histograms per event being monitored
113 * @lines: If 'print_lines' is specified, per source code line percentages
114 * @source: source parsed from a disassembler like objdump -dS
115 * @cyc_hist: Average cycles per basic block
117 * lines is allocated, percentages calculated and all sorted by percentage
118 * when the annotation is about to be presented, so the percentages are for
119 * one of the entries in the histogram array, i.e. for the event/counter being
120 * presented. It is deallocated right after symbol__{tui,tty,etc}_annotate
123 struct annotated_source {
124 struct list_head source;
125 struct source_line *lines;
127 size_t sizeof_sym_hist;
128 struct cyc_hist *cycles_hist;
129 struct sym_hist histograms[0];
133 pthread_mutex_t lock;
135 struct annotated_source *src;
138 static inline struct sym_hist *annotation__histogram(struct annotation *notes, int idx)
140 return (((void *)¬es->src->histograms) +
141 (notes->src->sizeof_sym_hist * idx));
144 static inline struct annotation *symbol__annotation(struct symbol *sym)
146 return (void *)sym - symbol_conf.priv_size;
149 int addr_map_symbol__inc_samples(struct addr_map_symbol *ams, int evidx);
151 int addr_map_symbol__account_cycles(struct addr_map_symbol *ams,
152 struct addr_map_symbol *start,
155 int hist_entry__inc_addr_samples(struct hist_entry *he, int evidx, u64 addr);
157 int symbol__alloc_hist(struct symbol *sym);
158 void symbol__annotate_zero_histograms(struct symbol *sym);
160 int symbol__disassemble(struct symbol *sym, struct map *map, const char *arch_name, size_t privsize);
162 enum symbol_disassemble_errno {
163 SYMBOL_ANNOTATE_ERRNO__SUCCESS = 0,
166 * Choose an arbitrary negative big number not to clash with standard
167 * errno since SUS requires the errno has distinct positive values.
168 * See 'Issue 6' in the link below.
170 * http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html
172 __SYMBOL_ANNOTATE_ERRNO__START = -10000,
174 SYMBOL_ANNOTATE_ERRNO__NO_VMLINUX = __SYMBOL_ANNOTATE_ERRNO__START,
176 __SYMBOL_ANNOTATE_ERRNO__END,
179 int symbol__strerror_disassemble(struct symbol *sym, struct map *map,
180 int errnum, char *buf, size_t buflen);
182 int symbol__annotate_printf(struct symbol *sym, struct map *map,
183 struct perf_evsel *evsel, bool full_paths,
184 int min_pcnt, int max_lines, int context);
185 void symbol__annotate_zero_histogram(struct symbol *sym, int evidx);
186 void symbol__annotate_decay_histogram(struct symbol *sym, int evidx);
187 void disasm__purge(struct list_head *head);
189 bool ui__has_annotation(void);
191 int symbol__tty_annotate(struct symbol *sym, struct map *map,
192 struct perf_evsel *evsel, bool print_lines,
193 bool full_paths, int min_pcnt, int max_lines);
195 #ifdef HAVE_SLANG_SUPPORT
196 int symbol__tui_annotate(struct symbol *sym, struct map *map,
197 struct perf_evsel *evsel,
198 struct hist_browser_timer *hbt);
200 static inline int symbol__tui_annotate(struct symbol *sym __maybe_unused,
201 struct map *map __maybe_unused,
202 struct perf_evsel *evsel __maybe_unused,
203 struct hist_browser_timer *hbt
210 extern const char *disassembler_style;
212 #endif /* __PERF_ANNOTATE_H */