Linux Perf
annotate.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef __PERF_ANNOTATE_H
3 #define __PERF_ANNOTATE_H
4 
5 #include <stdbool.h>
6 #include <stdint.h>
7 #include <linux/types.h>
8 #include "symbol.h"
9 #include "hist.h"
10 #include "sort.h"
11 #include <linux/list.h>
12 #include <linux/rbtree.h>
13 #include <pthread.h>
14 
15 struct ins_ops;
16 
17 struct ins {
18  const char *name;
19  struct ins_ops *ops;
20 };
21 
22 struct ins_operands {
23  char *raw;
24  struct {
25  char *raw;
26  char *name;
27  struct symbol *sym;
28  u64 addr;
29  s64 offset;
31  bool outside;
32  } target;
33  union {
34  struct {
35  char *raw;
36  char *name;
37  u64 addr;
38  } source;
39  struct {
40  struct ins ins;
41  struct ins_operands *ops;
42  } locked;
43  };
44 };
45 
46 struct arch;
47 
48 struct ins_ops {
49  void (*free)(struct ins_operands *ops);
50  int (*parse)(struct arch *arch, struct ins_operands *ops, struct map_symbol *ms);
51  int (*scnprintf)(struct ins *ins, char *bf, size_t size,
52  struct ins_operands *ops);
53 };
54 
55 bool ins__is_jump(const struct ins *ins);
56 bool ins__is_call(const struct ins *ins);
57 bool ins__is_ret(const struct ins *ins);
58 bool ins__is_lock(const struct ins *ins);
59 int ins__scnprintf(struct ins *ins, char *bf, size_t size, struct ins_operands *ops);
60 bool ins__is_fused(struct arch *arch, const char *ins1, const char *ins2);
61 
62 #define ANNOTATION__IPC_WIDTH 6
63 #define ANNOTATION__CYCLES_WIDTH 6
64 #define ANNOTATION__MINMAX_CYCLES_WIDTH 19
65 
67  bool hide_src_code,
68  use_offset,
69  jump_arrows,
70  print_lines,
71  full_path,
72  show_linenr,
73  show_nr_jumps,
74  show_nr_samples,
75  show_total_period,
76  show_minmax_cycle,
77  show_asm_raw,
78  annotate_src;
80  int min_pcnt;
81  int max_lines;
82  int context;
83  const char *objdump_path;
84  const char *disassembler_style;
85 };
86 
87 enum {
91 };
92 
93 #define ANNOTATION__MIN_OFFSET_LEVEL ANNOTATION__OFFSET_JUMP_TARGETS
94 
96 
97 struct annotation;
98 
101  u64 period;
102 };
103 
105  double percent;
106  double percent_sum;
107  struct sym_hist_entry he;
108 };
109 
111  struct list_head node;
112  struct rb_node rb_node;
113  s64 offset;
114  char *line;
115  int line_nr;
117  float ipc;
118  u64 cycles;
121  size_t privsize;
122  char *path;
123  u32 idx;
124  int idx_asm;
126  struct annotation_data samples[0];
127 };
128 
129 struct disasm_line {
130  struct ins ins;
132 
133  /* This needs to be at the end. */
134  struct annotation_line al;
135 };
136 
137 static inline struct disasm_line *disasm_line(struct annotation_line *al)
138 {
139  return al ? container_of(al, struct disasm_line, al) : NULL;
140 }
141 
142 /*
143  * Is this offset in the same function as the line it is used?
144  * asm functions jump to other functions, for instance.
145  */
146 static inline bool disasm_line__has_local_offset(const struct disasm_line *dl)
147 {
148  return dl->ops.target.offset_avail && !dl->ops.target.outside;
149 }
150 
151 /*
152  * Can we draw an arrow from the jump to its target, for instance? I.e.
153  * is the jump and its target in the same function?
154  */
155 bool disasm_line__is_valid_local_jump(struct disasm_line *dl, struct symbol *sym);
156 
157 void disasm_line__free(struct disasm_line *dl);
158 struct annotation_line *
159 annotation_line__next(struct annotation_line *pos, struct list_head *head);
160 
162  bool first_line, current_entry, change_color;
163  int width;
164  void *obj;
165  int (*set_color)(void *obj, int color);
166  void (*set_percent_color)(void *obj, double percent, bool current);
167  int (*set_jumps_percent_color)(void *obj, int nr, bool current);
168  void (*printf)(void *obj, const char *fmt, ...);
169  void (*write_graph)(void *obj, int graph);
170 };
171 
172 double annotation_line__max_percent(struct annotation_line *al, struct annotation *notes);
173 void annotation_line__write(struct annotation_line *al, struct annotation *notes,
174  struct annotation_write_ops *ops);
175 
177  char *bf, size_t size,
178  struct perf_evsel *evsel,
179  bool show_freq);
180 
181 static inline int annotation__scnprintf_samples_period(struct annotation *notes,
182  char *bf, size_t size,
183  struct perf_evsel *evsel)
184 {
185  return __annotation__scnprintf_samples_period(notes, bf, size, evsel, true);
186 }
187 
188 int disasm_line__scnprintf(struct disasm_line *dl, char *bf, size_t size, bool raw);
189 size_t disasm__fprintf(struct list_head *head, FILE *fp);
190 void symbol__calc_percent(struct symbol *sym, struct perf_evsel *evsel);
191 
192 struct sym_hist {
194  u64 period;
195  struct sym_hist_entry addr[0];
196 };
197 
198 struct cyc_hist {
199  u64 start;
200  u64 cycles;
204  u32 num;
205  u32 num_aggr;
207  /* 1 byte padding */
208  u16 reset;
209 };
210 
229  struct list_head source;
234 };
235 
236 struct annotation {
237  pthread_mutex_t lock;
239  u64 start;
243  int nr_jumps;
248  struct {
249  u8 addr;
250  u8 jumps;
251  u8 target;
254  } widths;
257 };
258 
259 static inline int annotation__cycles_width(struct annotation *notes)
260 {
261  if (notes->have_cycles && notes->options->show_minmax_cycle)
263 
265 }
266 
267 static inline int annotation__pcnt_width(struct annotation *notes)
268 {
269  return (notes->options->show_total_period ? 12 : 7) * notes->nr_events;
270 }
271 
272 static inline bool annotation_line__filter(struct annotation_line *al, struct annotation *notes)
273 {
274  return notes->options->hide_src_code && al->offset == -1;
275 }
276 
277 void annotation__set_offsets(struct annotation *notes, s64 size);
278 void annotation__compute_ipc(struct annotation *notes, size_t size);
279 void annotation__mark_jump_targets(struct annotation *notes, struct symbol *sym);
280 void annotation__update_column_widths(struct annotation *notes);
281 void annotation__init_column_widths(struct annotation *notes, struct symbol *sym);
282 
283 static inline struct sym_hist *annotated_source__histogram(struct annotated_source *src, int idx)
284 {
285  return ((void *)src->histograms) + (src->sizeof_sym_hist * idx);
286 }
287 
288 static inline struct sym_hist *annotation__histogram(struct annotation *notes, int idx)
289 {
290  return annotated_source__histogram(notes->src, idx);
291 }
292 
293 static inline struct annotation *symbol__annotation(struct symbol *sym)
294 {
295  return (void *)sym - symbol_conf.priv_size;
296 }
297 
299  struct perf_evsel *evsel);
300 
302  struct addr_map_symbol *start,
303  unsigned cycles);
304 
305 int hist_entry__inc_addr_samples(struct hist_entry *he, struct perf_sample *sample,
306  struct perf_evsel *evsel, u64 addr);
307 
308 struct annotated_source *symbol__hists(struct symbol *sym, int nr_hists);
309 void symbol__annotate_zero_histograms(struct symbol *sym);
310 
311 int symbol__annotate(struct symbol *sym, struct map *map,
312  struct perf_evsel *evsel, size_t privsize,
313  struct annotation_options *options,
314  struct arch **parch);
315 int symbol__annotate2(struct symbol *sym, struct map *map,
316  struct perf_evsel *evsel,
317  struct annotation_options *options,
318  struct arch **parch);
319 
322 
323  /*
324  * Choose an arbitrary negative big number not to clash with standard
325  * errno since SUS requires the errno has distinct positive values.
326  * See 'Issue 6' in the link below.
327  *
328  * http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html
329  */
331 
333 
335 };
336 
337 int symbol__strerror_disassemble(struct symbol *sym, struct map *map,
338  int errnum, char *buf, size_t buflen);
339 
340 int symbol__annotate_printf(struct symbol *sym, struct map *map,
341  struct perf_evsel *evsel,
342  struct annotation_options *options);
343 int symbol__annotate_fprintf2(struct symbol *sym, FILE *fp);
344 void symbol__annotate_zero_histogram(struct symbol *sym, int evidx);
345 void symbol__annotate_decay_histogram(struct symbol *sym, int evidx);
347 
348 int map_symbol__annotation_dump(struct map_symbol *ms, struct perf_evsel *evsel);
349 
350 bool ui__has_annotation(void);
351 
352 int symbol__tty_annotate(struct symbol *sym, struct map *map,
353  struct perf_evsel *evsel, struct annotation_options *opts);
354 
355 int symbol__tty_annotate2(struct symbol *sym, struct map *map,
356  struct perf_evsel *evsel, struct annotation_options *opts);
357 
358 #ifdef HAVE_SLANG_SUPPORT
359 int symbol__tui_annotate(struct symbol *sym, struct map *map,
360  struct perf_evsel *evsel,
361  struct hist_browser_timer *hbt,
362  struct annotation_options *opts);
363 #else
364 static inline int symbol__tui_annotate(struct symbol *sym __maybe_unused,
365  struct map *map __maybe_unused,
366  struct perf_evsel *evsel __maybe_unused,
367  struct hist_browser_timer *hbt __maybe_unused,
368  struct annotation_options *opts __maybe_unused)
369 {
370  return 0;
371 }
372 #endif
373 
374 void annotation_config__init(void);
375 
376 #endif /* __PERF_ANNOTATE_H */
int nr_jumps
Definition: annotate.h:243
symbol_disassemble_errno
Definition: annotate.h:320
static int annotation__pcnt_width(struct annotation *notes)
Definition: annotate.h:267
void symbol__calc_percent(struct symbol *sym, struct perf_evsel *evsel)
Definition: annotate.c:1803
void symbol__annotate_decay_histogram(struct symbol *sym, int evidx)
Definition: annotate.c:2196
struct annotation_options annotation__default_options
Definition: annotate.c:47
Definition: mem2node.c:7
size_t disasm__fprintf(struct list_head *head, FILE *fp)
Definition: annotate.c:2236
static int annotation__scnprintf_samples_period(struct annotation *notes, char *bf, size_t size, struct perf_evsel *evsel)
Definition: annotate.h:181
int nr_entries
Definition: annotate.h:245
double annotation_line__max_percent(struct annotation_line *al, struct annotation *notes)
Definition: annotate.c:2444
size_t size
Definition: evsel.c:60
Definition: annotate.h:99
double percent
Definition: annotate.h:105
void annotation__mark_jump_targets(struct annotation *notes, struct symbol *sym)
Definition: annotate.c:2257
struct cyc_hist * cycles_hist
Definition: annotate.h:232
u64 nr_samples
Definition: annotate.h:100
Definition: genelf.c:61
int addr_map_symbol__account_cycles(struct addr_map_symbol *ams, struct addr_map_symbol *start, unsigned cycles)
Definition: annotate.c:919
bool have_cycles
Definition: annotate.h:255
static int annotation__cycles_width(struct annotation *notes)
Definition: annotate.h:259
u16 reset
Definition: annotate.h:208
bool outside
Definition: annotate.h:31
Definition: annotate.h:17
u64 cycles_max
Definition: annotate.h:202
char * raw
Definition: annotate.h:23
const char * name
Definition: annotate.h:18
int disasm_line__scnprintf(struct disasm_line *dl, char *bf, size_t size, bool raw)
Definition: annotate.c:1179
struct symbol * sym
Definition: annotate.h:27
u64 period
Definition: annotate.h:101
static int symbol__tui_annotate(struct symbol *sym __maybe_unused, struct map *map __maybe_unused, struct perf_evsel *evsel __maybe_unused, struct hist_browser_timer *hbt __maybe_unused, struct annotation_options *opts __maybe_unused)
Definition: annotate.h:364
u64 nr_samples
Definition: annotate.h:193
char * name
Definition: annotate.h:26
u64 max_coverage
Definition: annotate.h:238
int nr_events
Definition: annotate.h:242
int ins__scnprintf(struct ins *ins, char *bf, size_t size, struct ins_operands *ops)
Definition: annotate.c:190
#define ANNOTATION__CYCLES_WIDTH
Definition: annotate.h:63
bool ins__is_fused(struct arch *arch, const char *ins1, const char *ins2)
Definition: annotate.c:199
u8 have_start
Definition: annotate.h:206
Definition: sort.h:89
u64 start
Definition: annotate.h:239
int max_jump_sources
Definition: annotate.h:244
struct annotated_source * symbol__hists(struct symbol *sym, int nr_hists)
Definition: annotate.c:858
void symbol__annotate_zero_histograms(struct symbol *sym)
Definition: annotate.c:743
struct ins_operands::@36::@39 locked
u64 cycles
Definition: annotate.h:200
int addr_map_symbol__inc_samples(struct addr_map_symbol *ams, struct perf_sample *sample, struct perf_evsel *evsel)
Definition: annotate.c:1016
#define ANNOTATION__IPC_WIDTH
Definition: annotate.h:62
void annotation_config__init(void)
Definition: annotate.c:2788
static struct sym_hist * annotation__histogram(struct annotation *notes, int idx)
Definition: annotate.h:288
const char * objdump_path
Definition: annotate.h:83
unsigned short priv_size
Definition: symbol.h:92
struct annotation_options * options
Definition: annotate.h:240
const char * fmt
Definition: dso.c:193
int symbol__annotate2(struct symbol *sym, struct map *map, struct perf_evsel *evsel, struct annotation_options *options, struct arch **parch)
Definition: annotate.c:2652
u8 min_addr
Definition: annotate.h:252
static bool annotation_line__filter(struct annotation_line *al, struct annotation *notes)
Definition: annotate.h:272
int hist_entry__inc_addr_samples(struct hist_entry *he, struct perf_sample *sample, struct perf_evsel *evsel, u64 addr)
Definition: annotate.c:1022
static struct disasm_line * disasm_line(struct annotation_line *al)
Definition: annotate.h:137
struct ins_operands::@35 target
struct ins_operands * ops
Definition: annotate.h:41
struct ins_operands ops
Definition: annotate.h:131
void annotation__update_column_widths(struct annotation *notes)
Definition: annotate.c:2335
u64 cycles_min
Definition: annotate.h:203
u32 num
Definition: annotate.h:204
int __annotation__scnprintf_samples_period(struct annotation *notes, char *bf, size_t size, struct perf_evsel *evsel, bool show_freq)
Definition: annotate.c:2691
int symbol__annotate_fprintf2(struct symbol *sym, FILE *fp)
Definition: annotate.c:2132
static struct annotation * symbol__annotation(struct symbol *sym)
Definition: annotate.h:293
int map_symbol__annotation_dump(struct map_symbol *ms, struct perf_evsel *evsel)
Definition: annotate.c:2157
double percent_sum
Definition: annotate.h:106
const char * source
Definition: llvm.c:32
s64 offset
Definition: annotate.h:29
int symbol__tty_annotate(struct symbol *sym, struct map *map, struct perf_evsel *evsel, struct annotation_options *opts)
Definition: annotate.c:2413
pthread_mutex_t lock
Definition: annotate.h:237
const char * disassembler_style
Definition: annotate.h:84
static int raw(yyscan_t scanner)
bool ins__is_ret(const struct ins *ins)
Definition: annotate.c:590
void disasm_line__free(struct disasm_line *dl)
Definition: annotate.c:1168
bool show_minmax_cycle
Definition: annotate.h:67
u16 max_line_len
Definition: annotate.h:247
#define ins(i, p)
Definition: bpf-prologue.c:103
bool disasm_line__is_valid_local_jump(struct disasm_line *dl, struct symbol *sym)
Definition: annotate.c:2247
u64 start
Definition: hists_common.c:25
void annotation__compute_ipc(struct annotation *notes, size_t size)
Definition: annotate.c:987
static struct sym_hist * annotated_source__histogram(struct annotated_source *src, int idx)
Definition: annotate.h:283
u32 num_aggr
Definition: annotate.h:205
int symbol__annotate_printf(struct symbol *sym, struct map *map, struct perf_evsel *evsel, struct annotation_options *options)
Definition: annotate.c:1995
struct annotation_line * annotation_line__next(struct annotation_line *pos, struct list_head *head)
Definition: annotate.c:1193
u64 start
Definition: annotate.h:199
Definition: jevents.c:228
bool ins__is_jump(const struct ins *ins)
Definition: annotate.c:386
bool offset_avail
Definition: annotate.h:30
struct annotated_source * src
Definition: annotate.h:256
void annotation__set_offsets(struct annotation *notes, s64 size)
Definition: annotate.c:2290
static int sym(yyscan_t scanner, int type, int config)
int nr_asm_entries
Definition: annotate.h:246
bool ui__has_annotation(void)
Definition: annotate.c:2438
struct sym_hist * histograms
Definition: annotate.h:233
Definition: annotate.c:60
bool ins__is_lock(const struct ins *ins)
Definition: annotate.c:595
u64 cycles_aggr
Definition: annotate.h:201
static double percent(int st, int tot)
Definition: builtin-c2c.c:899
int symbol__tty_annotate2(struct symbol *sym, struct map *map, struct perf_evsel *evsel, struct annotation_options *opts)
Definition: annotate.c:2386
void free(void *)
#define ANNOTATION__MINMAX_CYCLES_WIDTH
Definition: annotate.h:64
Definition: symbol.h:55
size_t privsize
Definition: annotate.h:121
size_t sizeof_sym_hist
Definition: annotate.h:231
void symbol__annotate_zero_histogram(struct symbol *sym, int evidx)
Definition: annotate.c:2188
u8 max_addr
Definition: annotate.h:253
bool ins__is_call(const struct ins *ins)
Definition: annotate.c:273
bool show_total_period
Definition: annotate.h:67
int symbol__strerror_disassemble(struct symbol *sym, struct map *map, int errnum, char *buf, size_t buflen)
u64 period
Definition: annotate.h:194
void annotation__init_column_widths(struct annotation *notes, struct symbol *sym)
Definition: annotate.c:2327
void annotation_line__write(struct annotation_line *al, struct annotation *notes, struct annotation_write_ops *ops)
Definition: annotate.c:2642
struct annotation_line ** offsets
Definition: annotate.h:241
void annotated_source__purge(struct annotated_source *as)
Definition: annotate.c:2209
struct ins_ops * ops
Definition: annotate.h:19
int symbol__annotate(struct symbol *sym, struct map *map, struct perf_evsel *evsel, size_t privsize, struct annotation_options *options, struct arch **parch)
Definition: annotate.c:1810
char * target
Definition: builtin-probe.c:59
static bool disasm_line__has_local_offset(const struct disasm_line *dl)
Definition: annotate.h:146