2012-05-14 Stan Shebs <stan@codesourcery.com>
[deliverable/binutils-gdb.git] / gdb / mi / mi-cmd-break.c
CommitLineData
fb40c209 1/* MI Command Set - breakpoint and watchpoint commands.
0b302171 2 Copyright (C) 2000-2002, 2007-2012 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"
a6d9a66e 21#include "arch-utils.h"
fb40c209
AC
22#include "mi-cmds.h"
23#include "ui-out.h"
24#include "mi-out.h"
25#include "breakpoint.h"
26#include "gdb_string.h"
27#include "mi-getopt.h"
5b7f31a4 28#include "gdb.h"
98deb0da 29#include "exceptions.h"
383f836e 30#include "observer.h"
8d3788bd 31#include "mi-main.h"
fb40c209 32
fb40c209
AC
33enum
34 {
35 FROM_TTY = 0
36 };
37
383f836e
TT
38/* True if MI breakpoint observers have been registered. */
39
40static int mi_breakpoint_observers_installed;
41
42/* Control whether breakpoint_notify may act. */
43
44static int mi_can_breakpoint_notify;
45
2b03b41d 46/* Output a single breakpoint, when allowed. */
fb40c209
AC
47
48static void
8d3788bd 49breakpoint_notify (struct breakpoint *b)
fb40c209 50{
383f836e 51 if (mi_can_breakpoint_notify)
79a45e25 52 gdb_breakpoint_query (current_uiout, b->number, NULL);
fb40c209
AC
53}
54
fb40c209
AC
55enum bp_type
56 {
57 REG_BP,
58 HW_BP,
59 REGEXP_BP
60 };
61
afe8ab22
VP
62/* Implements the -break-insert command.
63 See the MI manual for the list of possible options. */
fb40c209 64
ce8f13f8 65void
fb40c209
AC
66mi_cmd_break_insert (char *command, char **argv, int argc)
67{
68 char *address = NULL;
8cdf0e15 69 int hardware = 0;
fb40c209
AC
70 int temp_p = 0;
71 int thread = -1;
72 int ignore_count = 0;
73 char *condition = NULL;
afe8ab22 74 int pending = 0;
41447f92 75 int enabled = 1;
6534d786 76 int tracepoint = 0;
8cdf0e15 77 struct cleanup *back_to;
0fb4aa4b 78 enum bptype type_wanted;
41447f92 79
fb40c209
AC
80 enum opt
81 {
8cdf0e15 82 HARDWARE_OPT, TEMP_OPT, CONDITION_OPT,
6534d786
VP
83 IGNORE_COUNT_OPT, THREAD_OPT, PENDING_OPT, DISABLE_OPT,
84 TRACEPOINT_OPT,
fb40c209 85 };
91174723 86 static const struct mi_opt opts[] =
fb40c209
AC
87 {
88 {"h", HARDWARE_OPT, 0},
89 {"t", TEMP_OPT, 0},
90 {"c", CONDITION_OPT, 1},
91 {"i", IGNORE_COUNT_OPT, 1},
92 {"p", THREAD_OPT, 1},
afe8ab22 93 {"f", PENDING_OPT, 0},
41447f92 94 {"d", DISABLE_OPT, 0},
6534d786 95 {"a", TRACEPOINT_OPT, 0},
d5d6fca5 96 { 0, 0, 0 }
fb40c209
AC
97 };
98
99 /* Parse arguments. It could be -r or -h or -t, <location> or ``--''
100 to denote the end of the option list. */
f8c000a2
AS
101 int oind = 0;
102 char *oarg;
102040f0 103
fb40c209
AC
104 while (1)
105 {
1b05df00 106 int opt = mi_getopt ("-break-insert", argc, argv,
f8c000a2 107 opts, &oind, &oarg);
fb40c209
AC
108 if (opt < 0)
109 break;
110 switch ((enum opt) opt)
111 {
112 case TEMP_OPT:
113 temp_p = 1;
114 break;
115 case HARDWARE_OPT:
8cdf0e15 116 hardware = 1;
fb40c209 117 break;
fb40c209 118 case CONDITION_OPT:
f8c000a2 119 condition = oarg;
fb40c209
AC
120 break;
121 case IGNORE_COUNT_OPT:
f8c000a2 122 ignore_count = atol (oarg);
fb40c209
AC
123 break;
124 case THREAD_OPT:
f8c000a2 125 thread = atol (oarg);
fb40c209 126 break;
afe8ab22
VP
127 case PENDING_OPT:
128 pending = 1;
129 break;
41447f92
VP
130 case DISABLE_OPT:
131 enabled = 0;
6534d786
VP
132 break;
133 case TRACEPOINT_OPT:
134 tracepoint = 1;
135 break;
fb40c209
AC
136 }
137 }
138
f8c000a2 139 if (oind >= argc)
1b05df00 140 error (_("-break-insert: Missing <location>"));
f8c000a2 141 if (oind < argc - 1)
1b05df00 142 error (_("-break-insert: Garbage following <location>"));
f8c000a2 143 address = argv[oind];
fb40c209 144
2b03b41d 145 /* Now we have what we need, let's insert the breakpoint! */
383f836e
TT
146 if (! mi_breakpoint_observers_installed)
147 {
148 observer_attach_breakpoint_created (breakpoint_notify);
383f836e
TT
149 mi_breakpoint_observers_installed = 1;
150 }
151
8cdf0e15 152 back_to = make_cleanup_restore_integer (&mi_can_breakpoint_notify);
383f836e 153 mi_can_breakpoint_notify = 1;
0fb4aa4b
PA
154
155 /* Note that to request a fast tracepoint, the client uses the
156 "hardware" flag, although there's nothing of hardware related to
157 fast tracepoints -- one can implement slow tracepoints with
158 hardware breakpoints, but fast tracepoints are always software.
159 "fast" is a misnomer, actually, "jump" would be more appropriate.
160 A simulator or an emulator could conceivably implement fast
161 regular non-jump based tracepoints. */
162 type_wanted = (tracepoint
163 ? (hardware ? bp_fast_tracepoint : bp_tracepoint)
164 : (hardware ? bp_hardware_breakpoint : bp_breakpoint));
165
8cdf0e15 166 create_breakpoint (get_current_arch (), address, condition, thread,
e7e0cddf 167 NULL,
8cdf0e15 168 0 /* condition and thread are valid. */,
0fb4aa4b 169 temp_p, type_wanted,
8cdf0e15
VP
170 ignore_count,
171 pending ? AUTO_BOOLEAN_TRUE : AUTO_BOOLEAN_FALSE,
44f238bb 172 &bkpt_breakpoint_ops, 0, enabled, 0, 0);
8cdf0e15
VP
173 do_cleanups (back_to);
174
fb40c209
AC
175}
176
177enum wp_type
178{
179 REG_WP,
180 READ_WP,
181 ACCESS_WP
182};
183
9b4c786c
VP
184void
185mi_cmd_break_passcount (char *command, char **argv, int argc)
186{
187 int n;
188 int p;
d9b3f62e 189 struct tracepoint *t;
9b4c786c
VP
190
191 if (argc != 2)
192 error (_("Usage: tracepoint-number passcount"));
193
194 n = atoi (argv[0]);
195 p = atoi (argv[1]);
196 t = get_tracepoint (n);
197
198 if (t)
199 {
200 t->pass_count = p;
201 observer_notify_tracepoint_modified (n);
202 }
203 else
204 {
401a70b8 205 error (_("Could not find tracepoint %d"), n);
9b4c786c
VP
206 }
207}
208
fb40c209
AC
209/* Insert a watchpoint. The type of watchpoint is specified by the
210 first argument:
211 -break-watch <expr> --> insert a regular wp.
212 -break-watch -r <expr> --> insert a read watchpoint.
2b03b41d 213 -break-watch -a <expr> --> insert an access wp. */
fb40c209 214
ce8f13f8 215void
fb40c209
AC
216mi_cmd_break_watch (char *command, char **argv, int argc)
217{
218 char *expr = NULL;
219 enum wp_type type = REG_WP;
220 enum opt
221 {
222 READ_OPT, ACCESS_OPT
223 };
91174723 224 static const struct mi_opt opts[] =
fb40c209
AC
225 {
226 {"r", READ_OPT, 0},
227 {"a", ACCESS_OPT, 0},
d5d6fca5 228 { 0, 0, 0 }
fb40c209
AC
229 };
230
231 /* Parse arguments. */
f8c000a2
AS
232 int oind = 0;
233 char *oarg;
102040f0 234
fb40c209
AC
235 while (1)
236 {
1b05df00 237 int opt = mi_getopt ("-break-watch", argc, argv,
f8c000a2 238 opts, &oind, &oarg);
102040f0 239
fb40c209
AC
240 if (opt < 0)
241 break;
242 switch ((enum opt) opt)
243 {
244 case READ_OPT:
245 type = READ_WP;
246 break;
247 case ACCESS_OPT:
248 type = ACCESS_WP;
249 break;
250 }
251 }
f8c000a2 252 if (oind >= argc)
1b05df00 253 error (_("-break-watch: Missing <expression>"));
f8c000a2 254 if (oind < argc - 1)
1b05df00 255 error (_("-break-watch: Garbage following <expression>"));
f8c000a2 256 expr = argv[oind];
fb40c209 257
2b03b41d 258 /* Now we have what we need, let's insert the watchpoint! */
fb40c209
AC
259 switch (type)
260 {
261 case REG_WP:
84f4c1fe 262 watch_command_wrapper (expr, FROM_TTY, 0);
fb40c209
AC
263 break;
264 case READ_WP:
84f4c1fe 265 rwatch_command_wrapper (expr, FROM_TTY, 0);
fb40c209
AC
266 break;
267 case ACCESS_WP:
84f4c1fe 268 awatch_command_wrapper (expr, FROM_TTY, 0);
fb40c209
AC
269 break;
270 default:
1b05df00 271 error (_("-break-watch: Unknown watchpoint type."));
fb40c209 272 }
fb40c209 273}
48cb2d85
VP
274
275/* The mi_read_next_line consults these variable to return successive
276 command lines. While it would be clearer to use a closure pointer,
277 it is not expected that any future code will use read_command_lines_1,
278 therefore no point of overengineering. */
279
280static char **mi_command_line_array;
281static int mi_command_line_array_cnt;
282static int mi_command_line_array_ptr;
283
284static char *
a58d7472 285mi_read_next_line (void)
48cb2d85
VP
286{
287 if (mi_command_line_array_ptr == mi_command_line_array_cnt)
288 return NULL;
289 else
290 return mi_command_line_array[mi_command_line_array_ptr++];
291}
292
293void
294mi_cmd_break_commands (char *command, char **argv, int argc)
295{
296 struct command_line *break_command;
297 char *endptr;
298 int bnum;
299 struct breakpoint *b;
300
301 if (argc < 1)
9b20d036 302 error (_("USAGE: %s <BKPT> [<COMMAND> [<COMMAND>...]]"), command);
48cb2d85
VP
303
304 bnum = strtol (argv[0], &endptr, 0);
305 if (endptr == argv[0])
9b20d036 306 error (_("breakpoint number argument \"%s\" is not a number."),
48cb2d85
VP
307 argv[0]);
308 else if (*endptr != '\0')
9b20d036 309 error (_("junk at the end of breakpoint number argument \"%s\"."),
48cb2d85
VP
310 argv[0]);
311
312 b = get_breakpoint (bnum);
313 if (b == NULL)
9b20d036 314 error (_("breakpoint %d not found."), bnum);
48cb2d85
VP
315
316 mi_command_line_array = argv;
317 mi_command_line_array_ptr = 1;
318 mi_command_line_array_cnt = argc;
319
d77f58be 320 if (is_tracepoint (b))
a7bdde9e
VP
321 break_command = read_command_lines_1 (mi_read_next_line, 1,
322 check_tracepoint_command, b);
323 else
324 break_command = read_command_lines_1 (mi_read_next_line, 1, 0, 0);
325
48cb2d85
VP
326 breakpoint_set_commands (b, break_command);
327}
328
This page took 1.069112 seconds and 4 git commands to generate.