Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
at v6.12-rc1 127 lines 3.0 kB view raw
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 */