]> git.ipfire.org Git - thirdparty/linux.git/blame - tools/perf/util/annotate.h
perf record: Generate PERF_RECORD_{MMAP,COMM,EXEC} with --delay
[thirdparty/linux.git] / tools / perf / util / annotate.h
CommitLineData
b2441318 1/* SPDX-License-Identifier: GPL-2.0 */
78f7defe
ACM
2#ifndef __PERF_ANNOTATE_H
3#define __PERF_ANNOTATE_H
4
5#include <stdbool.h>
fb29fa58 6#include <stdint.h>
d944c4ee 7#include <linux/types.h>
78f7defe 8#include "symbol.h"
9783adf7 9#include "hist.h"
2b676bf0 10#include "sort.h"
78f7defe
ACM
11#include <linux/list.h>
12#include <linux/rbtree.h>
27683dc5 13#include <pthread.h>
78f7defe 14
75b49202
ACM
15struct ins_ops;
16
17struct ins {
18 const char *name;
19 struct ins_ops *ops;
20};
28548d78 21
c7e6ead7
ACM
22struct ins_operands {
23 char *raw;
44d1a3ed 24 struct {
6de783b6 25 char *raw;
44d1a3ed 26 char *name;
44d1a3ed 27 u64 addr;
e216874c
RB
28 s64 offset;
29 bool offset_avail;
44d1a3ed 30 } target;
7a997fe4
ACM
31 union {
32 struct {
33 char *raw;
34 char *name;
35 u64 addr;
36 } source;
37 struct {
75b49202 38 struct ins ins;
7a997fe4
ACM
39 struct ins_operands *ops;
40 } locked;
41 };
c7e6ead7
ACM
42};
43
786c1b51
ACM
44struct arch;
45
4f9d0325 46struct ins_ops {
c46219ac 47 void (*free)(struct ins_operands *ops);
786c1b51 48 int (*parse)(struct arch *arch, struct ins_operands *ops, struct map *map);
28548d78 49 int (*scnprintf)(struct ins *ins, char *bf, size_t size,
5417072b 50 struct ins_operands *ops);
4f9d0325
ACM
51};
52
4f9d0325 53bool ins__is_jump(const struct ins *ins);
d86b0597 54bool ins__is_call(const struct ins *ins);
6ef94929 55bool ins__is_ret(const struct ins *ins);
7e63a13a 56bool ins__is_lock(const struct ins *ins);
5417072b 57int ins__scnprintf(struct ins *ins, char *bf, size_t size, struct ins_operands *ops);
69fb09f6 58bool ins__is_fused(struct arch *arch, const char *ins1, const char *ins2);
4f9d0325 59
e64aa75b
NK
60struct annotation;
61
29ed6e76 62struct disasm_line {
c7e6ead7
ACM
63 struct list_head node;
64 s64 offset;
65 char *line;
75b49202 66 struct ins ins;
e592488c 67 int line_nr;
30e863bb
AK
68 float ipc;
69 u64 cycles;
c7e6ead7 70 struct ins_operands ops;
78f7defe
ACM
71};
72
fb29fa58
ACM
73static inline bool disasm_line__has_offset(const struct disasm_line *dl)
74{
e216874c 75 return dl->ops.target.offset_avail;
fb29fa58
ACM
76}
77
896bccd3
TS
78struct sym_hist_entry {
79 u64 nr_samples;
80 u64 period;
81};
82
29ed6e76
ACM
83void disasm_line__free(struct disasm_line *dl);
84struct disasm_line *disasm__get_next_ip_line(struct list_head *head, struct disasm_line *pos);
5417072b 85int disasm_line__scnprintf(struct disasm_line *dl, char *bf, size_t size, bool raw);
5145418b 86size_t disasm__fprintf(struct list_head *head, FILE *fp);
e64aa75b 87double disasm__calc_percent(struct annotation *notes, int evidx, s64 offset,
896bccd3 88 s64 end, const char **path, struct sym_hist_entry *sample);
78f7defe
ACM
89
90struct sym_hist {
8158683d 91 u64 nr_samples;
461c17f0 92 u64 period;
896bccd3 93 struct sym_hist_entry addr[0];
78f7defe
ACM
94};
95
d4957633
AK
96struct cyc_hist {
97 u64 start;
98 u64 cycles;
99 u64 cycles_aggr;
100 u32 num;
101 u32 num_aggr;
102 u8 have_start;
103 /* 1 byte padding */
104 u16 reset;
105};
106
276af92f 107struct source_line_samples {
78f7defe 108 double percent;
41127965 109 double percent_sum;
99094a5e 110 u64 nr;
c5a8368c
NK
111};
112
113struct source_line {
114 struct rb_node node;
78f7defe 115 char *path;
1491c22a 116 int nr_pcnt;
276af92f 117 struct source_line_samples samples[1];
78f7defe
ACM
118};
119
ce6f4fab 120/** struct annotated_source - symbols with hits have this attached as in sannotation
2f525d01
ACM
121 *
122 * @histogram: Array of addr hit histograms per event being monitored
ce6f4fab 123 * @lines: If 'print_lines' is specified, per source code line percentages
29ed6e76 124 * @source: source parsed from a disassembler like objdump -dS
d4957633 125 * @cyc_hist: Average cycles per basic block
2f525d01 126 *
ce6f4fab 127 * lines is allocated, percentages calculated and all sorted by percentage
2f525d01
ACM
128 * when the annotation is about to be presented, so the percentages are for
129 * one of the entries in the histogram array, i.e. for the event/counter being
130 * presented. It is deallocated right after symbol__{tui,tty,etc}_annotate
131 * returns.
132 */
ce6f4fab
ACM
133struct annotated_source {
134 struct list_head source;
135 struct source_line *lines;
36532461 136 int nr_histograms;
5ec4502d 137 size_t sizeof_sym_hist;
d4957633 138 struct cyc_hist *cycles_hist;
ce6f4fab
ACM
139 struct sym_hist histograms[0];
140};
141
142struct annotation {
143 pthread_mutex_t lock;
70fbe057 144 u64 max_coverage;
ce6f4fab 145 struct annotated_source *src;
78f7defe
ACM
146};
147
2f525d01
ACM
148static inline struct sym_hist *annotation__histogram(struct annotation *notes, int idx)
149{
ce6f4fab
ACM
150 return (((void *)&notes->src->histograms) +
151 (notes->src->sizeof_sym_hist * idx));
2f525d01
ACM
152}
153
78f7defe
ACM
154static inline struct annotation *symbol__annotation(struct symbol *sym)
155{
813ccd15 156 return (void *)sym - symbol_conf.priv_size;
78f7defe
ACM
157}
158
bab89f6a
TS
159int addr_map_symbol__inc_samples(struct addr_map_symbol *ams, struct perf_sample *sample,
160 int evidx);
0f4e7a24 161
d4957633
AK
162int addr_map_symbol__account_cycles(struct addr_map_symbol *ams,
163 struct addr_map_symbol *start,
164 unsigned cycles);
165
bab89f6a
TS
166int hist_entry__inc_addr_samples(struct hist_entry *he, struct perf_sample *sample,
167 int evidx, u64 addr);
f626adff 168
d04b35f8 169int symbol__alloc_hist(struct symbol *sym);
36532461 170void symbol__annotate_zero_histograms(struct symbol *sym);
78f7defe 171
dcaa3948
JY
172int symbol__disassemble(struct symbol *sym, struct map *map,
173 const char *arch_name, size_t privsize,
69fb09f6 174 struct arch **parch, char *cpuid);
f626adff 175
ee51d851
ACM
176enum symbol_disassemble_errno {
177 SYMBOL_ANNOTATE_ERRNO__SUCCESS = 0,
178
179 /*
180 * Choose an arbitrary negative big number not to clash with standard
181 * errno since SUS requires the errno has distinct positive values.
182 * See 'Issue 6' in the link below.
183 *
184 * http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html
185 */
186 __SYMBOL_ANNOTATE_ERRNO__START = -10000,
187
188 SYMBOL_ANNOTATE_ERRNO__NO_VMLINUX = __SYMBOL_ANNOTATE_ERRNO__START,
189
190 __SYMBOL_ANNOTATE_ERRNO__END,
191};
192
193int symbol__strerror_disassemble(struct symbol *sym, struct map *map,
194 int errnum, char *buf, size_t buflen);
195
db8fd07a
NK
196int symbol__annotate_printf(struct symbol *sym, struct map *map,
197 struct perf_evsel *evsel, bool full_paths,
198 int min_pcnt, int max_lines, int context);
36532461 199void symbol__annotate_zero_histogram(struct symbol *sym, int evidx);
ce6f4fab 200void symbol__annotate_decay_histogram(struct symbol *sym, int evidx);
29ed6e76 201void disasm__purge(struct list_head *head);
78f7defe 202
48c65bda
NK
203bool ui__has_annotation(void);
204
db8fd07a
NK
205int symbol__tty_annotate(struct symbol *sym, struct map *map,
206 struct perf_evsel *evsel, bool print_lines,
207 bool full_paths, int min_pcnt, int max_lines);
78f7defe 208
89fe808a 209#ifdef HAVE_SLANG_SUPPORT
db8fd07a
NK
210int symbol__tui_annotate(struct symbol *sym, struct map *map,
211 struct perf_evsel *evsel,
9783adf7 212 struct hist_browser_timer *hbt);
1254b51e 213#else
1d037ca1 214static inline int symbol__tui_annotate(struct symbol *sym __maybe_unused,
db8fd07a
NK
215 struct map *map __maybe_unused,
216 struct perf_evsel *evsel __maybe_unused,
217 struct hist_browser_timer *hbt
218 __maybe_unused)
78f7defe
ACM
219{
220 return 0;
221}
78f7defe
ACM
222#endif
223
f69b64f7
AK
224extern const char *disassembler_style;
225
78f7defe 226#endif /* __PERF_ANNOTATE_H */