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