]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/mi/mi-cmd-disas.c
Introduce gdb_disassembly_flags
[thirdparty/binutils-gdb.git] / gdb / mi / mi-cmd-disas.c
CommitLineData
fb40c209 1/* MI Command Set - disassemble commands.
61baf725 2 Copyright (C) 2000-2017 Free Software Foundation, Inc.
ab91fdd5 3 Contributed by Cygnus Solutions (a Red Hat company).
fb40c209
AC
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
fb40c209
AC
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
fb40c209
AC
19
20#include "defs.h"
13274fc3 21#include "arch-utils.h"
fb40c209
AC
22#include "target.h"
23#include "value.h"
24#include "mi-cmds.h"
25#include "mi-getopt.h"
92df71f0
FN
26#include "ui-out.h"
27#include "disasm.h"
8f0eea0e 28
2b03b41d 29/* The arguments to be passed on the command line and parsed here are
fb40c209
AC
30 either:
31
32 START-ADDRESS: address to start the disassembly at.
33 END-ADDRESS: address to end the disassembly at.
34
35 or:
36
37 FILENAME: The name of the file where we want disassemble from.
38 LINE: The line around which we want to disassemble. It will
39 disassemble the function that contins that line.
b716877b 40 HOW_MANY: Number of disassembly lines to display. With source, it
fb40c209
AC
41 is the number of disassembly lines only, not counting the source
42 lines.
43
44 always required:
45
b716877b 46 MODE: 0 -- disassembly.
6ff0ba5f 47 1 -- disassembly and source (with deprecated source-centric view).
b716877b 48 2 -- disassembly and opcodes.
6ff0ba5f
DE
49 3 -- disassembly, source-centric and opcodes.
50 4 -- disassembly, and source (with pc-centric view).
51 5 -- disassembly, source (pc-centric) and opcodes. */
2b03b41d 52
ce8f13f8 53void
9f33b8b7 54mi_cmd_disassemble (const char *command, char **argv, int argc)
fb40c209 55{
13274fc3 56 struct gdbarch *gdbarch = get_current_arch ();
79a45e25 57 struct ui_out *uiout = current_uiout;
fb40c209 58 CORE_ADDR start;
fb40c209 59
9a24775b
PA
60 int mode;
61 gdb_disassembly_flags disasm_flags;
fb40c209
AC
62 struct symtab *s;
63
8e2eec62 64 /* Which options have we processed ... */
fb40c209
AC
65 int file_seen = 0;
66 int line_seen = 0;
67 int num_seen = 0;
68 int start_seen = 0;
69 int end_seen = 0;
70
8e2eec62
AC
71 /* ... and their corresponding value. */
72 char *file_string = NULL;
73 int line_num = -1;
74 int how_many = -1;
75 CORE_ADDR low = 0;
76 CORE_ADDR high = 0;
85c9d6a6 77 struct cleanup *cleanups = make_cleanup (null_cleanup, NULL);
8e2eec62 78
2b03b41d 79 /* Options processing stuff. */
81493c62
AS
80 int oind = 0;
81 char *oarg;
fb40c209 82 enum opt
fb40c209 83 {
27cdacdb
EZ
84 FILE_OPT, LINE_OPT, NUM_OPT, START_OPT, END_OPT
85 };
2b03b41d
SS
86 static const struct mi_opt opts[] =
87 {
88 {"f", FILE_OPT, 1},
89 {"l", LINE_OPT, 1},
90 {"n", NUM_OPT, 1},
91 {"s", START_OPT, 1},
92 {"e", END_OPT, 1},
93 { 0, 0, 0 }
94 };
fb40c209
AC
95
96 /* Get the options with their arguments. Keep track of what we
2b03b41d 97 encountered. */
fb40c209
AC
98 while (1)
99 {
1b05df00 100 int opt = mi_getopt ("-data-disassemble", argc, argv, opts,
81493c62 101 &oind, &oarg);
fb40c209
AC
102 if (opt < 0)
103 break;
104 switch ((enum opt) opt)
105 {
106 case FILE_OPT:
81493c62 107 file_string = xstrdup (oarg);
fb40c209 108 file_seen = 1;
85c9d6a6 109 make_cleanup (xfree, file_string);
fb40c209
AC
110 break;
111 case LINE_OPT:
81493c62 112 line_num = atoi (oarg);
fb40c209
AC
113 line_seen = 1;
114 break;
115 case NUM_OPT:
81493c62 116 how_many = atoi (oarg);
fb40c209
AC
117 num_seen = 1;
118 break;
119 case START_OPT:
81493c62 120 low = parse_and_eval_address (oarg);
fb40c209
AC
121 start_seen = 1;
122 break;
123 case END_OPT:
81493c62 124 high = parse_and_eval_address (oarg);
fb40c209
AC
125 end_seen = 1;
126 break;
127 }
128 }
81493c62
AS
129 argv += oind;
130 argc -= oind;
fb40c209
AC
131
132 /* Allow only filename + linenum (with how_many which is not
2b03b41d 133 required) OR start_addr + end_addr. */
fb40c209
AC
134
135 if (!((line_seen && file_seen && num_seen && !start_seen && !end_seen)
136 || (line_seen && file_seen && !num_seen && !start_seen && !end_seen)
27cdacdb 137 || (!line_seen && !file_seen && !num_seen && start_seen && end_seen)))
1b05df00 138 error (_("-data-disassemble: Usage: ( [-f filename -l linenum [-n "
b716877b 139 "howmany]] | [-s startaddr -e endaddr]) [--] mode."));
fb40c209
AC
140
141 if (argc != 1)
1b05df00 142 error (_("-data-disassemble: Usage: [-f filename -l linenum "
b716877b 143 "[-n howmany]] [-s startaddr -e endaddr] [--] mode."));
fb40c209 144
b716877b 145 mode = atoi (argv[0]);
6ff0ba5f
DE
146 if (mode < 0 || mode > 5)
147 error (_("-data-disassemble: Mode argument must be in the range 0-5."));
fb40c209 148
2b03b41d 149 /* Convert the mode into a set of disassembly flags. */
b716877b 150
6ff0ba5f
DE
151 disasm_flags = 0; /* Initialize here for -Wall. */
152 switch (mode)
153 {
154 case 0:
155 break;
156 case 1:
157 disasm_flags |= DISASSEMBLY_SOURCE_DEPRECATED;
158 break;
159 case 2:
160 disasm_flags |= DISASSEMBLY_RAW_INSN;
161 break;
162 case 3:
163 disasm_flags |= DISASSEMBLY_SOURCE_DEPRECATED | DISASSEMBLY_RAW_INSN;
164 break;
165 case 4:
166 disasm_flags |= DISASSEMBLY_SOURCE;
167 break;
168 case 5:
169 disasm_flags |= DISASSEMBLY_SOURCE | DISASSEMBLY_RAW_INSN;
170 break;
171 default:
172 gdb_assert_not_reached ("bad disassembly mode");
173 }
8f0eea0e 174
fb40c209 175 /* We must get the function beginning and end where line_num is
2b03b41d 176 contained. */
fb40c209
AC
177
178 if (line_seen && file_seen)
179 {
180 s = lookup_symtab (file_string);
181 if (s == NULL)
1b05df00 182 error (_("-data-disassemble: Invalid filename."));
fb40c209 183 if (!find_line_pc (s, line_num, &start))
1b05df00 184 error (_("-data-disassemble: Invalid line number"));
fb40c209 185 if (find_pc_partial_function (start, NULL, &low, &high) == 0)
1b05df00 186 error (_("-data-disassemble: "
9a2b4c1b 187 "No function contains specified address"));
fb40c209
AC
188 }
189
13274fc3 190 gdb_disassembly (gdbarch, uiout,
b716877b 191 disasm_flags,
328d0145 192 how_many, low, high);
85c9d6a6
MS
193
194 do_cleanups (cleanups);
fb40c209 195}