Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.2.
  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_LIBDW_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_LIBDW_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	/** @e_machine: ELF machine associated with arch. */
 48	unsigned int e_machine;
 49	/** @e_flags: Optional ELF flags associated with arch. */
 50	unsigned int e_flags;
 51};
 52
 53struct ins {
 54	const char     *name;
 55	struct ins_ops *ops;
 56};
 57
 58struct ins_operands {
 59	char	*raw;
 60	struct {
 61		char	*raw;
 62		char	*name;
 63		struct symbol *sym;
 64		u64	addr;
 65		s64	offset;
 66		bool	offset_avail;
 67		bool	outside;
 68		bool	multi_regs;
 69		bool	mem_ref;
 70	} target;
 71	union {
 72		struct {
 73			char	*raw;
 74			char	*name;
 75			u64	addr;
 76			bool	multi_regs;
 77			bool	mem_ref;
 78		} source;
 79		struct {
 80			struct ins	    ins;
 81			struct ins_operands *ops;
 82		} locked;
 83		struct {
 84			char	*raw_comment;
 85			char	*raw_func_start;
 86		} jump;
 87	};
 88};
 89
 90struct ins_ops {
 91	void (*free)(struct ins_operands *ops);
 92	int (*parse)(struct arch *arch, struct ins_operands *ops, struct map_symbol *ms,
 93			struct disasm_line *dl);
 94	int (*scnprintf)(struct ins *ins, char *bf, size_t size,
 95			 struct ins_operands *ops, int max_ins_name);
 96};
 97
 98struct annotate_args {
 99	struct arch		  *arch;
100	struct map_symbol	  ms;
101	struct evsel		  *evsel;
102	struct annotation_options *options;
103	s64			  offset;
104	char			  *line;
105	int			  line_nr;
106	char			  *fileloc;
107};
108
109struct arch *arch__find(const char *name);
110bool arch__is(struct arch *arch, const char *name);
111
112struct ins_ops *ins__find(struct arch *arch, const char *name, struct disasm_line *dl);
113int ins__scnprintf(struct ins *ins, char *bf, size_t size,
114		   struct ins_operands *ops, int max_ins_name);
115
116bool ins__is_call(const struct ins *ins);
117bool ins__is_jump(const struct ins *ins);
118bool ins__is_fused(struct arch *arch, const char *ins1, const char *ins2);
119bool ins__is_nop(const struct ins *ins);
120bool ins__is_ret(const struct ins *ins);
121bool ins__is_lock(const struct ins *ins);
122
123struct disasm_line *disasm_line__new(struct annotate_args *args);
124void disasm_line__free(struct disasm_line *dl);
125
126int disasm_line__scnprintf(struct disasm_line *dl, char *bf, size_t size,
127			   bool raw, int max_ins_name);
128
129int symbol__disassemble(struct symbol *sym, struct annotate_args *args);
130
131#endif /* __PERF_UTIL_DISASM_H */