2011-08-04 Pedro Alves <pedro@codesourcery.com>
[deliverable/binutils-gdb.git] / gdb / mi / mi-cmd-break.c
CommitLineData
fb40c209 1/* MI Command Set - breakpoint and watchpoint commands.
7b6bb8da 2 Copyright (C) 2000, 2001, 2002, 2007, 2008, 2009, 2010, 2011
0fb0cc75 3 Free Software Foundation, Inc.
ab91fdd5 4 Contributed by Cygnus Solutions (a Red Hat company).
fb40c209
AC
5
6 This file is part of GDB.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
a9762ec7 10 the Free Software Foundation; either version 3 of the License, or
fb40c209
AC
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
a9762ec7 19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
fb40c209
AC
20
21#include "defs.h"
a6d9a66e 22#include "arch-utils.h"
fb40c209
AC
23#include "mi-cmds.h"
24#include "ui-out.h"
25#include "mi-out.h"
26#include "breakpoint.h"
27#include "gdb_string.h"
28#include "mi-getopt.h"
5b7f31a4 29#include "gdb.h"
98deb0da 30#include "exceptions.h"
383f836e 31#include "observer.h"
8d3788bd 32#include "mi-main.h"
fb40c209 33
fb40c209
AC
34enum
35 {
36 FROM_TTY = 0
37 };
38
383f836e
TT
39/* True if MI breakpoint observers have been registered. */
40
41static int mi_breakpoint_observers_installed;
42
43/* Control whether breakpoint_notify may act. */
44
45static int mi_can_breakpoint_notify;
46
47/* Output a single breakpoint, when allowed. */
fb40c209
AC
48
49static void
8d3788bd 50breakpoint_notify (struct breakpoint *b)
fb40c209 51{
383f836e 52 if (mi_can_breakpoint_notify)
79a45e25 53 gdb_breakpoint_query (current_uiout, b->number, NULL);
fb40c209
AC
54}
55
fb40c209
AC
56enum bp_type
57 {
58 REG_BP,
59 HW_BP,
60 REGEXP_BP
61 };
62
afe8ab22
VP
63/* Implements the -break-insert command.
64 See the MI manual for the list of possible options. */
fb40c209 65
ce8f13f8 66void
fb40c209
AC
67mi_cmd_break_insert (char *command, char **argv, int argc)
68{
69 char *address = NULL;
8cdf0e15 70 int hardware = 0;
fb40c209
AC
71 int temp_p = 0;
72 int thread = -1;
73 int ignore_count = 0;
74 char *condition = NULL;
afe8ab22 75 int pending = 0;
41447f92 76 int enabled = 1;
6534d786 77 int tracepoint = 0;
8cdf0e15 78 struct cleanup *back_to;
0fb4aa4b 79 enum bptype type_wanted;
41447f92 80
fb40c209
AC
81 enum opt
82 {
8cdf0e15 83 HARDWARE_OPT, TEMP_OPT, CONDITION_OPT,
6534d786
VP
84 IGNORE_COUNT_OPT, THREAD_OPT, PENDING_OPT, DISABLE_OPT,
85 TRACEPOINT_OPT,
fb40c209
AC
86 };
87 static struct mi_opt opts[] =
88 {
89 {"h", HARDWARE_OPT, 0},
90 {"t", TEMP_OPT, 0},
91 {"c", CONDITION_OPT, 1},
92 {"i", IGNORE_COUNT_OPT, 1},
93 {"p", THREAD_OPT, 1},
afe8ab22 94 {"f", PENDING_OPT, 0},
41447f92 95 {"d", DISABLE_OPT, 0},
6534d786 96 {"a", TRACEPOINT_OPT, 0},
d5d6fca5 97 { 0, 0, 0 }
fb40c209
AC
98 };
99
100 /* Parse arguments. It could be -r or -h or -t, <location> or ``--''
101 to denote the end of the option list. */
102 int optind = 0;
103 char *optarg;
102040f0 104
fb40c209
AC
105 while (1)
106 {
1b05df00 107 int opt = mi_getopt ("-break-insert", argc, argv,
9a2b4c1b 108 opts, &optind, &optarg);
fb40c209
AC
109 if (opt < 0)
110 break;
111 switch ((enum opt) opt)
112 {
113 case TEMP_OPT:
114 temp_p = 1;
115 break;
116 case HARDWARE_OPT:
8cdf0e15 117 hardware = 1;
fb40c209 118 break;
fb40c209
AC
119 case CONDITION_OPT:
120 condition = optarg;
121 break;
122 case IGNORE_COUNT_OPT:
123 ignore_count = atol (optarg);
124 break;
125 case THREAD_OPT:
126 thread = atol (optarg);
127 break;
afe8ab22
VP
128 case PENDING_OPT:
129 pending = 1;
130 break;
41447f92
VP
131 case DISABLE_OPT:
132 enabled = 0;
6534d786
VP
133 break;
134 case TRACEPOINT_OPT:
135 tracepoint = 1;
136 break;
fb40c209
AC
137 }
138 }
139
140 if (optind >= argc)
1b05df00 141 error (_("-break-insert: Missing <location>"));
fb40c209 142 if (optind < argc - 1)
1b05df00 143 error (_("-break-insert: Garbage following <location>"));
fb40c209
AC
144 address = argv[optind];
145
146 /* Now we have what we need, let's insert the breakpoint! */
383f836e
TT
147 if (! mi_breakpoint_observers_installed)
148 {
149 observer_attach_breakpoint_created (breakpoint_notify);
383f836e
TT
150 mi_breakpoint_observers_installed = 1;
151 }
152
8cdf0e15 153 back_to = make_cleanup_restore_integer (&mi_can_breakpoint_notify);
383f836e 154 mi_can_breakpoint_notify = 1;
0fb4aa4b
PA
155
156 /* Note that to request a fast tracepoint, the client uses the
157 "hardware" flag, although there's nothing of hardware related to
158 fast tracepoints -- one can implement slow tracepoints with
159 hardware breakpoints, but fast tracepoints are always software.
160 "fast" is a misnomer, actually, "jump" would be more appropriate.
161 A simulator or an emulator could conceivably implement fast
162 regular non-jump based tracepoints. */
163 type_wanted = (tracepoint
164 ? (hardware ? bp_fast_tracepoint : bp_tracepoint)
165 : (hardware ? bp_hardware_breakpoint : bp_breakpoint));
166
8cdf0e15
VP
167 create_breakpoint (get_current_arch (), address, condition, thread,
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,
348d480f 172 &bkpt_breakpoint_ops, 0, enabled, 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 {
205 error (_("Cound not find tracepoint %d"), n);
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.
213 -break-watch -a <expr> --> insert an access wp. */
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 };
224 static struct mi_opt opts[] =
225 {
226 {"r", READ_OPT, 0},
227 {"a", ACCESS_OPT, 0},
d5d6fca5 228 { 0, 0, 0 }
fb40c209
AC
229 };
230
231 /* Parse arguments. */
232 int optind = 0;
233 char *optarg;
102040f0 234
fb40c209
AC
235 while (1)
236 {
1b05df00 237 int opt = mi_getopt ("-break-watch", argc, argv,
102040f0
MS
238 opts, &optind, &optarg);
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 }
252 if (optind >= argc)
1b05df00 253 error (_("-break-watch: Missing <expression>"));
fb40c209 254 if (optind < argc - 1)
1b05df00 255 error (_("-break-watch: Garbage following <expression>"));
fb40c209
AC
256 expr = argv[optind];
257
258 /* Now we have what we need, let's insert the watchpoint! */
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 0.991413 seconds and 4 git commands to generate.