* python/py-arch.c (gdbpy_initialize_arch): Return 'int'.
[deliverable/binutils-gdb.git] / gdb / mi / mi-main.c
CommitLineData
fb40c209 1/* MI Command Set.
cd0bfa36 2
28e7fd62 3 Copyright (C) 2000-2013 Free Software Foundation, Inc.
cd0bfa36 4
ab91fdd5 5 Contributed by Cygnus Solutions (a Red Hat company).
fb40c209
AC
6
7 This file is part of GDB.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
a9762ec7 11 the Free Software Foundation; either version 3 of the License, or
fb40c209
AC
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
a9762ec7 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
fb40c209 21
fb40c209 22#include "defs.h"
e17c207e 23#include "arch-utils.h"
fb40c209
AC
24#include "target.h"
25#include "inferior.h"
26#include "gdb_string.h"
60250e8b 27#include "exceptions.h"
fb40c209
AC
28#include "top.h"
29#include "gdbthread.h"
30#include "mi-cmds.h"
31#include "mi-parse.h"
32#include "mi-getopt.h"
33#include "mi-console.h"
34#include "ui-out.h"
35#include "mi-out.h"
4389a95a 36#include "interps.h"
fb40c209
AC
37#include "event-loop.h"
38#include "event-top.h"
41296c92 39#include "gdbcore.h" /* For write_memory(). */
56178203 40#include "value.h"
4e052eda 41#include "regcache.h"
5b7f31a4 42#include "gdb.h"
36dc181b 43#include "frame.h"
b9362cc7 44#include "mi-main.h"
66bb093b 45#include "mi-common.h"
d8ca156b 46#include "language.h"
79a45b7d 47#include "valprint.h"
3ee1c036 48#include "inferior.h"
07e059b5 49#include "osdata.h"
dc146f7c 50#include "splay-tree.h"
f224b49d 51#include "tracepoint.h"
d0353e76 52#include "ctf.h"
75082e8c 53#include "ada-lang.h"
f8eba3c6 54#include "linespec.h"
36dc181b 55
fb40c209
AC
56#include <ctype.h>
57#include <sys/time.h>
58
d8c83789
NR
59#if defined HAVE_SYS_RESOURCE_H
60#include <sys/resource.h>
61#endif
62
63#ifdef HAVE_GETRUSAGE
64struct rusage rusage;
65#endif
66
fb40c209
AC
67enum
68 {
69 FROM_TTY = 0
70 };
71
fb40c209 72int mi_debug_p;
2b03b41d 73
fb40c209
AC
74struct ui_file *raw_stdout;
75
2b03b41d
SS
76/* This is used to pass the current command timestamp down to
77 continuation routines. */
d8c83789
NR
78static struct mi_timestamp *current_command_ts;
79
80static int do_timings = 0;
81
a2840c35 82char *current_token;
2b03b41d
SS
83/* Few commands would like to know if options like --thread-group were
84 explicitly specified. This variable keeps the current parsed
85 command including all option, and make it possible. */
a79b8f6e
VP
86static struct mi_parse *current_context;
87
a2840c35 88int running_result_record_printed = 1;
fb40c209 89
f3b1572e
PA
90/* Flag indicating that the target has proceeded since the last
91 command was issued. */
92int mi_proceeded;
93
fb40c209 94extern void _initialize_mi_main (void);
ce8f13f8 95static void mi_cmd_execute (struct mi_parse *parse);
fb40c209 96
b2af646b
AC
97static void mi_execute_cli_command (const char *cmd, int args_p,
98 const char *args);
ce8f13f8 99static void mi_execute_async_cli_command (char *cli_command,
9a2b4c1b 100 char **argv, int argc);
6ed7ea50
UW
101static int register_changed_p (int regnum, struct regcache *,
102 struct regcache *);
7ccb0be9 103static void get_register (struct frame_info *, int regnum, int format);
4389a95a 104
41296c92 105/* Command implementations. FIXME: Is this libgdb? No. This is the MI
fb40c209 106 layer that calls libgdb. Any operation used in the below should be
41296c92 107 formalized. */
fb40c209 108
d8c83789
NR
109static void timestamp (struct mi_timestamp *tv);
110
111static void print_diff_now (struct mi_timestamp *start);
112static void print_diff (struct mi_timestamp *start, struct mi_timestamp *end);
113
ce8f13f8 114void
fb40c209
AC
115mi_cmd_gdb_exit (char *command, char **argv, int argc)
116{
41296c92 117 /* We have to print everything right here because we never return. */
721c02de
VP
118 if (current_token)
119 fputs_unfiltered (current_token, raw_stdout);
fb40c209 120 fputs_unfiltered ("^exit\n", raw_stdout);
79a45e25 121 mi_out_put (current_uiout, raw_stdout);
a6b29f87 122 gdb_flush (raw_stdout);
41296c92 123 /* FIXME: The function called is not yet a formal libgdb function. */
fb40c209 124 quit_force (NULL, FROM_TTY);
fb40c209
AC
125}
126
ce8f13f8 127void
9e22b03a 128mi_cmd_exec_next (char *command, char **argv, int argc)
fb40c209 129{
41296c92 130 /* FIXME: Should call a libgdb function, not a cli wrapper. */
e5829bee
MS
131 if (argc > 0 && strcmp(argv[0], "--reverse") == 0)
132 mi_execute_async_cli_command ("reverse-next", argv + 1, argc - 1);
133 else
134 mi_execute_async_cli_command ("next", argv, argc);
fb40c209
AC
135}
136
ce8f13f8 137void
9e22b03a 138mi_cmd_exec_next_instruction (char *command, char **argv, int argc)
fb40c209 139{
41296c92 140 /* FIXME: Should call a libgdb function, not a cli wrapper. */
e5829bee
MS
141 if (argc > 0 && strcmp(argv[0], "--reverse") == 0)
142 mi_execute_async_cli_command ("reverse-nexti", argv + 1, argc - 1);
143 else
144 mi_execute_async_cli_command ("nexti", argv, argc);
fb40c209
AC
145}
146
ce8f13f8 147void
9e22b03a 148mi_cmd_exec_step (char *command, char **argv, int argc)
fb40c209 149{
41296c92 150 /* FIXME: Should call a libgdb function, not a cli wrapper. */
e5829bee
MS
151 if (argc > 0 && strcmp(argv[0], "--reverse") == 0)
152 mi_execute_async_cli_command ("reverse-step", argv + 1, argc - 1);
153 else
154 mi_execute_async_cli_command ("step", argv, argc);
fb40c209
AC
155}
156
ce8f13f8 157void
9e22b03a 158mi_cmd_exec_step_instruction (char *command, char **argv, int argc)
fb40c209 159{
41296c92 160 /* FIXME: Should call a libgdb function, not a cli wrapper. */
e5829bee
MS
161 if (argc > 0 && strcmp(argv[0], "--reverse") == 0)
162 mi_execute_async_cli_command ("reverse-stepi", argv + 1, argc - 1);
163 else
164 mi_execute_async_cli_command ("stepi", argv, argc);
fb40c209
AC
165}
166
ce8f13f8 167void
9e22b03a 168mi_cmd_exec_finish (char *command, char **argv, int argc)
fb40c209 169{
41296c92 170 /* FIXME: Should call a libgdb function, not a cli wrapper. */
e5829bee
MS
171 if (argc > 0 && strcmp(argv[0], "--reverse") == 0)
172 mi_execute_async_cli_command ("reverse-finish", argv + 1, argc - 1);
173 else
174 mi_execute_async_cli_command ("finish", argv, argc);
fb40c209
AC
175}
176
ce8f13f8 177void
9e22b03a 178mi_cmd_exec_return (char *command, char **argv, int argc)
fb40c209 179{
fb40c209 180 /* This command doesn't really execute the target, it just pops the
2b03b41d 181 specified number of frames. */
9e22b03a 182 if (argc)
fb40c209 183 /* Call return_command with from_tty argument equal to 0 so as to
41296c92 184 avoid being queried. */
9e22b03a 185 return_command (*argv, 0);
fb40c209
AC
186 else
187 /* Call return_command with from_tty argument equal to 0 so as to
41296c92 188 avoid being queried. */
36dc181b 189 return_command (NULL, 0);
fb40c209
AC
190
191 /* Because we have called return_command with from_tty = 0, we need
41296c92 192 to print the frame here. */
b04f3ab4 193 print_stack_frame (get_selected_frame (NULL), 1, LOC_AND_ADDRESS);
fb40c209
AC
194}
195
143260c9
VP
196void
197mi_cmd_exec_jump (char *args, char **argv, int argc)
198{
199 /* FIXME: Should call a libgdb function, not a cli wrapper. */
202b96c1 200 mi_execute_async_cli_command ("jump", argv, argc);
143260c9
VP
201}
202
a79b8f6e
VP
203static void
204proceed_thread (struct thread_info *thread, int pid)
8dd4f202 205{
8dd4f202 206 if (!is_stopped (thread->ptid))
a79b8f6e 207 return;
8dd4f202 208
a79b8f6e
VP
209 if (pid != 0 && PIDGET (thread->ptid) != pid)
210 return;
8dd4f202
VP
211
212 switch_to_thread (thread->ptid);
213 clear_proceed_status ();
a493e3e2 214 proceed ((CORE_ADDR) -1, GDB_SIGNAL_DEFAULT, 0);
a79b8f6e
VP
215}
216
a79b8f6e
VP
217static int
218proceed_thread_callback (struct thread_info *thread, void *arg)
219{
220 int pid = *(int *)arg;
102040f0 221
a79b8f6e 222 proceed_thread (thread, pid);
8dd4f202
VP
223 return 0;
224}
225
e5829bee
MS
226static void
227exec_continue (char **argv, int argc)
fb40c209 228{
a79b8f6e 229 if (non_stop)
8dd4f202 230 {
2b03b41d
SS
231 /* In non-stop mode, 'resume' always resumes a single thread.
232 Therefore, to resume all threads of the current inferior, or
233 all threads in all inferiors, we need to iterate over
234 threads.
a79b8f6e
VP
235
236 See comment on infcmd.c:proceed_thread_callback for rationale. */
237 if (current_context->all || current_context->thread_group != -1)
238 {
239 int pid = 0;
240 struct cleanup *back_to = make_cleanup_restore_current_thread ();
8dd4f202 241
a79b8f6e
VP
242 if (!current_context->all)
243 {
9a2b4c1b
MS
244 struct inferior *inf
245 = find_inferior_id (current_context->thread_group);
246
a79b8f6e
VP
247 pid = inf->pid;
248 }
249 iterate_over_threads (proceed_thread_callback, &pid);
250 do_cleanups (back_to);
251 }
252 else
253 {
254 continue_1 (0);
255 }
8dd4f202 256 }
77ebaa5a 257 else
a79b8f6e
VP
258 {
259 struct cleanup *back_to = make_cleanup_restore_integer (&sched_multi);
102040f0 260
a79b8f6e
VP
261 if (current_context->all)
262 {
263 sched_multi = 1;
264 continue_1 (0);
265 }
266 else
267 {
2b03b41d
SS
268 /* In all-stop mode, -exec-continue traditionally resumed
269 either all threads, or one thread, depending on the
270 'scheduler-locking' variable. Let's continue to do the
271 same. */
a79b8f6e
VP
272 continue_1 (1);
273 }
274 do_cleanups (back_to);
275 }
e5829bee
MS
276}
277
e5829bee 278static void
a79b8f6e 279exec_direction_forward (void *notused)
e5829bee 280{
e5829bee
MS
281 execution_direction = EXEC_FORWARD;
282}
283
284static void
285exec_reverse_continue (char **argv, int argc)
286{
287 enum exec_direction_kind dir = execution_direction;
288 struct cleanup *old_chain;
289
e5829bee
MS
290 if (dir == EXEC_REVERSE)
291 error (_("Already in reverse mode."));
292
293 if (!target_can_execute_reverse)
294 error (_("Target %s does not support this command."), target_shortname);
295
a79b8f6e 296 old_chain = make_cleanup (exec_direction_forward, NULL);
e5829bee
MS
297 execution_direction = EXEC_REVERSE;
298 exec_continue (argv, argc);
299 do_cleanups (old_chain);
300}
301
302void
303mi_cmd_exec_continue (char *command, char **argv, int argc)
304{
a79b8f6e 305 if (argc > 0 && strcmp (argv[0], "--reverse") == 0)
e5829bee
MS
306 exec_reverse_continue (argv + 1, argc - 1);
307 else
308 exec_continue (argv, argc);
8dd4f202
VP
309}
310
311static int
312interrupt_thread_callback (struct thread_info *thread, void *arg)
313{
314 int pid = *(int *)arg;
315
316 if (!is_running (thread->ptid))
317 return 0;
318
319 if (PIDGET (thread->ptid) != pid)
320 return 0;
321
322 target_stop (thread->ptid);
323 return 0;
fb40c209
AC
324}
325
2b03b41d
SS
326/* Interrupt the execution of the target. Note how we must play
327 around with the token variables, in order to display the current
328 token in the result of the interrupt command, and the previous
329 execution token when the target finally stops. See comments in
41296c92 330 mi_cmd_execute. */
2b03b41d 331
ce8f13f8 332void
9e22b03a 333mi_cmd_exec_interrupt (char *command, char **argv, int argc)
fb40c209 334{
a79b8f6e
VP
335 /* In all-stop mode, everything stops, so we don't need to try
336 anything specific. */
337 if (!non_stop)
77ebaa5a 338 {
77ebaa5a 339 interrupt_target_1 (0);
a79b8f6e 340 return;
77ebaa5a 341 }
a79b8f6e
VP
342
343 if (current_context->all)
77ebaa5a 344 {
a79b8f6e 345 /* This will interrupt all threads in all inferiors. */
77ebaa5a
VP
346 interrupt_target_1 (1);
347 }
a79b8f6e 348 else if (current_context->thread_group != -1)
8dd4f202 349 {
a79b8f6e 350 struct inferior *inf = find_inferior_id (current_context->thread_group);
102040f0 351
a79b8f6e
VP
352 iterate_over_threads (interrupt_thread_callback, &inf->pid);
353 }
354 else
355 {
356 /* Interrupt just the current thread -- either explicitly
357 specified via --thread or whatever was current before
358 MI command was sent. */
359 interrupt_target_1 (0);
360 }
361}
362
363static int
364run_one_inferior (struct inferior *inf, void *arg)
365{
a79b8f6e
VP
366 if (inf->pid != 0)
367 {
368 if (inf->pid != ptid_get_pid (inferior_ptid))
369 {
370 struct thread_info *tp;
8dd4f202 371
a79b8f6e
VP
372 tp = any_thread_of_process (inf->pid);
373 if (!tp)
374 error (_("Inferior has no threads."));
375
376 switch_to_thread (tp->ptid);
377 }
8dd4f202 378 }
77ebaa5a 379 else
a79b8f6e
VP
380 {
381 set_current_inferior (inf);
382 switch_to_thread (null_ptid);
383 set_current_program_space (inf->pspace);
384 }
385 mi_execute_cli_command ("run", target_can_async_p (),
386 target_can_async_p () ? "&" : NULL);
387 return 0;
fb40c209
AC
388}
389
115d30f9
VP
390void
391mi_cmd_exec_run (char *command, char **argv, int argc)
392{
a79b8f6e
VP
393 if (current_context->all)
394 {
395 struct cleanup *back_to = save_current_space_and_thread ();
102040f0 396
a79b8f6e
VP
397 iterate_over_inferiors (run_one_inferior, NULL);
398 do_cleanups (back_to);
399 }
400 else
401 {
402 mi_execute_cli_command ("run", target_can_async_p (),
403 target_can_async_p () ? "&" : NULL);
404 }
115d30f9
VP
405}
406
a79b8f6e 407
6418d433
VP
408static int
409find_thread_of_process (struct thread_info *ti, void *p)
410{
411 int pid = *(int *)p;
102040f0 412
6418d433
VP
413 if (PIDGET (ti->ptid) == pid && !is_exited (ti->ptid))
414 return 1;
415
416 return 0;
417}
418
419void
420mi_cmd_target_detach (char *command, char **argv, int argc)
421{
422 if (argc != 0 && argc != 1)
9b20d036 423 error (_("Usage: -target-detach [pid | thread-group]"));
6418d433
VP
424
425 if (argc == 1)
426 {
427 struct thread_info *tp;
428 char *end = argv[0];
f1b9e6e7 429 int pid;
102040f0 430
f1b9e6e7
MK
431 /* First see if we are dealing with a thread-group id. */
432 if (*argv[0] == 'i')
433 {
434 struct inferior *inf;
435 int id = strtoul (argv[0] + 1, &end, 0);
436
437 if (*end != '\0')
438 error (_("Invalid syntax of thread-group id '%s'"), argv[0]);
439
440 inf = find_inferior_id (id);
441 if (!inf)
442 error (_("Non-existent thread-group id '%d'"), id);
443
444 pid = inf->pid;
445 }
446 else
447 {
448 /* We must be dealing with a pid. */
449 pid = strtol (argv[0], &end, 10);
450
451 if (*end != '\0')
452 error (_("Invalid identifier '%s'"), argv[0]);
453 }
6418d433
VP
454
455 /* Pick any thread in the desired process. Current
f1b9e6e7 456 target_detach detaches from the parent of inferior_ptid. */
6418d433
VP
457 tp = iterate_over_threads (find_thread_of_process, &pid);
458 if (!tp)
459 error (_("Thread group is empty"));
460
461 switch_to_thread (tp->ptid);
462 }
463
464 detach_command (NULL, 0);
465}
466
ce8f13f8 467void
fb40c209
AC
468mi_cmd_thread_select (char *command, char **argv, int argc)
469{
470 enum gdb_rc rc;
a13e061a 471 char *mi_error_message;
fb40c209
AC
472
473 if (argc != 1)
1b05df00 474 error (_("-thread-select: USAGE: threadnum."));
a13e061a 475
79a45e25 476 rc = gdb_thread_select (current_uiout, argv[0], &mi_error_message);
a13e061a
PA
477
478 if (rc == GDB_RC_FAIL)
fb40c209 479 {
a13e061a
PA
480 make_cleanup (xfree, mi_error_message);
481 error ("%s", mi_error_message);
fb40c209 482 }
fb40c209
AC
483}
484
ce8f13f8 485void
fb40c209
AC
486mi_cmd_thread_list_ids (char *command, char **argv, int argc)
487{
b0b13bb4 488 enum gdb_rc rc;
a13e061a 489 char *mi_error_message;
fb40c209
AC
490
491 if (argc != 0)
7ea6d463 492 error (_("-thread-list-ids: No arguments required."));
a13e061a 493
79a45e25 494 rc = gdb_list_thread_ids (current_uiout, &mi_error_message);
a13e061a
PA
495
496 if (rc == GDB_RC_FAIL)
fb40c209 497 {
a13e061a
PA
498 make_cleanup (xfree, mi_error_message);
499 error ("%s", mi_error_message);
fb40c209 500 }
fb40c209
AC
501}
502
ce8f13f8 503void
8e8901c5
VP
504mi_cmd_thread_info (char *command, char **argv, int argc)
505{
8e8901c5 506 if (argc != 0 && argc != 1)
7ea6d463 507 error (_("Invalid MI command"));
8e8901c5 508
79a45e25 509 print_thread_info (current_uiout, argv[0], -1);
3ee1c036
VP
510}
511
fa3064dd
YQ
512DEF_VEC_I(int);
513
dc146f7c
VP
514struct collect_cores_data
515{
516 int pid;
517
518 VEC (int) *cores;
519};
520
3ee1c036 521static int
dc146f7c 522collect_cores (struct thread_info *ti, void *xdata)
3ee1c036 523{
dc146f7c
VP
524 struct collect_cores_data *data = xdata;
525
526 if (ptid_get_pid (ti->ptid) == data->pid)
6c95b8df 527 {
dc146f7c 528 int core = target_core_of_thread (ti->ptid);
102040f0 529
dc146f7c
VP
530 if (core != -1)
531 VEC_safe_push (int, data->cores, core);
532 }
533
534 return 0;
535}
536
537static int *
538unique (int *b, int *e)
539{
540 int *d = b;
102040f0 541
dc146f7c
VP
542 while (++b != e)
543 if (*d != *b)
544 *++d = *b;
545 return ++d;
546}
547
548struct print_one_inferior_data
549{
550 int recurse;
551 VEC (int) *inferiors;
552};
553
554static int
555print_one_inferior (struct inferior *inferior, void *xdata)
556{
557 struct print_one_inferior_data *top_data = xdata;
79a45e25 558 struct ui_out *uiout = current_uiout;
dc146f7c
VP
559
560 if (VEC_empty (int, top_data->inferiors)
561 || bsearch (&(inferior->pid), VEC_address (int, top_data->inferiors),
562 VEC_length (int, top_data->inferiors), sizeof (int),
563 compare_positive_ints))
564 {
565 struct collect_cores_data data;
6c95b8df
PA
566 struct cleanup *back_to
567 = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
568
a79b8f6e 569 ui_out_field_fmt (uiout, "id", "i%d", inferior->num);
6c95b8df 570 ui_out_field_string (uiout, "type", "process");
a79b8f6e
VP
571 if (inferior->pid != 0)
572 ui_out_field_int (uiout, "pid", inferior->pid);
573
574 if (inferior->pspace->ebfd)
575 {
576 ui_out_field_string (uiout, "executable",
577 bfd_get_filename (inferior->pspace->ebfd));
578 }
6c95b8df 579
dc146f7c 580 data.cores = 0;
a79b8f6e
VP
581 if (inferior->pid != 0)
582 {
583 data.pid = inferior->pid;
584 iterate_over_threads (collect_cores, &data);
585 }
dc146f7c
VP
586
587 if (!VEC_empty (int, data.cores))
588 {
dc146f7c
VP
589 int *b, *e;
590 struct cleanup *back_to_2 =
591 make_cleanup_ui_out_list_begin_end (uiout, "cores");
592
593 qsort (VEC_address (int, data.cores),
594 VEC_length (int, data.cores), sizeof (int),
595 compare_positive_ints);
596
597 b = VEC_address (int, data.cores);
598 e = b + VEC_length (int, data.cores);
599 e = unique (b, e);
600
601 for (; b != e; ++b)
602 ui_out_field_int (uiout, NULL, *b);
603
604 do_cleanups (back_to_2);
605 }
606
607 if (top_data->recurse)
aea5b279 608 print_thread_info (uiout, NULL, inferior->pid);
dc146f7c 609
6c95b8df
PA
610 do_cleanups (back_to);
611 }
3ee1c036 612
3ee1c036
VP
613 return 0;
614}
615
2b03b41d
SS
616/* Output a field named 'cores' with a list as the value. The
617 elements of the list are obtained by splitting 'cores' on
618 comma. */
dc146f7c
VP
619
620static void
621output_cores (struct ui_out *uiout, const char *field_name, const char *xcores)
3ee1c036 622{
dc146f7c
VP
623 struct cleanup *back_to = make_cleanup_ui_out_list_begin_end (uiout,
624 field_name);
625 char *cores = xstrdup (xcores);
626 char *p = cores;
3ee1c036 627
dc146f7c 628 make_cleanup (xfree, cores);
3ee1c036 629
dc146f7c
VP
630 for (p = strtok (p, ","); p; p = strtok (NULL, ","))
631 ui_out_field_string (uiout, NULL, p);
3ee1c036 632
dc146f7c
VP
633 do_cleanups (back_to);
634}
3ee1c036 635
dc146f7c
VP
636static void
637free_vector_of_ints (void *xvector)
638{
639 VEC (int) **vector = xvector;
102040f0 640
dc146f7c
VP
641 VEC_free (int, *vector);
642}
643
644static void
645do_nothing (splay_tree_key k)
646{
647}
07e059b5 648
dc146f7c
VP
649static void
650free_vector_of_osdata_items (splay_tree_value xvalue)
651{
652 VEC (osdata_item_s) *value = (VEC (osdata_item_s) *) xvalue;
102040f0 653
dc146f7c
VP
654 /* We don't free the items itself, it will be done separately. */
655 VEC_free (osdata_item_s, value);
656}
e0665bc8 657
dc146f7c
VP
658static int
659splay_tree_int_comparator (splay_tree_key xa, splay_tree_key xb)
660{
661 int a = xa;
662 int b = xb;
102040f0 663
dc146f7c
VP
664 return a - b;
665}
666
667static void
668free_splay_tree (void *xt)
669{
670 splay_tree t = xt;
671 splay_tree_delete (t);
672}
673
674static void
675list_available_thread_groups (VEC (int) *ids, int recurse)
676{
677 struct osdata *data;
678 struct osdata_item *item;
679 int ix_items;
79a45e25 680 struct ui_out *uiout = current_uiout;
102040f0 681
dc146f7c 682 /* This keeps a map from integer (pid) to VEC (struct osdata_item *)*
8eee9c5a
DE
683 The vector contains information about all threads for the given pid.
684 This is assigned an initial value to avoid "may be used uninitialized"
685 warning from gcc. */
686 splay_tree tree = NULL;
dc146f7c
VP
687
688 /* get_osdata will throw if it cannot return data. */
689 data = get_osdata ("processes");
690 make_cleanup_osdata_free (data);
691
692 if (recurse)
693 {
694 struct osdata *threads = get_osdata ("threads");
dc146f7c 695
102040f0 696 make_cleanup_osdata_free (threads);
dc146f7c
VP
697 tree = splay_tree_new (splay_tree_int_comparator,
698 do_nothing,
699 free_vector_of_osdata_items);
700 make_cleanup (free_splay_tree, tree);
e0665bc8 701
07e059b5 702 for (ix_items = 0;
dc146f7c 703 VEC_iterate (osdata_item_s, threads->items,
e0665bc8 704 ix_items, item);
07e059b5
VP
705 ix_items++)
706 {
07e059b5 707 const char *pid = get_osdata_column (item, "pid");
dc146f7c
VP
708 int pid_i = strtoul (pid, NULL, 0);
709 VEC (osdata_item_s) *vec = 0;
710
711 splay_tree_node n = splay_tree_lookup (tree, pid_i);
712 if (!n)
713 {
714 VEC_safe_push (osdata_item_s, vec, item);
715 splay_tree_insert (tree, pid_i, (splay_tree_value)vec);
716 }
717 else
718 {
719 vec = (VEC (osdata_item_s) *) n->value;
720 VEC_safe_push (osdata_item_s, vec, item);
721 n->value = (splay_tree_value) vec;
722 }
723 }
724 }
725
726 make_cleanup_ui_out_list_begin_end (uiout, "groups");
07e059b5 727
dc146f7c
VP
728 for (ix_items = 0;
729 VEC_iterate (osdata_item_s, data->items,
730 ix_items, item);
731 ix_items++)
732 {
733 struct cleanup *back_to;
e0665bc8 734
dc146f7c
VP
735 const char *pid = get_osdata_column (item, "pid");
736 const char *cmd = get_osdata_column (item, "command");
737 const char *user = get_osdata_column (item, "user");
738 const char *cores = get_osdata_column (item, "cores");
739
740 int pid_i = strtoul (pid, NULL, 0);
741
742 /* At present, the target will return all available processes
743 and if information about specific ones was required, we filter
744 undesired processes here. */
745 if (ids && bsearch (&pid_i, VEC_address (int, ids),
746 VEC_length (int, ids),
747 sizeof (int), compare_positive_ints) == NULL)
748 continue;
749
750
751 back_to = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
752
753 ui_out_field_fmt (uiout, "id", "%s", pid);
754 ui_out_field_string (uiout, "type", "process");
755 if (cmd)
756 ui_out_field_string (uiout, "description", cmd);
757 if (user)
758 ui_out_field_string (uiout, "user", user);
759 if (cores)
760 output_cores (uiout, "cores", cores);
761
762 if (recurse)
763 {
764 splay_tree_node n = splay_tree_lookup (tree, pid_i);
765 if (n)
766 {
767 VEC (osdata_item_s) *children = (VEC (osdata_item_s) *) n->value;
768 struct osdata_item *child;
769 int ix_child;
770
771 make_cleanup_ui_out_list_begin_end (uiout, "threads");
772
773 for (ix_child = 0;
774 VEC_iterate (osdata_item_s, children, ix_child, child);
775 ++ix_child)
776 {
777 struct cleanup *back_to_2 =
778 make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
dc146f7c
VP
779 const char *tid = get_osdata_column (child, "tid");
780 const char *tcore = get_osdata_column (child, "core");
102040f0 781
dc146f7c
VP
782 ui_out_field_string (uiout, "id", tid);
783 if (tcore)
784 ui_out_field_string (uiout, "core", tcore);
785
786 do_cleanups (back_to_2);
787 }
788 }
07e059b5 789 }
dc146f7c
VP
790
791 do_cleanups (back_to);
07e059b5 792 }
dc146f7c
VP
793}
794
795void
796mi_cmd_list_thread_groups (char *command, char **argv, int argc)
797{
79a45e25 798 struct ui_out *uiout = current_uiout;
dc146f7c
VP
799 struct cleanup *back_to;
800 int available = 0;
801 int recurse = 0;
802 VEC (int) *ids = 0;
803
804 enum opt
dc146f7c 805 {
2b03b41d 806 AVAILABLE_OPT, RECURSE_OPT
dc146f7c 807 };
2b03b41d
SS
808 static const struct mi_opt opts[] =
809 {
810 {"-available", AVAILABLE_OPT, 0},
811 {"-recurse", RECURSE_OPT, 1},
812 { 0, 0, 0 }
813 };
dc146f7c 814
56934ab1
AS
815 int oind = 0;
816 char *oarg;
dc146f7c
VP
817
818 while (1)
819 {
820 int opt = mi_getopt ("-list-thread-groups", argc, argv, opts,
56934ab1 821 &oind, &oarg);
102040f0 822
dc146f7c
VP
823 if (opt < 0)
824 break;
825 switch ((enum opt) opt)
826 {
827 case AVAILABLE_OPT:
828 available = 1;
829 break;
830 case RECURSE_OPT:
56934ab1 831 if (strcmp (oarg, "0") == 0)
dc146f7c 832 ;
56934ab1 833 else if (strcmp (oarg, "1") == 0)
dc146f7c
VP
834 recurse = 1;
835 else
7ea6d463
PM
836 error (_("only '0' and '1' are valid values "
837 "for the '--recurse' option"));
dc146f7c
VP
838 break;
839 }
840 }
841
56934ab1 842 for (; oind < argc; ++oind)
dc146f7c
VP
843 {
844 char *end;
2f296114
VP
845 int inf;
846
56934ab1
AS
847 if (*(argv[oind]) != 'i')
848 error (_("invalid syntax of group id '%s'"), argv[oind]);
2f296114 849
56934ab1 850 inf = strtoul (argv[oind] + 1, &end, 0);
102040f0 851
dc146f7c 852 if (*end != '\0')
56934ab1 853 error (_("invalid syntax of group id '%s'"), argv[oind]);
dc146f7c
VP
854 VEC_safe_push (int, ids, inf);
855 }
856 if (VEC_length (int, ids) > 1)
857 qsort (VEC_address (int, ids),
858 VEC_length (int, ids),
859 sizeof (int), compare_positive_ints);
860
861 back_to = make_cleanup (free_vector_of_ints, &ids);
862
863 if (available)
864 {
865 list_available_thread_groups (ids, recurse);
866 }
867 else if (VEC_length (int, ids) == 1)
3ee1c036 868 {
2b03b41d 869 /* Local thread groups, single id. */
2f296114
VP
870 int id = *VEC_address (int, ids);
871 struct inferior *inf = find_inferior_id (id);
102040f0 872
2f296114 873 if (!inf)
7ea6d463 874 error (_("Non-existent thread group id '%d'"), id);
2f296114 875
aea5b279 876 print_thread_info (uiout, NULL, inf->pid);
3ee1c036
VP
877 }
878 else
879 {
dc146f7c 880 struct print_one_inferior_data data;
102040f0 881
dc146f7c
VP
882 data.recurse = recurse;
883 data.inferiors = ids;
884
885 /* Local thread groups. Either no explicit ids -- and we
886 print everything, or several explicit ids. In both cases,
887 we print more than one group, and have to use 'groups'
888 as the top-level element. */
3ee1c036 889 make_cleanup_ui_out_list_begin_end (uiout, "groups");
dc146f7c
VP
890 update_thread_list ();
891 iterate_over_inferiors (print_one_inferior, &data);
3ee1c036 892 }
dc146f7c 893
3ee1c036 894 do_cleanups (back_to);
8e8901c5
VP
895}
896
ce8f13f8 897void
fb40c209
AC
898mi_cmd_data_list_register_names (char *command, char **argv, int argc)
899{
7ccb0be9 900 struct gdbarch *gdbarch;
79a45e25 901 struct ui_out *uiout = current_uiout;
fb40c209
AC
902 int regnum, numregs;
903 int i;
4060713b 904 struct cleanup *cleanup;
fb40c209
AC
905
906 /* Note that the test for a valid register must include checking the
2b03b41d
SS
907 gdbarch_register_name because gdbarch_num_regs may be allocated
908 for the union of the register sets within a family of related
909 processors. In this case, some entries of gdbarch_register_name
910 will change depending upon the particular processor being
911 debugged. */
fb40c209 912
441b986a 913 gdbarch = get_current_arch ();
7ccb0be9 914 numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
fb40c209 915
4060713b 916 cleanup = make_cleanup_ui_out_list_begin_end (uiout, "register-names");
fb40c209 917
41296c92 918 if (argc == 0) /* No args, just do all the regs. */
fb40c209
AC
919 {
920 for (regnum = 0;
921 regnum < numregs;
922 regnum++)
923 {
7ccb0be9
UW
924 if (gdbarch_register_name (gdbarch, regnum) == NULL
925 || *(gdbarch_register_name (gdbarch, regnum)) == '\0')
173d6894
AC
926 ui_out_field_string (uiout, NULL, "");
927 else
c9f4d572 928 ui_out_field_string (uiout, NULL,
7ccb0be9 929 gdbarch_register_name (gdbarch, regnum));
fb40c209
AC
930 }
931 }
932
41296c92 933 /* Else, list of register #s, just do listed regs. */
fb40c209
AC
934 for (i = 0; i < argc; i++)
935 {
936 regnum = atoi (argv[i]);
173d6894 937 if (regnum < 0 || regnum >= numregs)
7ea6d463 938 error (_("bad register number"));
a13e061a 939
7ccb0be9
UW
940 if (gdbarch_register_name (gdbarch, regnum) == NULL
941 || *(gdbarch_register_name (gdbarch, regnum)) == '\0')
173d6894
AC
942 ui_out_field_string (uiout, NULL, "");
943 else
c9f4d572 944 ui_out_field_string (uiout, NULL,
7ccb0be9 945 gdbarch_register_name (gdbarch, regnum));
fb40c209 946 }
4060713b 947 do_cleanups (cleanup);
fb40c209
AC
948}
949
ce8f13f8 950void
fb40c209
AC
951mi_cmd_data_list_changed_registers (char *command, char **argv, int argc)
952{
6ed7ea50 953 static struct regcache *this_regs = NULL;
79a45e25 954 struct ui_out *uiout = current_uiout;
6ed7ea50 955 struct regcache *prev_regs;
7ccb0be9 956 struct gdbarch *gdbarch;
fb40c209
AC
957 int regnum, numregs, changed;
958 int i;
4060713b 959 struct cleanup *cleanup;
fb40c209 960
2b03b41d
SS
961 /* The last time we visited this function, the current frame's
962 register contents were saved in THIS_REGS. Move THIS_REGS over
963 to PREV_REGS, and refresh THIS_REGS with the now-current register
964 contents. */
6ed7ea50
UW
965
966 prev_regs = this_regs;
967 this_regs = frame_save_as_regcache (get_selected_frame (NULL));
968 cleanup = make_cleanup_regcache_xfree (prev_regs);
969
fb40c209 970 /* Note that the test for a valid register must include checking the
2b03b41d
SS
971 gdbarch_register_name because gdbarch_num_regs may be allocated
972 for the union of the register sets within a family of related
973 processors. In this case, some entries of gdbarch_register_name
974 will change depending upon the particular processor being
975 debugged. */
fb40c209 976
7ccb0be9
UW
977 gdbarch = get_regcache_arch (this_regs);
978 numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
fb40c209 979
6ed7ea50 980 make_cleanup_ui_out_list_begin_end (uiout, "changed-registers");
fb40c209 981
2b03b41d 982 if (argc == 0)
fb40c209 983 {
2b03b41d 984 /* No args, just do all the regs. */
fb40c209
AC
985 for (regnum = 0;
986 regnum < numregs;
987 regnum++)
988 {
7ccb0be9
UW
989 if (gdbarch_register_name (gdbarch, regnum) == NULL
990 || *(gdbarch_register_name (gdbarch, regnum)) == '\0')
fb40c209 991 continue;
6ed7ea50 992 changed = register_changed_p (regnum, prev_regs, this_regs);
fb40c209 993 if (changed < 0)
7ea6d463
PM
994 error (_("-data-list-changed-registers: "
995 "Unable to read register contents."));
fb40c209
AC
996 else if (changed)
997 ui_out_field_int (uiout, NULL, regnum);
998 }
999 }
1000
41296c92 1001 /* Else, list of register #s, just do listed regs. */
fb40c209
AC
1002 for (i = 0; i < argc; i++)
1003 {
1004 regnum = atoi (argv[i]);
1005
1006 if (regnum >= 0
1007 && regnum < numregs
7ccb0be9
UW
1008 && gdbarch_register_name (gdbarch, regnum) != NULL
1009 && *gdbarch_register_name (gdbarch, regnum) != '\000')
fb40c209 1010 {
6ed7ea50 1011 changed = register_changed_p (regnum, prev_regs, this_regs);
fb40c209 1012 if (changed < 0)
7ea6d463
PM
1013 error (_("-data-list-changed-registers: "
1014 "Unable to read register contents."));
fb40c209
AC
1015 else if (changed)
1016 ui_out_field_int (uiout, NULL, regnum);
1017 }
1018 else
7ea6d463 1019 error (_("bad register number"));
fb40c209 1020 }
4060713b 1021 do_cleanups (cleanup);
fb40c209
AC
1022}
1023
1024static int
6ed7ea50
UW
1025register_changed_p (int regnum, struct regcache *prev_regs,
1026 struct regcache *this_regs)
fb40c209 1027{
6ed7ea50
UW
1028 struct gdbarch *gdbarch = get_regcache_arch (this_regs);
1029 gdb_byte prev_buffer[MAX_REGISTER_SIZE];
1030 gdb_byte this_buffer[MAX_REGISTER_SIZE];
e69aa73e
PA
1031 enum register_status prev_status;
1032 enum register_status this_status;
fb40c209 1033
e69aa73e
PA
1034 /* First time through or after gdbarch change consider all registers
1035 as changed. */
1036 if (!prev_regs || get_regcache_arch (prev_regs) != gdbarch)
6ed7ea50 1037 return 1;
fb40c209 1038
6ed7ea50 1039 /* Get register contents and compare. */
e69aa73e
PA
1040 prev_status = regcache_cooked_read (prev_regs, regnum, prev_buffer);
1041 this_status = regcache_cooked_read (this_regs, regnum, this_buffer);
fb40c209 1042
e69aa73e
PA
1043 if (this_status != prev_status)
1044 return 1;
1045 else if (this_status == REG_VALID)
1046 return memcmp (prev_buffer, this_buffer,
1047 register_size (gdbarch, regnum)) != 0;
1048 else
1049 return 0;
fb40c209
AC
1050}
1051
41296c92 1052/* Return a list of register number and value pairs. The valid
fb40c209 1053 arguments expected are: a letter indicating the format in which to
2b03b41d
SS
1054 display the registers contents. This can be one of: x
1055 (hexadecimal), d (decimal), N (natural), t (binary), o (octal), r
1056 (raw). After the format argument there can be a sequence of
1057 numbers, indicating which registers to fetch the content of. If
1058 the format is the only argument, a list of all the registers with
1059 their values is returned. */
1060
ce8f13f8 1061void
fb40c209
AC
1062mi_cmd_data_list_register_values (char *command, char **argv, int argc)
1063{
79a45e25 1064 struct ui_out *uiout = current_uiout;
7ccb0be9
UW
1065 struct frame_info *frame;
1066 struct gdbarch *gdbarch;
a13e061a 1067 int regnum, numregs, format;
fb40c209 1068 int i;
4060713b 1069 struct cleanup *list_cleanup, *tuple_cleanup;
fb40c209
AC
1070
1071 /* Note that the test for a valid register must include checking the
2b03b41d
SS
1072 gdbarch_register_name because gdbarch_num_regs may be allocated
1073 for the union of the register sets within a family of related
1074 processors. In this case, some entries of gdbarch_register_name
1075 will change depending upon the particular processor being
1076 debugged. */
fb40c209 1077
fb40c209 1078 if (argc == 0)
7ea6d463
PM
1079 error (_("-data-list-register-values: Usage: "
1080 "-data-list-register-values <format> [<regnum1>...<regnumN>]"));
fb40c209
AC
1081
1082 format = (int) argv[0][0];
1083
7ccb0be9
UW
1084 frame = get_selected_frame (NULL);
1085 gdbarch = get_frame_arch (frame);
1086 numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
1087
4060713b 1088 list_cleanup = make_cleanup_ui_out_list_begin_end (uiout, "register-values");
fb40c209 1089
2b03b41d 1090 if (argc == 1)
fb40c209 1091 {
2b03b41d 1092 /* No args, beside the format: do all the regs. */
fb40c209
AC
1093 for (regnum = 0;
1094 regnum < numregs;
1095 regnum++)
1096 {
7ccb0be9
UW
1097 if (gdbarch_register_name (gdbarch, regnum) == NULL
1098 || *(gdbarch_register_name (gdbarch, regnum)) == '\0')
fb40c209 1099 continue;
4060713b 1100 tuple_cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
fb40c209 1101 ui_out_field_int (uiout, "number", regnum);
7ccb0be9 1102 get_register (frame, regnum, format);
4060713b 1103 do_cleanups (tuple_cleanup);
fb40c209
AC
1104 }
1105 }
1106
41296c92 1107 /* Else, list of register #s, just do listed regs. */
fb40c209
AC
1108 for (i = 1; i < argc; i++)
1109 {
1110 regnum = atoi (argv[i]);
1111
1112 if (regnum >= 0
1113 && regnum < numregs
7ccb0be9
UW
1114 && gdbarch_register_name (gdbarch, regnum) != NULL
1115 && *gdbarch_register_name (gdbarch, regnum) != '\000')
fb40c209 1116 {
4060713b 1117 tuple_cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
fb40c209 1118 ui_out_field_int (uiout, "number", regnum);
7ccb0be9 1119 get_register (frame, regnum, format);
4060713b 1120 do_cleanups (tuple_cleanup);
fb40c209
AC
1121 }
1122 else
7ea6d463 1123 error (_("bad register number"));
fb40c209 1124 }
4060713b 1125 do_cleanups (list_cleanup);
fb40c209
AC
1126}
1127
41296c92 1128/* Output one register's contents in the desired format. */
2b03b41d 1129
a13e061a 1130static void
7ccb0be9 1131get_register (struct frame_info *frame, int regnum, int format)
fb40c209 1132{
7ccb0be9 1133 struct gdbarch *gdbarch = get_frame_arch (frame);
79a45e25 1134 struct ui_out *uiout = current_uiout;
20622269 1135 struct value *val;
fb40c209 1136
fb40c209
AC
1137 if (format == 'N')
1138 format = 0;
1139
20622269 1140 val = get_frame_register_value (frame, regnum);
ac2adee5 1141
20622269 1142 if (value_optimized_out (val))
7ea6d463 1143 error (_("Optimized out"));
fb40c209 1144
fb40c209
AC
1145 if (format == 'r')
1146 {
1147 int j;
1148 char *ptr, buf[1024];
20622269 1149 const gdb_byte *valaddr = value_contents_for_printing (val);
fb40c209
AC
1150
1151 strcpy (buf, "0x");
1152 ptr = buf + 2;
7ccb0be9 1153 for (j = 0; j < register_size (gdbarch, regnum); j++)
fb40c209 1154 {
7ccb0be9
UW
1155 int idx = gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG ?
1156 j : register_size (gdbarch, regnum) - 1 - j;
102040f0 1157
20622269 1158 sprintf (ptr, "%02x", (unsigned char) valaddr[idx]);
fb40c209
AC
1159 ptr += 2;
1160 }
1161 ui_out_field_string (uiout, "value", buf);
fb40c209
AC
1162 }
1163 else
1164 {
79a45b7d 1165 struct value_print_options opts;
f99d8bf4
PA
1166 struct ui_file *stb;
1167 struct cleanup *old_chain;
1168
1169 stb = mem_fileopen ();
1170 old_chain = make_cleanup_ui_file_delete (stb);
102040f0 1171
59669435 1172 get_formatted_print_options (&opts, format);
79a45b7d 1173 opts.deref_ref = 1;
20622269
PA
1174 val_print (value_type (val),
1175 value_contents_for_printing (val),
1176 value_embedded_offset (val), 0,
f99d8bf4 1177 stb, 0, val, &opts, current_language);
fb40c209 1178 ui_out_field_stream (uiout, "value", stb);
f99d8bf4 1179 do_cleanups (old_chain);
fb40c209 1180 }
fb40c209
AC
1181}
1182
24e8cecf 1183/* Write given values into registers. The registers and values are
41296c92 1184 given as pairs. The corresponding MI command is
9a2b4c1b
MS
1185 -data-write-register-values <format>
1186 [<regnum1> <value1>...<regnumN> <valueN>] */
ce8f13f8 1187void
24e8cecf
EZ
1188mi_cmd_data_write_register_values (char *command, char **argv, int argc)
1189{
7ccb0be9
UW
1190 struct regcache *regcache;
1191 struct gdbarch *gdbarch;
9f3a1602 1192 int numregs, i;
24e8cecf
EZ
1193
1194 /* Note that the test for a valid register must include checking the
2b03b41d
SS
1195 gdbarch_register_name because gdbarch_num_regs may be allocated
1196 for the union of the register sets within a family of related
1197 processors. In this case, some entries of gdbarch_register_name
1198 will change depending upon the particular processor being
1199 debugged. */
24e8cecf 1200
7ccb0be9
UW
1201 regcache = get_current_regcache ();
1202 gdbarch = get_regcache_arch (regcache);
1203 numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
24e8cecf
EZ
1204
1205 if (argc == 0)
7ea6d463
PM
1206 error (_("-data-write-register-values: Usage: -data-write-register-"
1207 "values <format> [<regnum1> <value1>...<regnumN> <valueN>]"));
24e8cecf 1208
24e8cecf 1209 if (!target_has_registers)
7ea6d463 1210 error (_("-data-write-register-values: No registers."));
24e8cecf
EZ
1211
1212 if (!(argc - 1))
7ea6d463 1213 error (_("-data-write-register-values: No regs and values specified."));
24e8cecf
EZ
1214
1215 if ((argc - 1) % 2)
7ea6d463
PM
1216 error (_("-data-write-register-values: "
1217 "Regs and vals are not in pairs."));
24e8cecf
EZ
1218
1219 for (i = 1; i < argc; i = i + 2)
1220 {
9f3a1602 1221 int regnum = atoi (argv[i]);
24e8cecf 1222
9f3a1602 1223 if (regnum >= 0 && regnum < numregs
7ccb0be9
UW
1224 && gdbarch_register_name (gdbarch, regnum)
1225 && *gdbarch_register_name (gdbarch, regnum))
24e8cecf 1226 {
9f3a1602 1227 LONGEST value;
d8bf3afa 1228
9f3a1602 1229 /* Get the value as a number. */
24e8cecf 1230 value = parse_and_eval_address (argv[i + 1]);
9f3a1602 1231
41296c92 1232 /* Write it down. */
7ccb0be9 1233 regcache_cooked_write_signed (regcache, regnum, value);
24e8cecf
EZ
1234 }
1235 else
7ea6d463 1236 error (_("bad register number"));
24e8cecf 1237 }
24e8cecf
EZ
1238}
1239
41296c92 1240/* Evaluate the value of the argument. The argument is an
fb40c209 1241 expression. If the expression contains spaces it needs to be
41296c92 1242 included in double quotes. */
2b03b41d 1243
ce8f13f8 1244void
fb40c209
AC
1245mi_cmd_data_evaluate_expression (char *command, char **argv, int argc)
1246{
1247 struct expression *expr;
f99d8bf4 1248 struct cleanup *old_chain;
96052a95 1249 struct value *val;
f99d8bf4 1250 struct ui_file *stb;
79a45b7d 1251 struct value_print_options opts;
79a45e25 1252 struct ui_out *uiout = current_uiout;
fb40c209 1253
f99d8bf4
PA
1254 stb = mem_fileopen ();
1255 old_chain = make_cleanup_ui_file_delete (stb);
fb40c209
AC
1256
1257 if (argc != 1)
f99d8bf4
PA
1258 error (_("-data-evaluate-expression: "
1259 "Usage: -data-evaluate-expression expression"));
fb40c209
AC
1260
1261 expr = parse_expression (argv[0]);
1262
f99d8bf4 1263 make_cleanup (free_current_contents, &expr);
fb40c209
AC
1264
1265 val = evaluate_expression (expr);
1266
41296c92 1267 /* Print the result of the expression evaluation. */
79a45b7d
TT
1268 get_user_print_options (&opts);
1269 opts.deref_ref = 0;
f99d8bf4 1270 common_val_print (val, stb, 0, &opts, current_language);
fb40c209
AC
1271
1272 ui_out_field_stream (uiout, "value", stb);
fb40c209
AC
1273
1274 do_cleanups (old_chain);
fb40c209
AC
1275}
1276
2b03b41d 1277/* This is the -data-read-memory command.
fb40c209
AC
1278
1279 ADDR: start address of data to be dumped.
41296c92 1280 WORD-FORMAT: a char indicating format for the ``word''. See
fb40c209 1281 the ``x'' command.
41296c92 1282 WORD-SIZE: size of each ``word''; 1,2,4, or 8 bytes.
fb40c209
AC
1283 NR_ROW: Number of rows.
1284 NR_COL: The number of colums (words per row).
1285 ASCHAR: (OPTIONAL) Append an ascii character dump to each row. Use
1286 ASCHAR for unprintable characters.
1287
1288 Reads SIZE*NR_ROW*NR_COL bytes starting at ADDR from memory and
1289 displayes them. Returns:
1290
1291 {addr="...",rowN={wordN="..." ,... [,ascii="..."]}, ...}
1292
1293 Returns:
2b03b41d 1294 The number of bytes read is SIZE*ROW*COL. */
fb40c209 1295
ce8f13f8 1296void
fb40c209
AC
1297mi_cmd_data_read_memory (char *command, char **argv, int argc)
1298{
e17c207e 1299 struct gdbarch *gdbarch = get_current_arch ();
79a45e25 1300 struct ui_out *uiout = current_uiout;
fb40c209
AC
1301 struct cleanup *cleanups = make_cleanup (null_cleanup, NULL);
1302 CORE_ADDR addr;
2b03b41d 1303 long total_bytes, nr_cols, nr_rows;
fb40c209
AC
1304 char word_format;
1305 struct type *word_type;
1306 long word_size;
1307 char word_asize;
1308 char aschar;
508416a1 1309 gdb_byte *mbuf;
fb40c209
AC
1310 int nr_bytes;
1311 long offset = 0;
56934ab1
AS
1312 int oind = 0;
1313 char *oarg;
fb40c209 1314 enum opt
fb40c209 1315 {
2b03b41d 1316 OFFSET_OPT
fb40c209 1317 };
2b03b41d
SS
1318 static const struct mi_opt opts[] =
1319 {
1320 {"o", OFFSET_OPT, 1},
1321 { 0, 0, 0 }
1322 };
fb40c209
AC
1323
1324 while (1)
1325 {
1b05df00 1326 int opt = mi_getopt ("-data-read-memory", argc, argv, opts,
56934ab1 1327 &oind, &oarg);
102040f0 1328
fb40c209
AC
1329 if (opt < 0)
1330 break;
1331 switch ((enum opt) opt)
1332 {
1333 case OFFSET_OPT:
56934ab1 1334 offset = atol (oarg);
fb40c209
AC
1335 break;
1336 }
1337 }
56934ab1
AS
1338 argv += oind;
1339 argc -= oind;
fb40c209
AC
1340
1341 if (argc < 5 || argc > 6)
7ea6d463
PM
1342 error (_("-data-read-memory: Usage: "
1343 "ADDR WORD-FORMAT WORD-SIZE NR-ROWS NR-COLS [ASCHAR]."));
fb40c209
AC
1344
1345 /* Extract all the arguments. */
1346
41296c92 1347 /* Start address of the memory dump. */
fb40c209 1348 addr = parse_and_eval_address (argv[0]) + offset;
41296c92 1349 /* The format character to use when displaying a memory word. See
2b03b41d 1350 the ``x'' command. */
fb40c209 1351 word_format = argv[1][0];
41296c92 1352 /* The size of the memory word. */
fb40c209
AC
1353 word_size = atol (argv[2]);
1354 switch (word_size)
1355 {
1356 case 1:
df4df182 1357 word_type = builtin_type (gdbarch)->builtin_int8;
fb40c209
AC
1358 word_asize = 'b';
1359 break;
1360 case 2:
df4df182 1361 word_type = builtin_type (gdbarch)->builtin_int16;
fb40c209
AC
1362 word_asize = 'h';
1363 break;
1364 case 4:
df4df182 1365 word_type = builtin_type (gdbarch)->builtin_int32;
fb40c209
AC
1366 word_asize = 'w';
1367 break;
1368 case 8:
df4df182 1369 word_type = builtin_type (gdbarch)->builtin_int64;
fb40c209
AC
1370 word_asize = 'g';
1371 break;
1372 default:
df4df182 1373 word_type = builtin_type (gdbarch)->builtin_int8;
fb40c209
AC
1374 word_asize = 'b';
1375 }
41296c92 1376 /* The number of rows. */
fb40c209
AC
1377 nr_rows = atol (argv[3]);
1378 if (nr_rows <= 0)
7ea6d463 1379 error (_("-data-read-memory: invalid number of rows."));
a13e061a 1380
41296c92 1381 /* Number of bytes per row. */
fb40c209
AC
1382 nr_cols = atol (argv[4]);
1383 if (nr_cols <= 0)
7ea6d463 1384 error (_("-data-read-memory: invalid number of columns."));
a13e061a 1385
41296c92 1386 /* The un-printable character when printing ascii. */
fb40c209
AC
1387 if (argc == 6)
1388 aschar = *argv[5];
1389 else
1390 aschar = 0;
1391
41296c92 1392 /* Create a buffer and read it in. */
fb40c209 1393 total_bytes = word_size * nr_rows * nr_cols;
2e94c453 1394 mbuf = xcalloc (total_bytes, 1);
b8c9b27d 1395 make_cleanup (xfree, mbuf);
cf7a04e8 1396
a4261689
PA
1397 /* Dispatch memory reads to the topmost target, not the flattened
1398 current_target. */
8dedea02
VP
1399 nr_bytes = target_read (current_target.beneath,
1400 TARGET_OBJECT_MEMORY, NULL, mbuf,
1401 addr, total_bytes);
cf7a04e8 1402 if (nr_bytes <= 0)
7ea6d463 1403 error (_("Unable to read memory."));
fb40c209 1404
41296c92 1405 /* Output the header information. */
5af949e3 1406 ui_out_field_core_addr (uiout, "addr", gdbarch, addr);
fb40c209
AC
1407 ui_out_field_int (uiout, "nr-bytes", nr_bytes);
1408 ui_out_field_int (uiout, "total-bytes", total_bytes);
5af949e3
UW
1409 ui_out_field_core_addr (uiout, "next-row",
1410 gdbarch, addr + word_size * nr_cols);
1411 ui_out_field_core_addr (uiout, "prev-row",
1412 gdbarch, addr - word_size * nr_cols);
1413 ui_out_field_core_addr (uiout, "next-page", gdbarch, addr + total_bytes);
1414 ui_out_field_core_addr (uiout, "prev-page", gdbarch, addr - total_bytes);
fb40c209 1415
41296c92 1416 /* Build the result as a two dimentional table. */
fb40c209 1417 {
f99d8bf4
PA
1418 struct ui_file *stream;
1419 struct cleanup *cleanup_stream;
fb40c209
AC
1420 int row;
1421 int row_byte;
102040f0 1422
f99d8bf4
PA
1423 stream = mem_fileopen ();
1424 cleanup_stream = make_cleanup_ui_file_delete (stream);
1425
1426 make_cleanup_ui_out_list_begin_end (uiout, "memory");
fb40c209
AC
1427 for (row = 0, row_byte = 0;
1428 row < nr_rows;
1429 row++, row_byte += nr_cols * word_size)
1430 {
1431 int col;
1432 int col_byte;
6ad4a2cf
JJ
1433 struct cleanup *cleanup_tuple;
1434 struct cleanup *cleanup_list_data;
79a45b7d
TT
1435 struct value_print_options opts;
1436
6ad4a2cf 1437 cleanup_tuple = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
5af949e3 1438 ui_out_field_core_addr (uiout, "addr", gdbarch, addr + row_byte);
9a2b4c1b
MS
1439 /* ui_out_field_core_addr_symbolic (uiout, "saddr", addr +
1440 row_byte); */
6ad4a2cf 1441 cleanup_list_data = make_cleanup_ui_out_list_begin_end (uiout, "data");
79a45b7d 1442 get_formatted_print_options (&opts, word_format);
fb40c209
AC
1443 for (col = 0, col_byte = row_byte;
1444 col < nr_cols;
1445 col++, col_byte += word_size)
1446 {
1447 if (col_byte + word_size > nr_bytes)
1448 {
1449 ui_out_field_string (uiout, NULL, "N/A");
1450 }
1451 else
1452 {
f99d8bf4 1453 ui_file_rewind (stream);
79a45b7d 1454 print_scalar_formatted (mbuf + col_byte, word_type, &opts,
f99d8bf4 1455 word_asize, stream);
fb40c209
AC
1456 ui_out_field_stream (uiout, NULL, stream);
1457 }
1458 }
6ad4a2cf 1459 do_cleanups (cleanup_list_data);
fb40c209
AC
1460 if (aschar)
1461 {
1462 int byte;
102040f0 1463
f99d8bf4 1464 ui_file_rewind (stream);
9a2b4c1b
MS
1465 for (byte = row_byte;
1466 byte < row_byte + word_size * nr_cols; byte++)
fb40c209
AC
1467 {
1468 if (byte >= nr_bytes)
f99d8bf4 1469 fputc_unfiltered ('X', stream);
fb40c209 1470 else if (mbuf[byte] < 32 || mbuf[byte] > 126)
f99d8bf4 1471 fputc_unfiltered (aschar, stream);
fb40c209 1472 else
f99d8bf4 1473 fputc_unfiltered (mbuf[byte], stream);
fb40c209
AC
1474 }
1475 ui_out_field_stream (uiout, "ascii", stream);
1476 }
6ad4a2cf 1477 do_cleanups (cleanup_tuple);
fb40c209 1478 }
f99d8bf4 1479 do_cleanups (cleanup_stream);
fb40c209
AC
1480 }
1481 do_cleanups (cleanups);
fb40c209
AC
1482}
1483
8dedea02
VP
1484void
1485mi_cmd_data_read_memory_bytes (char *command, char **argv, int argc)
1486{
1487 struct gdbarch *gdbarch = get_current_arch ();
79a45e25 1488 struct ui_out *uiout = current_uiout;
8dedea02
VP
1489 struct cleanup *cleanups;
1490 CORE_ADDR addr;
1491 LONGEST length;
1492 memory_read_result_s *read_result;
1493 int ix;
1494 VEC(memory_read_result_s) *result;
1495 long offset = 0;
56934ab1
AS
1496 int oind = 0;
1497 char *oarg;
8dedea02 1498 enum opt
8dedea02 1499 {
2b03b41d 1500 OFFSET_OPT
8dedea02 1501 };
2b03b41d
SS
1502 static const struct mi_opt opts[] =
1503 {
1504 {"o", OFFSET_OPT, 1},
1505 { 0, 0, 0 }
1506 };
8dedea02
VP
1507
1508 while (1)
1509 {
1b05df00 1510 int opt = mi_getopt ("-data-read-memory-bytes", argc, argv, opts,
56934ab1 1511 &oind, &oarg);
8dedea02
VP
1512 if (opt < 0)
1513 break;
1514 switch ((enum opt) opt)
1515 {
1516 case OFFSET_OPT:
56934ab1 1517 offset = atol (oarg);
8dedea02
VP
1518 break;
1519 }
1520 }
56934ab1
AS
1521 argv += oind;
1522 argc -= oind;
8dedea02
VP
1523
1524 if (argc != 2)
7ea6d463 1525 error (_("Usage: [ -o OFFSET ] ADDR LENGTH."));
8dedea02
VP
1526
1527 addr = parse_and_eval_address (argv[0]) + offset;
1528 length = atol (argv[1]);
1529
1530 result = read_memory_robust (current_target.beneath, addr, length);
1531
1532 cleanups = make_cleanup (free_memory_read_result_vector, result);
1533
1534 if (VEC_length (memory_read_result_s, result) == 0)
7ea6d463 1535 error (_("Unable to read memory."));
8dedea02
VP
1536
1537 make_cleanup_ui_out_list_begin_end (uiout, "memory");
1538 for (ix = 0;
1539 VEC_iterate (memory_read_result_s, result, ix, read_result);
1540 ++ix)
1541 {
1542 struct cleanup *t = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
1543 char *data, *p;
1544 int i;
1545
1546 ui_out_field_core_addr (uiout, "begin", gdbarch, read_result->begin);
1547 ui_out_field_core_addr (uiout, "offset", gdbarch, read_result->begin
1548 - addr);
1549 ui_out_field_core_addr (uiout, "end", gdbarch, read_result->end);
1550
1551 data = xmalloc ((read_result->end - read_result->begin) * 2 + 1);
1552
1553 for (i = 0, p = data;
1554 i < (read_result->end - read_result->begin);
1555 ++i, p += 2)
1556 {
1557 sprintf (p, "%02x", read_result->data[i]);
1558 }
1559 ui_out_field_string (uiout, "contents", data);
1560 xfree (data);
1561 do_cleanups (t);
1562 }
1563 do_cleanups (cleanups);
1564}
1565
2b03b41d 1566/* Implementation of the -data-write_memory command.
fb40c209 1567
177b42fe 1568 COLUMN_OFFSET: optional argument. Must be preceded by '-o'. The
fb40c209
AC
1569 offset from the beginning of the memory grid row where the cell to
1570 be written is.
1571 ADDR: start address of the row in the memory grid where the memory
41296c92 1572 cell is, if OFFSET_COLUMN is specified. Otherwise, the address of
fb40c209 1573 the location to write to.
41296c92 1574 FORMAT: a char indicating format for the ``word''. See
fb40c209
AC
1575 the ``x'' command.
1576 WORD_SIZE: size of each ``word''; 1,2,4, or 8 bytes
1577 VALUE: value to be written into the memory address.
1578
1579 Writes VALUE into ADDR + (COLUMN_OFFSET * WORD_SIZE).
1580
41296c92 1581 Prints nothing. */
2b03b41d 1582
ce8f13f8 1583void
fb40c209
AC
1584mi_cmd_data_write_memory (char *command, char **argv, int argc)
1585{
e17a4113
UW
1586 struct gdbarch *gdbarch = get_current_arch ();
1587 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
fb40c209 1588 CORE_ADDR addr;
fb40c209
AC
1589 long word_size;
1590 /* FIXME: ezannoni 2000-02-17 LONGEST could possibly not be big
41296c92 1591 enough when using a compiler other than GCC. */
fb40c209 1592 LONGEST value;
d8bf3afa
KB
1593 void *buffer;
1594 struct cleanup *old_chain;
fb40c209 1595 long offset = 0;
56934ab1
AS
1596 int oind = 0;
1597 char *oarg;
fb40c209 1598 enum opt
fb40c209 1599 {
2b03b41d 1600 OFFSET_OPT
fb40c209 1601 };
2b03b41d
SS
1602 static const struct mi_opt opts[] =
1603 {
1604 {"o", OFFSET_OPT, 1},
1605 { 0, 0, 0 }
1606 };
fb40c209
AC
1607
1608 while (1)
1609 {
1b05df00 1610 int opt = mi_getopt ("-data-write-memory", argc, argv, opts,
56934ab1 1611 &oind, &oarg);
102040f0 1612
fb40c209
AC
1613 if (opt < 0)
1614 break;
1615 switch ((enum opt) opt)
1616 {
1617 case OFFSET_OPT:
56934ab1 1618 offset = atol (oarg);
fb40c209
AC
1619 break;
1620 }
1621 }
56934ab1
AS
1622 argv += oind;
1623 argc -= oind;
fb40c209
AC
1624
1625 if (argc != 4)
7ea6d463
PM
1626 error (_("-data-write-memory: Usage: "
1627 "[-o COLUMN_OFFSET] ADDR FORMAT WORD-SIZE VALUE."));
fb40c209 1628
41296c92
NR
1629 /* Extract all the arguments. */
1630 /* Start address of the memory dump. */
fb40c209 1631 addr = parse_and_eval_address (argv[0]);
2b03b41d 1632 /* The size of the memory word. */
fb40c209
AC
1633 word_size = atol (argv[2]);
1634
41296c92 1635 /* Calculate the real address of the write destination. */
fb40c209
AC
1636 addr += (offset * word_size);
1637
41296c92 1638 /* Get the value as a number. */
fb40c209 1639 value = parse_and_eval_address (argv[3]);
41296c92 1640 /* Get the value into an array. */
d8bf3afa
KB
1641 buffer = xmalloc (word_size);
1642 old_chain = make_cleanup (xfree, buffer);
e17a4113 1643 store_signed_integer (buffer, word_size, byte_order, value);
41296c92 1644 /* Write it down to memory. */
4c2786ba 1645 write_memory_with_notification (addr, buffer, word_size);
d8bf3afa
KB
1646 /* Free the buffer. */
1647 do_cleanups (old_chain);
fb40c209
AC
1648}
1649
2b03b41d 1650/* Implementation of the -data-write-memory-bytes command.
8dedea02
VP
1651
1652 ADDR: start address
62747a60
TT
1653 DATA: string of bytes to write at that address
1654 COUNT: number of bytes to be filled (decimal integer). */
2b03b41d 1655
8dedea02
VP
1656void
1657mi_cmd_data_write_memory_bytes (char *command, char **argv, int argc)
1658{
1659 CORE_ADDR addr;
1660 char *cdata;
1661 gdb_byte *data;
62747a60 1662 gdb_byte *databuf;
5799c0b9 1663 size_t len, i, steps, remainder;
62747a60 1664 long int count, j;
8dedea02
VP
1665 struct cleanup *back_to;
1666
62747a60
TT
1667 if (argc != 2 && argc != 3)
1668 error (_("Usage: ADDR DATA [COUNT]."));
8dedea02
VP
1669
1670 addr = parse_and_eval_address (argv[0]);
1671 cdata = argv[1];
1ae0c35e
YQ
1672 if (strlen (cdata) % 2)
1673 error (_("Hex-encoded '%s' must have an even number of characters."),
1674 cdata);
1675
8dedea02 1676 len = strlen (cdata)/2;
62747a60
TT
1677 if (argc == 3)
1678 count = strtoul (argv[2], NULL, 10);
1679 else
1680 count = len;
8dedea02 1681
62747a60
TT
1682 databuf = xmalloc (len * sizeof (gdb_byte));
1683 back_to = make_cleanup (xfree, databuf);
8dedea02
VP
1684
1685 for (i = 0; i < len; ++i)
1686 {
1687 int x;
62747a60
TT
1688 if (sscanf (cdata + i * 2, "%02x", &x) != 1)
1689 error (_("Invalid argument"));
1690 databuf[i] = (gdb_byte) x;
1691 }
1692
1693 if (len < count)
1694 {
1695 /* Pattern is made of less bytes than count:
1696 repeat pattern to fill memory. */
1697 data = xmalloc (count);
1698 make_cleanup (xfree, data);
1699
1700 steps = count / len;
1701 remainder = count % len;
1702 for (j = 0; j < steps; j++)
1703 memcpy (data + j * len, databuf, len);
1704
1705 if (remainder > 0)
1706 memcpy (data + steps * len, databuf, remainder);
1707 }
1708 else
1709 {
1710 /* Pattern is longer than or equal to count:
1711 just copy len bytes. */
1712 data = databuf;
8dedea02
VP
1713 }
1714
62747a60 1715 write_memory_with_notification (addr, data, count);
8dedea02
VP
1716
1717 do_cleanups (back_to);
1718}
1719
ce8f13f8 1720void
d8c83789
NR
1721mi_cmd_enable_timings (char *command, char **argv, int argc)
1722{
1723 if (argc == 0)
1724 do_timings = 1;
1725 else if (argc == 1)
1726 {
1727 if (strcmp (argv[0], "yes") == 0)
1728 do_timings = 1;
1729 else if (strcmp (argv[0], "no") == 0)
1730 do_timings = 0;
1731 else
1732 goto usage_error;
1733 }
1734 else
1735 goto usage_error;
1736
ce8f13f8 1737 return;
d8c83789
NR
1738
1739 usage_error:
7ea6d463 1740 error (_("-enable-timings: Usage: %s {yes|no}"), command);
d8c83789
NR
1741}
1742
ce8f13f8 1743void
084344da
VP
1744mi_cmd_list_features (char *command, char **argv, int argc)
1745{
1746 if (argc == 0)
1747 {
1748 struct cleanup *cleanup = NULL;
79a45e25 1749 struct ui_out *uiout = current_uiout;
084344da 1750
102040f0 1751 cleanup = make_cleanup_ui_out_list_begin_end (uiout, "features");
084344da 1752 ui_out_field_string (uiout, NULL, "frozen-varobjs");
8b4ed427 1753 ui_out_field_string (uiout, NULL, "pending-breakpoints");
8e8901c5 1754 ui_out_field_string (uiout, NULL, "thread-info");
8dedea02 1755 ui_out_field_string (uiout, NULL, "data-read-memory-bytes");
39c4d40a 1756 ui_out_field_string (uiout, NULL, "breakpoint-notifications");
75082e8c 1757 ui_out_field_string (uiout, NULL, "ada-task-info");
084344da 1758
b6313243
TT
1759#if HAVE_PYTHON
1760 ui_out_field_string (uiout, NULL, "python");
1761#endif
1762
084344da 1763 do_cleanups (cleanup);
ce8f13f8 1764 return;
084344da
VP
1765 }
1766
7ea6d463 1767 error (_("-list-features should be passed no arguments"));
084344da 1768}
c6ebd6cf
VP
1769
1770void
1771mi_cmd_list_target_features (char *command, char **argv, int argc)
1772{
1773 if (argc == 0)
1774 {
1775 struct cleanup *cleanup = NULL;
79a45e25 1776 struct ui_out *uiout = current_uiout;
c6ebd6cf 1777
102040f0 1778 cleanup = make_cleanup_ui_out_list_begin_end (uiout, "features");
c6ebd6cf
VP
1779 if (target_can_async_p ())
1780 ui_out_field_string (uiout, NULL, "async");
f75d858b
MK
1781 if (target_can_execute_reverse)
1782 ui_out_field_string (uiout, NULL, "reverse");
c6ebd6cf
VP
1783
1784 do_cleanups (cleanup);
1785 return;
1786 }
1787
7ea6d463 1788 error (_("-list-target-features should be passed no arguments"));
c6ebd6cf
VP
1789}
1790
a79b8f6e
VP
1791void
1792mi_cmd_add_inferior (char *command, char **argv, int argc)
1793{
1794 struct inferior *inf;
1795
1796 if (argc != 0)
1797 error (_("-add-inferior should be passed no arguments"));
1798
1799 inf = add_inferior_with_spaces ();
1800
79a45e25 1801 ui_out_field_fmt (current_uiout, "inferior", "i%d", inf->num);
a79b8f6e
VP
1802}
1803
2b03b41d
SS
1804/* Callback used to find the first inferior other than the current
1805 one. */
57bf2d7e
MK
1806
1807static int
1808get_other_inferior (struct inferior *inf, void *arg)
1809{
1810 if (inf == current_inferior ())
1811 return 0;
1812
1813 return 1;
1814}
1815
a79b8f6e
VP
1816void
1817mi_cmd_remove_inferior (char *command, char **argv, int argc)
1818{
1819 int id;
1820 struct inferior *inf;
1821
1822 if (argc != 1)
7ea6d463 1823 error (_("-remove-inferior should be passed a single argument"));
a79b8f6e 1824
e2b4a699 1825 if (sscanf (argv[0], "i%d", &id) != 1)
7ea6d463 1826 error (_("the thread group id is syntactically invalid"));
a79b8f6e
VP
1827
1828 inf = find_inferior_id (id);
1829 if (!inf)
7ea6d463 1830 error (_("the specified thread group does not exist"));
a79b8f6e 1831
8fa067af 1832 if (inf->pid != 0)
81ec3cce 1833 error (_("cannot remove an active inferior"));
8fa067af 1834
57bf2d7e
MK
1835 if (inf == current_inferior ())
1836 {
1837 struct thread_info *tp = 0;
1838 struct inferior *new_inferior
1839 = iterate_over_inferiors (get_other_inferior, NULL);
1840
1841 if (new_inferior == NULL)
1842 error (_("Cannot remove last inferior"));
1843
1844 set_current_inferior (new_inferior);
1845 if (new_inferior->pid != 0)
1846 tp = any_thread_of_process (new_inferior->pid);
1847 switch_to_thread (tp ? tp->ptid : null_ptid);
1848 set_current_program_space (new_inferior->pspace);
1849 }
1850
a79b8f6e
VP
1851 delete_inferior_1 (inf, 1 /* silent */);
1852}
1853
1854\f
1855
8d34ea23
KS
1856/* Execute a command within a safe environment.
1857 Return <0 for error; >=0 for ok.
1858
1859 args->action will tell mi_execute_command what action
42972f50 1860 to perfrom after the given command has executed (display/suppress
2b03b41d 1861 prompt, display error). */
fb40c209 1862
f30f06b8 1863static void
04bd08de 1864captured_mi_execute_command (struct ui_out *uiout, struct mi_parse *context)
fb40c209 1865{
1f31650a 1866 struct cleanup *cleanup;
fb40c209 1867
4333ada3
VP
1868 if (do_timings)
1869 current_command_ts = context->cmd_start;
d8c83789 1870
1f31650a
VP
1871 current_token = xstrdup (context->token);
1872 cleanup = make_cleanup (free_current_contents, &current_token);
1873
a2840c35 1874 running_result_record_printed = 0;
f3b1572e 1875 mi_proceeded = 0;
fb40c209
AC
1876 switch (context->op)
1877 {
fb40c209 1878 case MI_COMMAND:
41296c92 1879 /* A MI command was read from the input stream. */
fb40c209
AC
1880 if (mi_debug_p)
1881 /* FIXME: gdb_???? */
1882 fprintf_unfiltered (raw_stdout, " token=`%s' command=`%s' args=`%s'\n",
1883 context->token, context->command, context->args);
d8c83789 1884
ce8f13f8 1885 mi_cmd_execute (context);
8d34ea23 1886
a2840c35 1887 /* Print the result if there were no errors.
4389a95a 1888
a2840c35 1889 Remember that on the way out of executing a command, you have
2b03b41d
SS
1890 to directly use the mi_interp's uiout, since the command
1891 could have reset the interpreter, in which case the current
1892 uiout will most likely crash in the mi_out_* routines. */
ce8f13f8 1893 if (!running_result_record_printed)
a2840c35
VP
1894 {
1895 fputs_unfiltered (context->token, raw_stdout);
ce8f13f8
VP
1896 /* There's no particularly good reason why target-connect results
1897 in not ^done. Should kill ^connected for MI3. */
1898 fputs_unfiltered (strcmp (context->command, "target-select") == 0
1899 ? "^connected" : "^done", raw_stdout);
a2840c35
VP
1900 mi_out_put (uiout, raw_stdout);
1901 mi_out_rewind (uiout);
4333ada3 1902 mi_print_timing_maybe ();
a2840c35
VP
1903 fputs_unfiltered ("\n", raw_stdout);
1904 }
1905 else
2b03b41d
SS
1906 /* The command does not want anything to be printed. In that
1907 case, the command probably should not have written anything
1908 to uiout, but in case it has written something, discard it. */
a2840c35 1909 mi_out_rewind (uiout);
fb40c209
AC
1910 break;
1911
1912 case CLI_COMMAND:
78f5381d
AC
1913 {
1914 char *argv[2];
102040f0 1915
78f5381d
AC
1916 /* A CLI command was read from the input stream. */
1917 /* This "feature" will be removed as soon as we have a
1918 complete set of mi commands. */
1919 /* Echo the command on the console. */
1920 fprintf_unfiltered (gdb_stdlog, "%s\n", context->command);
1921 /* Call the "console" interpreter. */
1922 argv[0] = "console";
1923 argv[1] = context->command;
ce8f13f8 1924 mi_cmd_interpreter_exec ("-interpreter-exec", argv, 2);
78f5381d 1925
eec01795 1926 /* If we changed interpreters, DON'T print out anything. */
78f5381d
AC
1927 if (current_interp_named_p (INTERP_MI)
1928 || current_interp_named_p (INTERP_MI1)
1929 || current_interp_named_p (INTERP_MI2)
1930 || current_interp_named_p (INTERP_MI3))
1931 {
ce8f13f8 1932 if (!running_result_record_printed)
eec01795
DJ
1933 {
1934 fputs_unfiltered (context->token, raw_stdout);
1935 fputs_unfiltered ("^done", raw_stdout);
1936 mi_out_put (uiout, raw_stdout);
1937 mi_out_rewind (uiout);
4333ada3
VP
1938 mi_print_timing_maybe ();
1939 fputs_unfiltered ("\n", raw_stdout);
eec01795 1940 }
eec01795
DJ
1941 else
1942 mi_out_rewind (uiout);
78f5381d
AC
1943 }
1944 break;
1945 }
fb40c209 1946 }
8d34ea23 1947
1f31650a 1948 do_cleanups (cleanup);
fb40c209
AC
1949}
1950
305aeedc
TT
1951/* Print a gdb exception to the MI output stream. */
1952
1953static void
1954mi_print_exception (const char *token, struct gdb_exception exception)
1955{
1956 fputs_unfiltered (token, raw_stdout);
1957 fputs_unfiltered ("^error,msg=\"", raw_stdout);
1958 if (exception.message == NULL)
1959 fputs_unfiltered ("unknown error", raw_stdout);
1960 else
1961 fputstr_unfiltered (exception.message, '"', raw_stdout);
1962 fputs_unfiltered ("\"\n", raw_stdout);
1963}
fb40c209
AC
1964
1965void
ee047554 1966mi_execute_command (const char *cmd, int from_tty)
fb40c209 1967{
305aeedc
TT
1968 char *token;
1969 struct mi_parse *command = NULL;
1970 volatile struct gdb_exception exception;
fb40c209 1971
41296c92
NR
1972 /* This is to handle EOF (^D). We just quit gdb. */
1973 /* FIXME: we should call some API function here. */
fb40c209
AC
1974 if (cmd == 0)
1975 quit_force (NULL, from_tty);
1976
11334b82
VP
1977 target_log_command (cmd);
1978
305aeedc
TT
1979 TRY_CATCH (exception, RETURN_MASK_ALL)
1980 {
1981 command = mi_parse (cmd, &token);
1982 }
1983 if (exception.reason < 0)
1984 {
1985 mi_print_exception (token, exception);
1986 xfree (token);
1987 }
1988 else
fb40c209 1989 {
04bd08de 1990 volatile struct gdb_exception result;
66bb093b 1991 ptid_t previous_ptid = inferior_ptid;
d8c83789 1992
305aeedc
TT
1993 command->token = token;
1994
d8c83789
NR
1995 if (do_timings)
1996 {
1997 command->cmd_start = (struct mi_timestamp *)
1998 xmalloc (sizeof (struct mi_timestamp));
1999 timestamp (command->cmd_start);
2000 }
2001
04bd08de
TT
2002 TRY_CATCH (result, RETURN_MASK_ALL)
2003 {
79a45e25 2004 captured_mi_execute_command (current_uiout, command);
04bd08de 2005 }
ce43223b 2006 if (result.reason < 0)
fb40c209 2007 {
fb40c209 2008 /* The command execution failed and error() was called
589e074d 2009 somewhere. */
305aeedc 2010 mi_print_exception (command->token, result);
79a45e25 2011 mi_out_rewind (current_uiout);
fb40c209 2012 }
a13e061a 2013
5d4e2b76
VP
2014 bpstat_do_actions ();
2015
66bb093b
VP
2016 if (/* The notifications are only output when the top-level
2017 interpreter (specified on the command line) is MI. */
2018 ui_out_is_mi_like_p (interp_ui_out (top_level_interpreter ()))
2019 /* Don't try report anything if there are no threads --
2020 the program is dead. */
2021 && thread_count () != 0
2022 /* -thread-select explicitly changes thread. If frontend uses that
2023 internally, we don't want to emit =thread-selected, since
2024 =thread-selected is supposed to indicate user's intentions. */
2025 && strcmp (command->command, "thread-select") != 0)
2026 {
2027 struct mi_interp *mi = top_level_interpreter_data ();
d729566a 2028 int report_change = 0;
66bb093b
VP
2029
2030 if (command->thread == -1)
2031 {
d729566a
PA
2032 report_change = (!ptid_equal (previous_ptid, null_ptid)
2033 && !ptid_equal (inferior_ptid, previous_ptid)
2034 && !ptid_equal (inferior_ptid, null_ptid));
66bb093b 2035 }
d729566a 2036 else if (!ptid_equal (inferior_ptid, null_ptid))
66bb093b 2037 {
d729566a 2038 struct thread_info *ti = inferior_thread ();
102040f0 2039
66bb093b
VP
2040 report_change = (ti->num != command->thread);
2041 }
2042
2043 if (report_change)
2044 {
d729566a 2045 struct thread_info *ti = inferior_thread ();
102040f0 2046
66bb093b
VP
2047 target_terminal_ours ();
2048 fprintf_unfiltered (mi->event_channel,
2049 "thread-selected,id=\"%d\"",
2050 ti->num);
2051 gdb_flush (mi->event_channel);
2052 }
2053 }
2054
fb40c209
AC
2055 mi_parse_free (command);
2056 }
fb40c209
AC
2057}
2058
ce8f13f8 2059static void
fb40c209
AC
2060mi_cmd_execute (struct mi_parse *parse)
2061{
f107f563 2062 struct cleanup *cleanup;
e23110bb 2063
028d0ed5 2064 cleanup = prepare_execute_command ();
1b98914a 2065
a79b8f6e
VP
2066 if (parse->all && parse->thread_group != -1)
2067 error (_("Cannot specify --thread-group together with --all"));
2068
2069 if (parse->all && parse->thread != -1)
2070 error (_("Cannot specify --thread together with --all"));
2071
2072 if (parse->thread_group != -1 && parse->thread != -1)
2073 error (_("Cannot specify --thread together with --thread-group"));
2074
1e92afda
VP
2075 if (parse->frame != -1 && parse->thread == -1)
2076 error (_("Cannot specify --frame without --thread"));
dcf4fbde 2077
a79b8f6e
VP
2078 if (parse->thread_group != -1)
2079 {
2080 struct inferior *inf = find_inferior_id (parse->thread_group);
2081 struct thread_info *tp = 0;
2082
2083 if (!inf)
46ef47e5 2084 error (_("Invalid thread group for the --thread-group option"));
a79b8f6e
VP
2085
2086 set_current_inferior (inf);
2087 /* This behaviour means that if --thread-group option identifies
2b03b41d
SS
2088 an inferior with multiple threads, then a random one will be
2089 picked. This is not a problem -- frontend should always
2090 provide --thread if it wishes to operate on a specific
2091 thread. */
a79b8f6e 2092 if (inf->pid != 0)
4734f50e 2093 tp = any_live_thread_of_process (inf->pid);
a79b8f6e
VP
2094 switch_to_thread (tp ? tp->ptid : null_ptid);
2095 set_current_program_space (inf->pspace);
2096 }
2097
1e92afda
VP
2098 if (parse->thread != -1)
2099 {
2100 struct thread_info *tp = find_thread_id (parse->thread);
102040f0 2101
1e92afda
VP
2102 if (!tp)
2103 error (_("Invalid thread id: %d"), parse->thread);
dcf4fbde
PA
2104
2105 if (is_exited (tp->ptid))
2106 error (_("Thread id: %d has terminated"), parse->thread);
2107
2108 switch_to_thread (tp->ptid);
1e92afda 2109 }
dcf4fbde 2110
1e92afda
VP
2111 if (parse->frame != -1)
2112 {
2113 struct frame_info *fid;
2114 int frame = parse->frame;
102040f0 2115
1e92afda
VP
2116 fid = find_relative_frame (get_current_frame (), &frame);
2117 if (frame == 0)
2118 /* find_relative_frame was successful */
2119 select_frame (fid);
2120 else
ea069267 2121 error (_("Invalid frame id: %d"), frame);
1e92afda 2122 }
dcf4fbde 2123
a79b8f6e
VP
2124 current_context = parse;
2125
648beb2b 2126 if (parse->cmd->suppress_notification != NULL)
8d3788bd 2127 {
648beb2b
YQ
2128 make_cleanup_restore_integer (parse->cmd->suppress_notification);
2129 *parse->cmd->suppress_notification = 1;
8d3788bd
VP
2130 }
2131
9e22b03a 2132 if (parse->cmd->argv_func != NULL)
8d3788bd
VP
2133 {
2134 parse->cmd->argv_func (parse->command, parse->argv, parse->argc);
2135 }
b2af646b 2136 else if (parse->cmd->cli.cmd != 0)
fb40c209
AC
2137 {
2138 /* FIXME: DELETE THIS. */
41296c92
NR
2139 /* The operation is still implemented by a cli command. */
2140 /* Must be a synchronous one. */
b2af646b
AC
2141 mi_execute_cli_command (parse->cmd->cli.cmd, parse->cmd->cli.args_p,
2142 parse->args);
fb40c209
AC
2143 }
2144 else
2145 {
41296c92 2146 /* FIXME: DELETE THIS. */
a13e061a
PA
2147 struct ui_file *stb;
2148
2149 stb = mem_fileopen ();
2150
2151 fputs_unfiltered ("Undefined mi command: ", stb);
2152 fputstr_unfiltered (parse->command, '"', stb);
2153 fputs_unfiltered (" (missing implementation)", stb);
2154
2155 make_cleanup_ui_file_delete (stb);
2156 error_stream (stb);
fb40c209 2157 }
1b98914a 2158 do_cleanups (cleanup);
fb40c209
AC
2159}
2160
fb40c209 2161/* FIXME: This is just a hack so we can get some extra commands going.
41296c92
NR
2162 We don't want to channel things through the CLI, but call libgdb directly.
2163 Use only for synchronous commands. */
fb40c209
AC
2164
2165void
b2af646b 2166mi_execute_cli_command (const char *cmd, int args_p, const char *args)
fb40c209 2167{
b2af646b 2168 if (cmd != 0)
fb40c209
AC
2169 {
2170 struct cleanup *old_cleanups;
2171 char *run;
102040f0 2172
b2af646b 2173 if (args_p)
c6902d46 2174 run = xstrprintf ("%s %s", cmd, args);
b2af646b
AC
2175 else
2176 run = xstrdup (cmd);
fb40c209
AC
2177 if (mi_debug_p)
2178 /* FIXME: gdb_???? */
2179 fprintf_unfiltered (gdb_stdout, "cli=%s run=%s\n",
b2af646b 2180 cmd, run);
b8c9b27d 2181 old_cleanups = make_cleanup (xfree, run);
2b03b41d 2182 execute_command (run, 0 /* from_tty */ );
fb40c209
AC
2183 do_cleanups (old_cleanups);
2184 return;
2185 }
2186}
2187
ce8f13f8 2188void
9e22b03a 2189mi_execute_async_cli_command (char *cli_command, char **argv, int argc)
fb40c209
AC
2190{
2191 struct cleanup *old_cleanups;
2192 char *run;
fb40c209
AC
2193
2194 if (target_can_async_p ())
9e22b03a 2195 run = xstrprintf ("%s %s&", cli_command, argc ? *argv : "");
fb40c209 2196 else
9e22b03a 2197 run = xstrprintf ("%s %s", cli_command, argc ? *argv : "");
f107f563 2198 old_cleanups = make_cleanup (xfree, run);
fb40c209 2199
2b03b41d 2200 execute_command (run, 0 /* from_tty */ );
fb40c209 2201
09cee04b
PA
2202 /* Do this before doing any printing. It would appear that some
2203 print code leaves garbage around in the buffer. */
2204 do_cleanups (old_cleanups);
fb40c209
AC
2205}
2206
2207void
fb40c209
AC
2208mi_load_progress (const char *section_name,
2209 unsigned long sent_so_far,
2210 unsigned long total_section,
2211 unsigned long total_sent,
2212 unsigned long grand_total)
2213{
2214 struct timeval time_now, delta, update_threshold;
2215 static struct timeval last_update;
2216 static char *previous_sect_name = NULL;
2217 int new_section;
0be75e02 2218 struct ui_out *saved_uiout;
79a45e25 2219 struct ui_out *uiout;
fb40c209 2220
0be75e02
AS
2221 /* This function is called through deprecated_show_load_progress
2222 which means uiout may not be correct. Fix it for the duration
2223 of this function. */
79a45e25 2224 saved_uiout = current_uiout;
0be75e02 2225
edff0c0a
DJ
2226 if (current_interp_named_p (INTERP_MI)
2227 || current_interp_named_p (INTERP_MI2))
79a45e25 2228 current_uiout = mi_out_new (2);
0be75e02 2229 else if (current_interp_named_p (INTERP_MI1))
79a45e25 2230 current_uiout = mi_out_new (1);
edff0c0a 2231 else if (current_interp_named_p (INTERP_MI3))
79a45e25 2232 current_uiout = mi_out_new (3);
0be75e02 2233 else
fb40c209
AC
2234 return;
2235
79a45e25
PA
2236 uiout = current_uiout;
2237
fb40c209
AC
2238 update_threshold.tv_sec = 0;
2239 update_threshold.tv_usec = 500000;
2240 gettimeofday (&time_now, NULL);
2241
2242 delta.tv_usec = time_now.tv_usec - last_update.tv_usec;
2243 delta.tv_sec = time_now.tv_sec - last_update.tv_sec;
2244
2245 if (delta.tv_usec < 0)
2246 {
2247 delta.tv_sec -= 1;
f2395593 2248 delta.tv_usec += 1000000L;
fb40c209
AC
2249 }
2250
2251 new_section = (previous_sect_name ?
2252 strcmp (previous_sect_name, section_name) : 1);
2253 if (new_section)
2254 {
6ad4a2cf 2255 struct cleanup *cleanup_tuple;
102040f0 2256
b8c9b27d 2257 xfree (previous_sect_name);
fb40c209
AC
2258 previous_sect_name = xstrdup (section_name);
2259
721c02de
VP
2260 if (current_token)
2261 fputs_unfiltered (current_token, raw_stdout);
fb40c209 2262 fputs_unfiltered ("+download", raw_stdout);
6ad4a2cf 2263 cleanup_tuple = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
fb40c209
AC
2264 ui_out_field_string (uiout, "section", section_name);
2265 ui_out_field_int (uiout, "section-size", total_section);
2266 ui_out_field_int (uiout, "total-size", grand_total);
6ad4a2cf 2267 do_cleanups (cleanup_tuple);
fb40c209
AC
2268 mi_out_put (uiout, raw_stdout);
2269 fputs_unfiltered ("\n", raw_stdout);
2270 gdb_flush (raw_stdout);
2271 }
2272
2273 if (delta.tv_sec >= update_threshold.tv_sec &&
2274 delta.tv_usec >= update_threshold.tv_usec)
2275 {
6ad4a2cf 2276 struct cleanup *cleanup_tuple;
102040f0 2277
fb40c209
AC
2278 last_update.tv_sec = time_now.tv_sec;
2279 last_update.tv_usec = time_now.tv_usec;
721c02de
VP
2280 if (current_token)
2281 fputs_unfiltered (current_token, raw_stdout);
fb40c209 2282 fputs_unfiltered ("+download", raw_stdout);
6ad4a2cf 2283 cleanup_tuple = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
fb40c209
AC
2284 ui_out_field_string (uiout, "section", section_name);
2285 ui_out_field_int (uiout, "section-sent", sent_so_far);
2286 ui_out_field_int (uiout, "section-size", total_section);
2287 ui_out_field_int (uiout, "total-sent", total_sent);
2288 ui_out_field_int (uiout, "total-size", grand_total);
6ad4a2cf 2289 do_cleanups (cleanup_tuple);
fb40c209
AC
2290 mi_out_put (uiout, raw_stdout);
2291 fputs_unfiltered ("\n", raw_stdout);
2292 gdb_flush (raw_stdout);
2293 }
0be75e02
AS
2294
2295 xfree (uiout);
67ba4e42 2296 current_uiout = saved_uiout;
fb40c209
AC
2297}
2298
d8c83789
NR
2299static void
2300timestamp (struct mi_timestamp *tv)
2b03b41d
SS
2301{
2302 gettimeofday (&tv->wallclock, NULL);
d8c83789 2303#ifdef HAVE_GETRUSAGE
2b03b41d
SS
2304 getrusage (RUSAGE_SELF, &rusage);
2305 tv->utime.tv_sec = rusage.ru_utime.tv_sec;
2306 tv->utime.tv_usec = rusage.ru_utime.tv_usec;
2307 tv->stime.tv_sec = rusage.ru_stime.tv_sec;
2308 tv->stime.tv_usec = rusage.ru_stime.tv_usec;
d8c83789 2309#else
2b03b41d
SS
2310 {
2311 long usec = get_run_time ();
a1b7d198 2312
2b03b41d
SS
2313 tv->utime.tv_sec = usec/1000000L;
2314 tv->utime.tv_usec = usec - 1000000L*tv->utime.tv_sec;
2315 tv->stime.tv_sec = 0;
2316 tv->stime.tv_usec = 0;
d8c83789 2317 }
2b03b41d
SS
2318#endif
2319}
d8c83789
NR
2320
2321static void
2322print_diff_now (struct mi_timestamp *start)
2b03b41d
SS
2323{
2324 struct mi_timestamp now;
102040f0 2325
2b03b41d
SS
2326 timestamp (&now);
2327 print_diff (start, &now);
2328}
d8c83789 2329
4333ada3
VP
2330void
2331mi_print_timing_maybe (void)
2332{
2b03b41d
SS
2333 /* If the command is -enable-timing then do_timings may be true
2334 whilst current_command_ts is not initialized. */
4333ada3
VP
2335 if (do_timings && current_command_ts)
2336 print_diff_now (current_command_ts);
2337}
2338
d8c83789
NR
2339static long
2340timeval_diff (struct timeval start, struct timeval end)
2b03b41d
SS
2341{
2342 return ((end.tv_sec - start.tv_sec) * 1000000L)
2343 + (end.tv_usec - start.tv_usec);
2344}
d8c83789
NR
2345
2346static void
2347print_diff (struct mi_timestamp *start, struct mi_timestamp *end)
2b03b41d
SS
2348{
2349 fprintf_unfiltered
2350 (raw_stdout,
2351 ",time={wallclock=\"%0.5f\",user=\"%0.5f\",system=\"%0.5f\"}",
2352 timeval_diff (start->wallclock, end->wallclock) / 1000000.0,
2353 timeval_diff (start->utime, end->utime) / 1000000.0,
2354 timeval_diff (start->stime, end->stime) / 1000000.0);
2355}
f224b49d 2356
40e1c229
VP
2357void
2358mi_cmd_trace_define_variable (char *command, char **argv, int argc)
2359{
2360 struct expression *expr;
40e1c229
VP
2361 LONGEST initval = 0;
2362 struct trace_state_variable *tsv;
2363 char *name = 0;
2364
2365 if (argc != 1 && argc != 2)
2366 error (_("Usage: -trace-define-variable VARIABLE [VALUE]"));
2367
1773c82c
HAQ
2368 name = argv[0];
2369 if (*name++ != '$')
2370 error (_("Name of trace variable should start with '$'"));
40e1c229 2371
1773c82c 2372 validate_trace_state_variable_name (name);
40e1c229
VP
2373
2374 tsv = find_trace_state_variable (name);
2375 if (!tsv)
2376 tsv = create_trace_state_variable (name);
2377
2378 if (argc == 2)
2379 initval = value_as_long (parse_and_eval (argv[1]));
2380
2381 tsv->initial_value = initval;
40e1c229
VP
2382}
2383
2384void
2385mi_cmd_trace_list_variables (char *command, char **argv, int argc)
2386{
2387 if (argc != 0)
2b03b41d 2388 error (_("-trace-list-variables: no arguments allowed"));
40e1c229
VP
2389
2390 tvariables_info_1 ();
2391}
2392
f197e0f1
VP
2393void
2394mi_cmd_trace_find (char *command, char **argv, int argc)
2395{
2396 char *mode;
2397
2398 if (argc == 0)
2399 error (_("trace selection mode is required"));
2400
2401 mode = argv[0];
2402
2403 if (strcmp (mode, "none") == 0)
2404 {
2405 tfind_1 (tfind_number, -1, 0, 0, 0);
2406 return;
2407 }
2408
2409 if (current_trace_status ()->running)
2410 error (_("May not look at trace frames while trace is running."));
2411
2412 if (strcmp (mode, "frame-number") == 0)
2413 {
2414 if (argc != 2)
2415 error (_("frame number is required"));
2416 tfind_1 (tfind_number, atoi (argv[1]), 0, 0, 0);
2417 }
2418 else if (strcmp (mode, "tracepoint-number") == 0)
2419 {
2420 if (argc != 2)
2421 error (_("tracepoint number is required"));
2422 tfind_1 (tfind_tp, atoi (argv[1]), 0, 0, 0);
2423 }
2424 else if (strcmp (mode, "pc") == 0)
2425 {
2426 if (argc != 2)
2427 error (_("PC is required"));
2428 tfind_1 (tfind_pc, 0, parse_and_eval_address (argv[1]), 0, 0);
2429 }
2430 else if (strcmp (mode, "pc-inside-range") == 0)
2431 {
2432 if (argc != 3)
2433 error (_("Start and end PC are required"));
2434 tfind_1 (tfind_range, 0, parse_and_eval_address (argv[1]),
2435 parse_and_eval_address (argv[2]), 0);
2436 }
2437 else if (strcmp (mode, "pc-outside-range") == 0)
2438 {
2439 if (argc != 3)
2440 error (_("Start and end PC are required"));
2441 tfind_1 (tfind_outside, 0, parse_and_eval_address (argv[1]),
2442 parse_and_eval_address (argv[2]), 0);
2443 }
2444 else if (strcmp (mode, "line") == 0)
2445 {
2446 struct symtabs_and_lines sals;
2447 struct symtab_and_line sal;
2448 static CORE_ADDR start_pc, end_pc;
2449 struct cleanup *back_to;
2450
2451 if (argc != 2)
2452 error (_("Line is required"));
2453
39cf75f7
DE
2454 sals = decode_line_with_current_source (argv[1],
2455 DECODE_LINE_FUNFIRSTLINE);
f197e0f1
VP
2456 back_to = make_cleanup (xfree, sals.sals);
2457
2458 sal = sals.sals[0];
2459
2460 if (sal.symtab == 0)
2461 error (_("Could not find the specified line"));
2462
2463 if (sal.line > 0 && find_line_pc_range (sal, &start_pc, &end_pc))
2464 tfind_1 (tfind_range, 0, start_pc, end_pc - 1, 0);
2465 else
2466 error (_("Could not find the specified line"));
2467
2468 do_cleanups (back_to);
2469 }
2470 else
2471 error (_("Invalid mode '%s'"), mode);
2472
2473 if (has_stack_frames () || get_traceframe_number () >= 0)
2b03b41d 2474 print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC);
f197e0f1
VP
2475}
2476
011aacb0
VP
2477void
2478mi_cmd_trace_save (char *command, char **argv, int argc)
2479{
2480 int target_saves = 0;
d0353e76 2481 int generate_ctf = 0;
011aacb0 2482 char *filename;
d0353e76
YQ
2483 int oind = 0;
2484 char *oarg;
011aacb0 2485
d0353e76
YQ
2486 enum opt
2487 {
2488 TARGET_SAVE_OPT, CTF_OPT
2489 };
2490 static const struct mi_opt opts[] =
011aacb0 2491 {
d0353e76
YQ
2492 {"r", TARGET_SAVE_OPT, 0},
2493 {"ctf", CTF_OPT, 0},
2494 { 0, 0, 0 }
2495 };
2496
2497 while (1)
011aacb0 2498 {
d0353e76
YQ
2499 int opt = mi_getopt ("-trace-save", argc, argv, opts,
2500 &oind, &oarg);
2501
2502 if (opt < 0)
2503 break;
2504 switch ((enum opt) opt)
2505 {
2506 case TARGET_SAVE_OPT:
2507 target_saves = 1;
2508 break;
2509 case CTF_OPT:
2510 generate_ctf = 1;
2511 break;
2512 }
011aacb0 2513 }
d0353e76 2514 filename = argv[oind];
011aacb0 2515
d0353e76
YQ
2516 if (generate_ctf)
2517 trace_save_ctf (filename, target_saves);
2518 else
2519 trace_save_tfile (filename, target_saves);
011aacb0
VP
2520}
2521
f224b49d
VP
2522void
2523mi_cmd_trace_start (char *command, char **argv, int argc)
2524{
f196051f 2525 start_tracing (NULL);
f224b49d
VP
2526}
2527
2528void
2529mi_cmd_trace_status (char *command, char **argv, int argc)
2530{
2531 trace_status_mi (0);
2532}
2533
2534void
2535mi_cmd_trace_stop (char *command, char **argv, int argc)
2536{
f196051f 2537 stop_tracing (NULL);
f224b49d
VP
2538 trace_status_mi (1);
2539}
75082e8c 2540
2b03b41d 2541/* Implement the "-ada-task-info" command. */
75082e8c
JB
2542
2543void
2544mi_cmd_ada_task_info (char *command, char **argv, int argc)
2545{
2546 if (argc != 0 && argc != 1)
2547 error (_("Invalid MI command"));
2548
2549 print_ada_task_info (current_uiout, argv[0], current_inferior ());
2550}
This page took 1.245252 seconds and 4 git commands to generate.