disasm.h revision 1.1.1.5 1 1.1 christos /* Disassemble support for GDB.
2 1.1.1.5 christos Copyright (C) 2002-2019 Free Software Foundation, Inc.
3 1.1 christos
4 1.1 christos This file is part of GDB.
5 1.1 christos
6 1.1 christos This program is free software; you can redistribute it and/or modify
7 1.1 christos it under the terms of the GNU General Public License as published by
8 1.1 christos the Free Software Foundation; either version 3 of the License, or
9 1.1 christos (at your option) any later version.
10 1.1 christos
11 1.1 christos This program is distributed in the hope that it will be useful,
12 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of
13 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 1.1 christos GNU General Public License for more details.
15 1.1 christos
16 1.1 christos You should have received a copy of the GNU General Public License
17 1.1 christos along with this program. If not, see <http://www.gnu.org/licenses/>. */
18 1.1 christos
19 1.1 christos #ifndef DISASM_H
20 1.1 christos #define DISASM_H
21 1.1 christos
22 1.1.1.2 christos #include "dis-asm.h"
23 1.1.1.5 christos #include "common/enum-flags.h"
24 1.1.1.2 christos
25 1.1.1.5 christos enum gdb_disassembly_flag
26 1.1.1.5 christos {
27 1.1.1.5 christos DISASSEMBLY_SOURCE_DEPRECATED = (0x1 << 0),
28 1.1.1.5 christos DISASSEMBLY_RAW_INSN = (0x1 << 1),
29 1.1.1.5 christos DISASSEMBLY_OMIT_FNAME = (0x1 << 2),
30 1.1.1.5 christos DISASSEMBLY_FILENAME = (0x1 << 3),
31 1.1.1.5 christos DISASSEMBLY_OMIT_PC = (0x1 << 4),
32 1.1.1.5 christos DISASSEMBLY_SOURCE = (0x1 << 5),
33 1.1.1.5 christos DISASSEMBLY_SPECULATIVE = (0x1 << 6),
34 1.1.1.5 christos };
35 1.1.1.5 christos DEF_ENUM_FLAGS_TYPE (enum gdb_disassembly_flag, gdb_disassembly_flags);
36 1.1 christos
37 1.1.1.2 christos struct gdbarch;
38 1.1 christos struct ui_out;
39 1.1 christos struct ui_file;
40 1.1 christos
41 1.1.1.4 christos class gdb_disassembler
42 1.1.1.4 christos {
43 1.1.1.4 christos using di_read_memory_ftype = decltype (disassemble_info::read_memory_func);
44 1.1.1.4 christos
45 1.1.1.4 christos public:
46 1.1.1.4 christos gdb_disassembler (struct gdbarch *gdbarch, struct ui_file *file)
47 1.1.1.4 christos : gdb_disassembler (gdbarch, file, dis_asm_read_memory)
48 1.1.1.4 christos {}
49 1.1.1.4 christos
50 1.1.1.4 christos int print_insn (CORE_ADDR memaddr, int *branch_delay_insns = NULL);
51 1.1.1.4 christos
52 1.1.1.4 christos /* Return the gdbarch of gdb_disassembler. */
53 1.1.1.4 christos struct gdbarch *arch ()
54 1.1.1.4 christos { return m_gdbarch; }
55 1.1.1.4 christos
56 1.1.1.4 christos protected:
57 1.1.1.4 christos gdb_disassembler (struct gdbarch *gdbarch, struct ui_file *file,
58 1.1.1.4 christos di_read_memory_ftype func);
59 1.1.1.4 christos
60 1.1.1.4 christos struct ui_file *stream ()
61 1.1.1.4 christos { return (struct ui_file *) m_di.stream; }
62 1.1.1.4 christos
63 1.1.1.4 christos private:
64 1.1.1.4 christos struct gdbarch *m_gdbarch;
65 1.1.1.4 christos
66 1.1.1.4 christos /* Stores data required for disassembling instructions in
67 1.1.1.4 christos opcodes. */
68 1.1.1.4 christos struct disassemble_info m_di;
69 1.1.1.5 christos
70 1.1.1.5 christos /* If we own the string in `m_di.disassembler_options', we do so
71 1.1.1.5 christos using this field. */
72 1.1.1.5 christos std::string m_disassembler_options_holder;
73 1.1.1.5 christos
74 1.1.1.4 christos CORE_ADDR m_err_memaddr;
75 1.1.1.4 christos
76 1.1.1.4 christos static int dis_asm_read_memory (bfd_vma memaddr, gdb_byte *myaddr,
77 1.1.1.4 christos unsigned int len,
78 1.1.1.4 christos struct disassemble_info *info);
79 1.1.1.4 christos static void dis_asm_memory_error (int err, bfd_vma memaddr,
80 1.1.1.4 christos struct disassemble_info *info);
81 1.1.1.4 christos static void dis_asm_print_address (bfd_vma addr,
82 1.1.1.4 christos struct disassemble_info *info);
83 1.1.1.4 christos };
84 1.1.1.4 christos
85 1.1.1.3 christos /* An instruction to be disassembled. */
86 1.1.1.3 christos
87 1.1.1.3 christos struct disasm_insn
88 1.1.1.3 christos {
89 1.1.1.3 christos /* The address of the memory containing the instruction. */
90 1.1.1.3 christos CORE_ADDR addr;
91 1.1.1.3 christos
92 1.1.1.3 christos /* An optional instruction number. If non-zero, it is printed first. */
93 1.1.1.3 christos unsigned int number;
94 1.1.1.3 christos
95 1.1.1.3 christos /* True if the instruction was executed speculatively. */
96 1.1.1.3 christos unsigned int is_speculative:1;
97 1.1.1.3 christos };
98 1.1.1.3 christos
99 1.1 christos extern void gdb_disassembly (struct gdbarch *gdbarch, struct ui_out *uiout,
100 1.1.1.5 christos gdb_disassembly_flags flags, int how_many,
101 1.1 christos CORE_ADDR low, CORE_ADDR high);
102 1.1 christos
103 1.1 christos /* Print the instruction at address MEMADDR in debugged memory,
104 1.1 christos on STREAM. Returns the length of the instruction, in bytes,
105 1.1 christos and, if requested, the number of branch delay slot instructions. */
106 1.1 christos
107 1.1 christos extern int gdb_print_insn (struct gdbarch *gdbarch, CORE_ADDR memaddr,
108 1.1 christos struct ui_file *stream, int *branch_delay_insns);
109 1.1 christos
110 1.1.1.4 christos /* Class used to pretty-print instructions. */
111 1.1.1.4 christos
112 1.1.1.4 christos class gdb_pretty_print_disassembler
113 1.1.1.4 christos {
114 1.1.1.4 christos public:
115 1.1.1.4 christos explicit gdb_pretty_print_disassembler (struct gdbarch *gdbarch)
116 1.1.1.4 christos : m_di (gdbarch, &m_insn_stb)
117 1.1.1.4 christos {}
118 1.1.1.4 christos
119 1.1.1.4 christos /* Prints the instruction INSN into UIOUT and returns the length of
120 1.1.1.4 christos the printed instruction in bytes. */
121 1.1.1.4 christos int pretty_print_insn (struct ui_out *uiout, const struct disasm_insn *insn,
122 1.1.1.5 christos gdb_disassembly_flags flags);
123 1.1.1.4 christos
124 1.1.1.4 christos private:
125 1.1.1.4 christos /* Returns the architecture used for disassembling. */
126 1.1.1.4 christos struct gdbarch *arch () { return m_di.arch (); }
127 1.1.1.4 christos
128 1.1.1.4 christos /* The disassembler used for instruction printing. */
129 1.1.1.4 christos gdb_disassembler m_di;
130 1.1.1.4 christos
131 1.1.1.4 christos /* The buffer used to build the instruction string. The
132 1.1.1.4 christos disassembler is initialized with this stream. */
133 1.1.1.4 christos string_file m_insn_stb;
134 1.1.1.4 christos
135 1.1.1.4 christos /* The buffer used to build the raw opcodes string. */
136 1.1.1.4 christos string_file m_opcode_stb;
137 1.1.1.4 christos };
138 1.1.1.4 christos
139 1.1 christos /* Return the length in bytes of the instruction at address MEMADDR in
140 1.1 christos debugged memory. */
141 1.1 christos
142 1.1 christos extern int gdb_insn_length (struct gdbarch *gdbarch, CORE_ADDR memaddr);
143 1.1 christos
144 1.1 christos /* Return the length in bytes of INSN, originally at MEMADDR. MAX_LEN
145 1.1 christos is the size of the buffer containing INSN. */
146 1.1 christos
147 1.1 christos extern int gdb_buffered_insn_length (struct gdbarch *gdbarch,
148 1.1 christos const gdb_byte *insn, int max_len,
149 1.1 christos CORE_ADDR memaddr);
150 1.1 christos
151 1.1.1.4 christos /* Returns GDBARCH's disassembler options. */
152 1.1.1.4 christos
153 1.1.1.4 christos extern char *get_disassembler_options (struct gdbarch *gdbarch);
154 1.1.1.4 christos
155 1.1.1.4 christos /* Sets the active gdbarch's disassembler options to OPTIONS. */
156 1.1.1.4 christos
157 1.1.1.4 christos extern void set_disassembler_options (char *options);
158 1.1.1.4 christos
159 1.1 christos #endif
160