Add set/show debug dwarf-line.
[deliverable/binutils-gdb.git] / gdb / mi / mi-cmd-disas.c
CommitLineData
fb40c209 1/* MI Command Set - disassemble commands.
32d0add0 2 Copyright (C) 2000-2015 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
AB
46 MODE: 0 -- disassembly.
47 1 -- disassembly and source.
48 2 -- disassembly and opcodes.
49 3 -- disassembly, source and opcodes.
50*/
2b03b41d 51
ce8f13f8 52void
fb40c209
AC
53mi_cmd_disassemble (char *command, char **argv, int argc)
54{
13274fc3 55 struct gdbarch *gdbarch = get_current_arch ();
79a45e25 56 struct ui_out *uiout = current_uiout;
fb40c209 57 CORE_ADDR start;
fb40c209 58
b716877b 59 int mode, disasm_flags;
fb40c209
AC
60 struct symtab *s;
61
8e2eec62 62 /* Which options have we processed ... */
fb40c209
AC
63 int file_seen = 0;
64 int line_seen = 0;
65 int num_seen = 0;
66 int start_seen = 0;
67 int end_seen = 0;
68
8e2eec62
AC
69 /* ... and their corresponding value. */
70 char *file_string = NULL;
71 int line_num = -1;
72 int how_many = -1;
73 CORE_ADDR low = 0;
74 CORE_ADDR high = 0;
85c9d6a6 75 struct cleanup *cleanups = make_cleanup (null_cleanup, NULL);
8e2eec62 76
2b03b41d 77 /* Options processing stuff. */
81493c62
AS
78 int oind = 0;
79 char *oarg;
fb40c209 80 enum opt
fb40c209 81 {
27cdacdb
EZ
82 FILE_OPT, LINE_OPT, NUM_OPT, START_OPT, END_OPT
83 };
2b03b41d
SS
84 static const struct mi_opt opts[] =
85 {
86 {"f", FILE_OPT, 1},
87 {"l", LINE_OPT, 1},
88 {"n", NUM_OPT, 1},
89 {"s", START_OPT, 1},
90 {"e", END_OPT, 1},
91 { 0, 0, 0 }
92 };
fb40c209
AC
93
94 /* Get the options with their arguments. Keep track of what we
2b03b41d 95 encountered. */
fb40c209
AC
96 while (1)
97 {
1b05df00 98 int opt = mi_getopt ("-data-disassemble", argc, argv, opts,
81493c62 99 &oind, &oarg);
fb40c209
AC
100 if (opt < 0)
101 break;
102 switch ((enum opt) opt)
103 {
104 case FILE_OPT:
81493c62 105 file_string = xstrdup (oarg);
fb40c209 106 file_seen = 1;
85c9d6a6 107 make_cleanup (xfree, file_string);
fb40c209
AC
108 break;
109 case LINE_OPT:
81493c62 110 line_num = atoi (oarg);
fb40c209
AC
111 line_seen = 1;
112 break;
113 case NUM_OPT:
81493c62 114 how_many = atoi (oarg);
fb40c209
AC
115 num_seen = 1;
116 break;
117 case START_OPT:
81493c62 118 low = parse_and_eval_address (oarg);
fb40c209
AC
119 start_seen = 1;
120 break;
121 case END_OPT:
81493c62 122 high = parse_and_eval_address (oarg);
fb40c209
AC
123 end_seen = 1;
124 break;
125 }
126 }
81493c62
AS
127 argv += oind;
128 argc -= oind;
fb40c209
AC
129
130 /* Allow only filename + linenum (with how_many which is not
2b03b41d 131 required) OR start_addr + end_addr. */
fb40c209
AC
132
133 if (!((line_seen && file_seen && num_seen && !start_seen && !end_seen)
134 || (line_seen && file_seen && !num_seen && !start_seen && !end_seen)
27cdacdb 135 || (!line_seen && !file_seen && !num_seen && start_seen && end_seen)))
1b05df00 136 error (_("-data-disassemble: Usage: ( [-f filename -l linenum [-n "
b716877b 137 "howmany]] | [-s startaddr -e endaddr]) [--] mode."));
fb40c209
AC
138
139 if (argc != 1)
1b05df00 140 error (_("-data-disassemble: Usage: [-f filename -l linenum "
b716877b 141 "[-n howmany]] [-s startaddr -e endaddr] [--] mode."));
fb40c209 142
b716877b
AB
143 mode = atoi (argv[0]);
144 if (mode < 0 || mode > 3)
1b05df00 145 error (_("-data-disassemble: Mode argument must be 0, 1, 2, or 3."));
fb40c209 146
2b03b41d 147 /* Convert the mode into a set of disassembly flags. */
b716877b
AB
148
149 disasm_flags = 0;
150 if (mode & 0x1)
151 disasm_flags |= DISASSEMBLY_SOURCE;
152 if (mode & 0x2)
153 disasm_flags |= DISASSEMBLY_RAW_INSN;
8f0eea0e 154
fb40c209 155 /* We must get the function beginning and end where line_num is
2b03b41d 156 contained. */
fb40c209
AC
157
158 if (line_seen && file_seen)
159 {
160 s = lookup_symtab (file_string);
161 if (s == NULL)
1b05df00 162 error (_("-data-disassemble: Invalid filename."));
fb40c209 163 if (!find_line_pc (s, line_num, &start))
1b05df00 164 error (_("-data-disassemble: Invalid line number"));
fb40c209 165 if (find_pc_partial_function (start, NULL, &low, &high) == 0)
1b05df00 166 error (_("-data-disassemble: "
9a2b4c1b 167 "No function contains specified address"));
fb40c209
AC
168 }
169
13274fc3 170 gdb_disassembly (gdbarch, uiout,
92df71f0 171 file_string,
b716877b 172 disasm_flags,
328d0145 173 how_many, low, high);
85c9d6a6
MS
174
175 do_cleanups (cleanups);
fb40c209 176}
This page took 1.212869 seconds and 4 git commands to generate.