]> git.ipfire.org Git - thirdparty/linux.git/blame - tools/perf/util/annotate.h
perf annotate: Move line/offset into annotation_line struct
[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
a17c4ca0
JO
62struct annotation_line {
63 struct list_head node;
d5490b96
JO
64 s64 offset;
65 char *line;
66 int line_nr;
a17c4ca0
JO
67};
68
29ed6e76 69struct disasm_line {
a17c4ca0 70 struct annotation_line al;
a17c4ca0 71 struct ins ins;
a17c4ca0
JO
72 float ipc;
73 u64 cycles;
74 struct ins_operands ops;
78f7defe
ACM
75};
76
fb29fa58
ACM
77static inline bool disasm_line__has_offset(const struct disasm_line *dl)
78{
e216874c 79 return dl->ops.target.offset_avail;
fb29fa58
ACM
80}
81
896bccd3
TS
82struct sym_hist_entry {
83 u64 nr_samples;
84 u64 period;
85};
86
29ed6e76
ACM
87void disasm_line__free(struct disasm_line *dl);
88struct disasm_line *disasm__get_next_ip_line(struct list_head *head, struct disasm_line *pos);
5417072b 89int disasm_line__scnprintf(struct disasm_line *dl, char *bf, size_t size, bool raw);
5145418b 90size_t disasm__fprintf(struct list_head *head, FILE *fp);
e64aa75b 91double disasm__calc_percent(struct annotation *notes, int evidx, s64 offset,
896bccd3 92 s64 end, const char **path, struct sym_hist_entry *sample);
78f7defe
ACM
93
94struct sym_hist {
8158683d 95 u64 nr_samples;
461c17f0 96 u64 period;
896bccd3 97 struct sym_hist_entry addr[0];
78f7defe
ACM
98};
99
d4957633
AK
100struct cyc_hist {
101 u64 start;
102 u64 cycles;
103 u64 cycles_aggr;
104 u32 num;
105 u32 num_aggr;
106 u8 have_start;
107 /* 1 byte padding */
108 u16 reset;
109};
110
276af92f 111struct source_line_samples {
78f7defe 112 double percent;
41127965 113 double percent_sum;
99094a5e 114 u64 nr;
c5a8368c
NK
115};
116
117struct source_line {
118 struct rb_node node;
78f7defe 119 char *path;
1491c22a 120 int nr_pcnt;
276af92f 121 struct source_line_samples samples[1];
78f7defe
ACM
122};
123
ce6f4fab 124/** struct annotated_source - symbols with hits have this attached as in sannotation
2f525d01
ACM
125 *
126 * @histogram: Array of addr hit histograms per event being monitored
ce6f4fab 127 * @lines: If 'print_lines' is specified, per source code line percentages
29ed6e76 128 * @source: source parsed from a disassembler like objdump -dS
d4957633 129 * @cyc_hist: Average cycles per basic block
2f525d01 130 *
ce6f4fab 131 * lines is allocated, percentages calculated and all sorted by percentage
2f525d01
ACM
132 * when the annotation is about to be presented, so the percentages are for
133 * one of the entries in the histogram array, i.e. for the event/counter being
134 * presented. It is deallocated right after symbol__{tui,tty,etc}_annotate
135 * returns.
136 */
ce6f4fab
ACM
137struct annotated_source {
138 struct list_head source;
139 struct source_line *lines;
36532461 140 int nr_histograms;
5ec4502d 141 size_t sizeof_sym_hist;
d4957633 142 struct cyc_hist *cycles_hist;
ce6f4fab
ACM
143 struct sym_hist histograms[0];
144};
145
146struct annotation {
147 pthread_mutex_t lock;
70fbe057 148 u64 max_coverage;
ce6f4fab 149 struct annotated_source *src;
78f7defe
ACM
150};
151
2f525d01
ACM
152static inline struct sym_hist *annotation__histogram(struct annotation *notes, int idx)
153{
ce6f4fab
ACM
154 return (((void *)&notes->src->histograms) +
155 (notes->src->sizeof_sym_hist * idx));
2f525d01
ACM
156}
157
78f7defe
ACM
158static inline struct annotation *symbol__annotation(struct symbol *sym)
159{
813ccd15 160 return (void *)sym - symbol_conf.priv_size;
78f7defe
ACM
161}
162
bab89f6a
TS
163int addr_map_symbol__inc_samples(struct addr_map_symbol *ams, struct perf_sample *sample,
164 int evidx);
0f4e7a24 165
d4957633
AK
166int addr_map_symbol__account_cycles(struct addr_map_symbol *ams,
167 struct addr_map_symbol *start,
168 unsigned cycles);
169
bab89f6a
TS
170int hist_entry__inc_addr_samples(struct hist_entry *he, struct perf_sample *sample,
171 int evidx, u64 addr);
f626adff 172
d04b35f8 173int symbol__alloc_hist(struct symbol *sym);
36532461 174void symbol__annotate_zero_histograms(struct symbol *sym);
78f7defe 175
dcaa3948
JY
176int symbol__disassemble(struct symbol *sym, struct map *map,
177 const char *arch_name, size_t privsize,
69fb09f6 178 struct arch **parch, char *cpuid);
f626adff 179
ee51d851
ACM
180enum symbol_disassemble_errno {
181 SYMBOL_ANNOTATE_ERRNO__SUCCESS = 0,
182
183 /*
184 * Choose an arbitrary negative big number not to clash with standard
185 * errno since SUS requires the errno has distinct positive values.
186 * See 'Issue 6' in the link below.
187 *
188 * http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html
189 */
190 __SYMBOL_ANNOTATE_ERRNO__START = -10000,
191
192 SYMBOL_ANNOTATE_ERRNO__NO_VMLINUX = __SYMBOL_ANNOTATE_ERRNO__START,
193
194 __SYMBOL_ANNOTATE_ERRNO__END,
195};
196
197int symbol__strerror_disassemble(struct symbol *sym, struct map *map,
198 int errnum, char *buf, size_t buflen);
199
db8fd07a
NK
200int symbol__annotate_printf(struct symbol *sym, struct map *map,
201 struct perf_evsel *evsel, bool full_paths,
202 int min_pcnt, int max_lines, int context);
36532461 203void symbol__annotate_zero_histogram(struct symbol *sym, int evidx);
ce6f4fab 204void symbol__annotate_decay_histogram(struct symbol *sym, int evidx);
29ed6e76 205void disasm__purge(struct list_head *head);
78f7defe 206
48c65bda
NK
207bool ui__has_annotation(void);
208
db8fd07a
NK
209int symbol__tty_annotate(struct symbol *sym, struct map *map,
210 struct perf_evsel *evsel, bool print_lines,
211 bool full_paths, int min_pcnt, int max_lines);
78f7defe 212
89fe808a 213#ifdef HAVE_SLANG_SUPPORT
db8fd07a
NK
214int symbol__tui_annotate(struct symbol *sym, struct map *map,
215 struct perf_evsel *evsel,
9783adf7 216 struct hist_browser_timer *hbt);
1254b51e 217#else
1d037ca1 218static inline int symbol__tui_annotate(struct symbol *sym __maybe_unused,
db8fd07a
NK
219 struct map *map __maybe_unused,
220 struct perf_evsel *evsel __maybe_unused,
221 struct hist_browser_timer *hbt
222 __maybe_unused)
78f7defe
ACM
223{
224 return 0;
225}
78f7defe
ACM
226#endif
227
f69b64f7
AK
228extern const char *disassembler_style;
229
78f7defe 230#endif /* __PERF_ANNOTATE_H */