Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1// SPDX-License-Identifier: GPL-2.0
2#ifndef __PERF_UTIL_DISASM_H
3#define __PERF_UTIL_DISASM_H
4
5#include "map_symbol.h"
6
7#ifdef HAVE_DWARF_SUPPORT
8#include "dwarf-aux.h"
9#endif
10
11struct annotation_options;
12struct disasm_line;
13struct ins;
14struct evsel;
15struct symbol;
16struct data_loc_info;
17struct type_state;
18struct disasm_line;
19
20struct arch {
21 const char *name;
22 struct ins *instructions;
23 size_t nr_instructions;
24 size_t nr_instructions_allocated;
25 struct ins_ops *(*associate_instruction_ops)(struct arch *arch, const char *name);
26 bool sorted_instructions;
27 bool initialized;
28 const char *insn_suffix;
29 void *priv;
30 unsigned int model;
31 unsigned int family;
32 int (*init)(struct arch *arch, char *cpuid);
33 bool (*ins_is_fused)(struct arch *arch, const char *ins1,
34 const char *ins2);
35 struct {
36 char comment_char;
37 char skip_functions_char;
38 char register_char;
39 char memory_ref_char;
40 char imm_char;
41 } objdump;
42#ifdef HAVE_DWARF_SUPPORT
43 void (*update_insn_state)(struct type_state *state,
44 struct data_loc_info *dloc, Dwarf_Die *cu_die,
45 struct disasm_line *dl);
46#endif
47};
48
49struct ins {
50 const char *name;
51 struct ins_ops *ops;
52};
53
54struct ins_operands {
55 char *raw;
56 struct {
57 char *raw;
58 char *name;
59 struct symbol *sym;
60 u64 addr;
61 s64 offset;
62 bool offset_avail;
63 bool outside;
64 bool multi_regs;
65 bool mem_ref;
66 } target;
67 union {
68 struct {
69 char *raw;
70 char *name;
71 u64 addr;
72 bool multi_regs;
73 bool mem_ref;
74 } source;
75 struct {
76 struct ins ins;
77 struct ins_operands *ops;
78 } locked;
79 struct {
80 char *raw_comment;
81 char *raw_func_start;
82 } jump;
83 };
84};
85
86struct ins_ops {
87 void (*free)(struct ins_operands *ops);
88 int (*parse)(struct arch *arch, struct ins_operands *ops, struct map_symbol *ms,
89 struct disasm_line *dl);
90 int (*scnprintf)(struct ins *ins, char *bf, size_t size,
91 struct ins_operands *ops, int max_ins_name);
92};
93
94struct annotate_args {
95 struct arch *arch;
96 struct map_symbol ms;
97 struct evsel *evsel;
98 struct annotation_options *options;
99 s64 offset;
100 char *line;
101 int line_nr;
102 char *fileloc;
103};
104
105struct arch *arch__find(const char *name);
106bool arch__is(struct arch *arch, const char *name);
107
108struct ins_ops *ins__find(struct arch *arch, const char *name, struct disasm_line *dl);
109int ins__scnprintf(struct ins *ins, char *bf, size_t size,
110 struct ins_operands *ops, int max_ins_name);
111
112bool ins__is_call(const struct ins *ins);
113bool ins__is_jump(const struct ins *ins);
114bool ins__is_fused(struct arch *arch, const char *ins1, const char *ins2);
115bool ins__is_nop(const struct ins *ins);
116bool ins__is_ret(const struct ins *ins);
117bool ins__is_lock(const struct ins *ins);
118
119struct disasm_line *disasm_line__new(struct annotate_args *args);
120void disasm_line__free(struct disasm_line *dl);
121
122int disasm_line__scnprintf(struct disasm_line *dl, char *bf, size_t size,
123 bool raw, int max_ins_name);
124
125int symbol__disassemble(struct symbol *sym, struct annotate_args *args);
126
127#endif /* __PERF_UTIL_DISASM_H */