128 lines · c
1// SPDX-License-Identifier: GPL-2.02#ifndef __PERF_UTIL_DISASM_H3#define __PERF_UTIL_DISASM_H4 5#include "map_symbol.h"6 7#ifdef HAVE_DWARF_SUPPORT8#include "dwarf-aux.h"9#endif10 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_SUPPORT43 void (*update_insn_state)(struct type_state *state,44 struct data_loc_info *dloc, Dwarf_Die *cu_die,45 struct disasm_line *dl);46#endif47};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 */128