Use scoped_restore in more places
[deliverable/binutils-gdb.git] / gdb / mi / mi-main.c
1 /* MI Command Set.
2
3 Copyright (C) 2000-2017 Free Software Foundation, Inc.
4
5 Contributed by Cygnus Solutions (a Red Hat company).
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
11 the Free Software Foundation; either version 3 of the License, or
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
20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
21
22 #include "defs.h"
23 #include "arch-utils.h"
24 #include "target.h"
25 #include "inferior.h"
26 #include "infrun.h"
27 #include "top.h"
28 #include "gdbthread.h"
29 #include "mi-cmds.h"
30 #include "mi-parse.h"
31 #include "mi-getopt.h"
32 #include "mi-console.h"
33 #include "ui-out.h"
34 #include "mi-out.h"
35 #include "interps.h"
36 #include "event-loop.h"
37 #include "event-top.h"
38 #include "gdbcore.h" /* For write_memory(). */
39 #include "value.h"
40 #include "regcache.h"
41 #include "gdb.h"
42 #include "frame.h"
43 #include "mi-main.h"
44 #include "mi-common.h"
45 #include "language.h"
46 #include "valprint.h"
47 #include "inferior.h"
48 #include "osdata.h"
49 #include "splay-tree.h"
50 #include "tracepoint.h"
51 #include "ctf.h"
52 #include "ada-lang.h"
53 #include "linespec.h"
54 #include "extension.h"
55 #include "gdbcmd.h"
56 #include "observer.h"
57 #include "common/gdb_optional.h"
58
59 #include <ctype.h>
60 #include "run-time-clock.h"
61 #include <chrono>
62
63 enum
64 {
65 FROM_TTY = 0
66 };
67
68 int mi_debug_p;
69
70 /* This is used to pass the current command timestamp down to
71 continuation routines. */
72 static struct mi_timestamp *current_command_ts;
73
74 static int do_timings = 0;
75
76 char *current_token;
77 /* Few commands would like to know if options like --thread-group were
78 explicitly specified. This variable keeps the current parsed
79 command including all option, and make it possible. */
80 static struct mi_parse *current_context;
81
82 int running_result_record_printed = 1;
83
84 /* Flag indicating that the target has proceeded since the last
85 command was issued. */
86 int mi_proceeded;
87
88 extern void _initialize_mi_main (void);
89 static void mi_cmd_execute (struct mi_parse *parse);
90
91 static void mi_execute_cli_command (const char *cmd, int args_p,
92 const char *args);
93 static void mi_execute_async_cli_command (const char *cli_command,
94 char **argv, int argc);
95 static int register_changed_p (int regnum, struct regcache *,
96 struct regcache *);
97 static void output_register (struct frame_info *, int regnum, int format,
98 int skip_unavailable);
99
100 /* Controls whether the frontend wants MI in async mode. */
101 static int mi_async = 0;
102
103 /* The set command writes to this variable. If the inferior is
104 executing, mi_async is *not* updated. */
105 static int mi_async_1 = 0;
106
107 static void
108 set_mi_async_command (char *args, int from_tty,
109 struct cmd_list_element *c)
110 {
111 if (have_live_inferiors ())
112 {
113 mi_async_1 = mi_async;
114 error (_("Cannot change this setting while the inferior is running."));
115 }
116
117 mi_async = mi_async_1;
118 }
119
120 static void
121 show_mi_async_command (struct ui_file *file, int from_tty,
122 struct cmd_list_element *c,
123 const char *value)
124 {
125 fprintf_filtered (file,
126 _("Whether MI is in asynchronous mode is %s.\n"),
127 value);
128 }
129
130 /* A wrapper for target_can_async_p that takes the MI setting into
131 account. */
132
133 int
134 mi_async_p (void)
135 {
136 return mi_async && target_can_async_p ();
137 }
138
139 /* Command implementations. FIXME: Is this libgdb? No. This is the MI
140 layer that calls libgdb. Any operation used in the below should be
141 formalized. */
142
143 static void timestamp (struct mi_timestamp *tv);
144
145 static void print_diff (struct ui_file *file, struct mi_timestamp *start,
146 struct mi_timestamp *end);
147
148 void
149 mi_cmd_gdb_exit (const char *command, char **argv, int argc)
150 {
151 struct mi_interp *mi = (struct mi_interp *) current_interpreter ();
152
153 /* We have to print everything right here because we never return. */
154 if (current_token)
155 fputs_unfiltered (current_token, mi->raw_stdout);
156 fputs_unfiltered ("^exit\n", mi->raw_stdout);
157 mi_out_put (current_uiout, mi->raw_stdout);
158 gdb_flush (mi->raw_stdout);
159 /* FIXME: The function called is not yet a formal libgdb function. */
160 quit_force (NULL, FROM_TTY);
161 }
162
163 void
164 mi_cmd_exec_next (const char *command, char **argv, int argc)
165 {
166 /* FIXME: Should call a libgdb function, not a cli wrapper. */
167 if (argc > 0 && strcmp(argv[0], "--reverse") == 0)
168 mi_execute_async_cli_command ("reverse-next", argv + 1, argc - 1);
169 else
170 mi_execute_async_cli_command ("next", argv, argc);
171 }
172
173 void
174 mi_cmd_exec_next_instruction (const char *command, char **argv, int argc)
175 {
176 /* FIXME: Should call a libgdb function, not a cli wrapper. */
177 if (argc > 0 && strcmp(argv[0], "--reverse") == 0)
178 mi_execute_async_cli_command ("reverse-nexti", argv + 1, argc - 1);
179 else
180 mi_execute_async_cli_command ("nexti", argv, argc);
181 }
182
183 void
184 mi_cmd_exec_step (const char *command, char **argv, int argc)
185 {
186 /* FIXME: Should call a libgdb function, not a cli wrapper. */
187 if (argc > 0 && strcmp(argv[0], "--reverse") == 0)
188 mi_execute_async_cli_command ("reverse-step", argv + 1, argc - 1);
189 else
190 mi_execute_async_cli_command ("step", argv, argc);
191 }
192
193 void
194 mi_cmd_exec_step_instruction (const char *command, char **argv, int argc)
195 {
196 /* FIXME: Should call a libgdb function, not a cli wrapper. */
197 if (argc > 0 && strcmp(argv[0], "--reverse") == 0)
198 mi_execute_async_cli_command ("reverse-stepi", argv + 1, argc - 1);
199 else
200 mi_execute_async_cli_command ("stepi", argv, argc);
201 }
202
203 void
204 mi_cmd_exec_finish (const char *command, char **argv, int argc)
205 {
206 /* FIXME: Should call a libgdb function, not a cli wrapper. */
207 if (argc > 0 && strcmp(argv[0], "--reverse") == 0)
208 mi_execute_async_cli_command ("reverse-finish", argv + 1, argc - 1);
209 else
210 mi_execute_async_cli_command ("finish", argv, argc);
211 }
212
213 void
214 mi_cmd_exec_return (const char *command, char **argv, int argc)
215 {
216 /* This command doesn't really execute the target, it just pops the
217 specified number of frames. */
218 if (argc)
219 /* Call return_command with from_tty argument equal to 0 so as to
220 avoid being queried. */
221 return_command (*argv, 0);
222 else
223 /* Call return_command with from_tty argument equal to 0 so as to
224 avoid being queried. */
225 return_command (NULL, 0);
226
227 /* Because we have called return_command with from_tty = 0, we need
228 to print the frame here. */
229 print_stack_frame (get_selected_frame (NULL), 1, LOC_AND_ADDRESS, 1);
230 }
231
232 void
233 mi_cmd_exec_jump (const char *args, char **argv, int argc)
234 {
235 /* FIXME: Should call a libgdb function, not a cli wrapper. */
236 mi_execute_async_cli_command ("jump", argv, argc);
237 }
238
239 static void
240 proceed_thread (struct thread_info *thread, int pid)
241 {
242 if (!is_stopped (thread->ptid))
243 return;
244
245 if (pid != 0 && ptid_get_pid (thread->ptid) != pid)
246 return;
247
248 switch_to_thread (thread->ptid);
249 clear_proceed_status (0);
250 proceed ((CORE_ADDR) -1, GDB_SIGNAL_DEFAULT);
251 }
252
253 static int
254 proceed_thread_callback (struct thread_info *thread, void *arg)
255 {
256 int pid = *(int *)arg;
257
258 proceed_thread (thread, pid);
259 return 0;
260 }
261
262 static void
263 exec_continue (char **argv, int argc)
264 {
265 prepare_execution_command (&current_target, mi_async_p ());
266
267 if (non_stop)
268 {
269 /* In non-stop mode, 'resume' always resumes a single thread.
270 Therefore, to resume all threads of the current inferior, or
271 all threads in all inferiors, we need to iterate over
272 threads.
273
274 See comment on infcmd.c:proceed_thread_callback for rationale. */
275 if (current_context->all || current_context->thread_group != -1)
276 {
277 int pid = 0;
278 struct cleanup *back_to = make_cleanup_restore_current_thread ();
279
280 if (!current_context->all)
281 {
282 struct inferior *inf
283 = find_inferior_id (current_context->thread_group);
284
285 pid = inf->pid;
286 }
287 iterate_over_threads (proceed_thread_callback, &pid);
288 do_cleanups (back_to);
289 }
290 else
291 {
292 continue_1 (0);
293 }
294 }
295 else
296 {
297 scoped_restore save_multi = make_scoped_restore (&sched_multi);
298
299 if (current_context->all)
300 {
301 sched_multi = 1;
302 continue_1 (0);
303 }
304 else
305 {
306 /* In all-stop mode, -exec-continue traditionally resumed
307 either all threads, or one thread, depending on the
308 'scheduler-locking' variable. Let's continue to do the
309 same. */
310 continue_1 (1);
311 }
312 }
313 }
314
315 static void
316 exec_reverse_continue (char **argv, int argc)
317 {
318 enum exec_direction_kind dir = execution_direction;
319
320 if (dir == EXEC_REVERSE)
321 error (_("Already in reverse mode."));
322
323 if (!target_can_execute_reverse)
324 error (_("Target %s does not support this command."), target_shortname);
325
326 scoped_restore save_exec_dir = make_scoped_restore (&execution_direction,
327 EXEC_REVERSE);
328 exec_continue (argv, argc);
329 }
330
331 void
332 mi_cmd_exec_continue (const char *command, char **argv, int argc)
333 {
334 if (argc > 0 && strcmp (argv[0], "--reverse") == 0)
335 exec_reverse_continue (argv + 1, argc - 1);
336 else
337 exec_continue (argv, argc);
338 }
339
340 static int
341 interrupt_thread_callback (struct thread_info *thread, void *arg)
342 {
343 int pid = *(int *)arg;
344
345 if (!is_running (thread->ptid))
346 return 0;
347
348 if (ptid_get_pid (thread->ptid) != pid)
349 return 0;
350
351 target_stop (thread->ptid);
352 return 0;
353 }
354
355 /* Interrupt the execution of the target. Note how we must play
356 around with the token variables, in order to display the current
357 token in the result of the interrupt command, and the previous
358 execution token when the target finally stops. See comments in
359 mi_cmd_execute. */
360
361 void
362 mi_cmd_exec_interrupt (const char *command, char **argv, int argc)
363 {
364 /* In all-stop mode, everything stops, so we don't need to try
365 anything specific. */
366 if (!non_stop)
367 {
368 interrupt_target_1 (0);
369 return;
370 }
371
372 if (current_context->all)
373 {
374 /* This will interrupt all threads in all inferiors. */
375 interrupt_target_1 (1);
376 }
377 else if (current_context->thread_group != -1)
378 {
379 struct inferior *inf = find_inferior_id (current_context->thread_group);
380
381 iterate_over_threads (interrupt_thread_callback, &inf->pid);
382 }
383 else
384 {
385 /* Interrupt just the current thread -- either explicitly
386 specified via --thread or whatever was current before
387 MI command was sent. */
388 interrupt_target_1 (0);
389 }
390 }
391
392 /* Callback for iterate_over_inferiors which starts the execution
393 of the given inferior.
394
395 ARG is a pointer to an integer whose value, if non-zero, indicates
396 that the program should be stopped when reaching the main subprogram
397 (similar to what the CLI "start" command does). */
398
399 static int
400 run_one_inferior (struct inferior *inf, void *arg)
401 {
402 int start_p = *(int *) arg;
403 const char *run_cmd = start_p ? "start" : "run";
404 struct target_ops *run_target = find_run_target ();
405 int async_p = mi_async && run_target->to_can_async_p (run_target);
406
407 if (inf->pid != 0)
408 {
409 if (inf->pid != ptid_get_pid (inferior_ptid))
410 {
411 struct thread_info *tp;
412
413 tp = any_thread_of_process (inf->pid);
414 if (!tp)
415 error (_("Inferior has no threads."));
416
417 switch_to_thread (tp->ptid);
418 }
419 }
420 else
421 {
422 set_current_inferior (inf);
423 switch_to_thread (null_ptid);
424 set_current_program_space (inf->pspace);
425 }
426 mi_execute_cli_command (run_cmd, async_p,
427 async_p ? "&" : NULL);
428 return 0;
429 }
430
431 void
432 mi_cmd_exec_run (const char *command, char **argv, int argc)
433 {
434 int start_p = 0;
435
436 /* Parse the command options. */
437 enum opt
438 {
439 START_OPT,
440 };
441 static const struct mi_opt opts[] =
442 {
443 {"-start", START_OPT, 0},
444 {NULL, 0, 0},
445 };
446
447 int oind = 0;
448 char *oarg;
449
450 while (1)
451 {
452 int opt = mi_getopt ("-exec-run", argc, argv, opts, &oind, &oarg);
453
454 if (opt < 0)
455 break;
456 switch ((enum opt) opt)
457 {
458 case START_OPT:
459 start_p = 1;
460 break;
461 }
462 }
463
464 /* This command does not accept any argument. Make sure the user
465 did not provide any. */
466 if (oind != argc)
467 error (_("Invalid argument: %s"), argv[oind]);
468
469 if (current_context->all)
470 {
471 struct cleanup *back_to = save_current_space_and_thread ();
472
473 iterate_over_inferiors (run_one_inferior, &start_p);
474 do_cleanups (back_to);
475 }
476 else
477 {
478 const char *run_cmd = start_p ? "start" : "run";
479 struct target_ops *run_target = find_run_target ();
480 int async_p = mi_async && run_target->to_can_async_p (run_target);
481
482 mi_execute_cli_command (run_cmd, async_p,
483 async_p ? "&" : NULL);
484 }
485 }
486
487
488 static int
489 find_thread_of_process (struct thread_info *ti, void *p)
490 {
491 int pid = *(int *)p;
492
493 if (ptid_get_pid (ti->ptid) == pid && !is_exited (ti->ptid))
494 return 1;
495
496 return 0;
497 }
498
499 void
500 mi_cmd_target_detach (const char *command, char **argv, int argc)
501 {
502 if (argc != 0 && argc != 1)
503 error (_("Usage: -target-detach [pid | thread-group]"));
504
505 if (argc == 1)
506 {
507 struct thread_info *tp;
508 char *end = argv[0];
509 int pid;
510
511 /* First see if we are dealing with a thread-group id. */
512 if (*argv[0] == 'i')
513 {
514 struct inferior *inf;
515 int id = strtoul (argv[0] + 1, &end, 0);
516
517 if (*end != '\0')
518 error (_("Invalid syntax of thread-group id '%s'"), argv[0]);
519
520 inf = find_inferior_id (id);
521 if (!inf)
522 error (_("Non-existent thread-group id '%d'"), id);
523
524 pid = inf->pid;
525 }
526 else
527 {
528 /* We must be dealing with a pid. */
529 pid = strtol (argv[0], &end, 10);
530
531 if (*end != '\0')
532 error (_("Invalid identifier '%s'"), argv[0]);
533 }
534
535 /* Pick any thread in the desired process. Current
536 target_detach detaches from the parent of inferior_ptid. */
537 tp = iterate_over_threads (find_thread_of_process, &pid);
538 if (!tp)
539 error (_("Thread group is empty"));
540
541 switch_to_thread (tp->ptid);
542 }
543
544 detach_command (NULL, 0);
545 }
546
547 void
548 mi_cmd_target_flash_erase (const char *command, char **argv, int argc)
549 {
550 flash_erase_command (NULL, 0);
551 }
552
553 void
554 mi_cmd_thread_select (const char *command, char **argv, int argc)
555 {
556 enum gdb_rc rc;
557 char *mi_error_message;
558 ptid_t previous_ptid = inferior_ptid;
559
560 if (argc != 1)
561 error (_("-thread-select: USAGE: threadnum."));
562
563 rc = gdb_thread_select (current_uiout, argv[0], &mi_error_message);
564
565 /* If thread switch did not succeed don't notify or print. */
566 if (rc == GDB_RC_FAIL)
567 {
568 make_cleanup (xfree, mi_error_message);
569 error ("%s", mi_error_message);
570 }
571
572 print_selected_thread_frame (current_uiout,
573 USER_SELECTED_THREAD | USER_SELECTED_FRAME);
574
575 /* Notify if the thread has effectively changed. */
576 if (!ptid_equal (inferior_ptid, previous_ptid))
577 {
578 observer_notify_user_selected_context_changed (USER_SELECTED_THREAD
579 | USER_SELECTED_FRAME);
580 }
581 }
582
583 void
584 mi_cmd_thread_list_ids (const char *command, char **argv, int argc)
585 {
586 enum gdb_rc rc;
587 char *mi_error_message;
588
589 if (argc != 0)
590 error (_("-thread-list-ids: No arguments required."));
591
592 rc = gdb_list_thread_ids (current_uiout, &mi_error_message);
593
594 if (rc == GDB_RC_FAIL)
595 {
596 make_cleanup (xfree, mi_error_message);
597 error ("%s", mi_error_message);
598 }
599 }
600
601 void
602 mi_cmd_thread_info (const char *command, char **argv, int argc)
603 {
604 if (argc != 0 && argc != 1)
605 error (_("Invalid MI command"));
606
607 print_thread_info (current_uiout, argv[0], -1);
608 }
609
610 struct collect_cores_data
611 {
612 int pid;
613
614 VEC (int) *cores;
615 };
616
617 static int
618 collect_cores (struct thread_info *ti, void *xdata)
619 {
620 struct collect_cores_data *data = (struct collect_cores_data *) xdata;
621
622 if (ptid_get_pid (ti->ptid) == data->pid)
623 {
624 int core = target_core_of_thread (ti->ptid);
625
626 if (core != -1)
627 VEC_safe_push (int, data->cores, core);
628 }
629
630 return 0;
631 }
632
633 static int *
634 unique (int *b, int *e)
635 {
636 int *d = b;
637
638 while (++b != e)
639 if (*d != *b)
640 *++d = *b;
641 return ++d;
642 }
643
644 struct print_one_inferior_data
645 {
646 int recurse;
647 VEC (int) *inferiors;
648 };
649
650 static int
651 print_one_inferior (struct inferior *inferior, void *xdata)
652 {
653 struct print_one_inferior_data *top_data
654 = (struct print_one_inferior_data *) xdata;
655 struct ui_out *uiout = current_uiout;
656
657 if (VEC_empty (int, top_data->inferiors)
658 || bsearch (&(inferior->pid), VEC_address (int, top_data->inferiors),
659 VEC_length (int, top_data->inferiors), sizeof (int),
660 compare_positive_ints))
661 {
662 struct collect_cores_data data;
663 struct cleanup *back_to
664 = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
665
666 uiout->field_fmt ("id", "i%d", inferior->num);
667 uiout->field_string ("type", "process");
668 if (inferior->has_exit_code)
669 uiout->field_string ("exit-code",
670 int_string (inferior->exit_code, 8, 0, 0, 1));
671 if (inferior->pid != 0)
672 uiout->field_int ("pid", inferior->pid);
673
674 if (inferior->pspace->pspace_exec_filename != NULL)
675 {
676 uiout->field_string ("executable",
677 inferior->pspace->pspace_exec_filename);
678 }
679
680 data.cores = 0;
681 if (inferior->pid != 0)
682 {
683 data.pid = inferior->pid;
684 iterate_over_threads (collect_cores, &data);
685 }
686
687 if (!VEC_empty (int, data.cores))
688 {
689 int *b, *e;
690 struct cleanup *back_to_2 =
691 make_cleanup_ui_out_list_begin_end (uiout, "cores");
692
693 qsort (VEC_address (int, data.cores),
694 VEC_length (int, data.cores), sizeof (int),
695 compare_positive_ints);
696
697 b = VEC_address (int, data.cores);
698 e = b + VEC_length (int, data.cores);
699 e = unique (b, e);
700
701 for (; b != e; ++b)
702 uiout->field_int (NULL, *b);
703
704 do_cleanups (back_to_2);
705 }
706
707 if (top_data->recurse)
708 print_thread_info (uiout, NULL, inferior->pid);
709
710 do_cleanups (back_to);
711 }
712
713 return 0;
714 }
715
716 /* Output a field named 'cores' with a list as the value. The
717 elements of the list are obtained by splitting 'cores' on
718 comma. */
719
720 static void
721 output_cores (struct ui_out *uiout, const char *field_name, const char *xcores)
722 {
723 struct cleanup *back_to = make_cleanup_ui_out_list_begin_end (uiout,
724 field_name);
725 char *cores = xstrdup (xcores);
726 char *p = cores;
727
728 make_cleanup (xfree, cores);
729
730 for (p = strtok (p, ","); p; p = strtok (NULL, ","))
731 uiout->field_string (NULL, p);
732
733 do_cleanups (back_to);
734 }
735
736 static void
737 free_vector_of_ints (void *xvector)
738 {
739 VEC (int) **vector = (VEC (int) **) xvector;
740
741 VEC_free (int, *vector);
742 }
743
744 static void
745 do_nothing (splay_tree_key k)
746 {
747 }
748
749 static void
750 free_vector_of_osdata_items (splay_tree_value xvalue)
751 {
752 VEC (osdata_item_s) *value = (VEC (osdata_item_s) *) xvalue;
753
754 /* We don't free the items itself, it will be done separately. */
755 VEC_free (osdata_item_s, value);
756 }
757
758 static int
759 splay_tree_int_comparator (splay_tree_key xa, splay_tree_key xb)
760 {
761 int a = xa;
762 int b = xb;
763
764 return a - b;
765 }
766
767 static void
768 free_splay_tree (void *xt)
769 {
770 splay_tree t = (splay_tree) xt;
771 splay_tree_delete (t);
772 }
773
774 static void
775 list_available_thread_groups (VEC (int) *ids, int recurse)
776 {
777 struct osdata *data;
778 struct osdata_item *item;
779 int ix_items;
780 struct ui_out *uiout = current_uiout;
781 struct cleanup *cleanup;
782
783 /* This keeps a map from integer (pid) to VEC (struct osdata_item *)*
784 The vector contains information about all threads for the given pid.
785 This is assigned an initial value to avoid "may be used uninitialized"
786 warning from gcc. */
787 splay_tree tree = NULL;
788
789 /* get_osdata will throw if it cannot return data. */
790 data = get_osdata ("processes");
791 cleanup = make_cleanup_osdata_free (data);
792
793 if (recurse)
794 {
795 struct osdata *threads = get_osdata ("threads");
796
797 make_cleanup_osdata_free (threads);
798 tree = splay_tree_new (splay_tree_int_comparator,
799 do_nothing,
800 free_vector_of_osdata_items);
801 make_cleanup (free_splay_tree, tree);
802
803 for (ix_items = 0;
804 VEC_iterate (osdata_item_s, threads->items,
805 ix_items, item);
806 ix_items++)
807 {
808 const char *pid = get_osdata_column (item, "pid");
809 int pid_i = strtoul (pid, NULL, 0);
810 VEC (osdata_item_s) *vec = 0;
811
812 splay_tree_node n = splay_tree_lookup (tree, pid_i);
813 if (!n)
814 {
815 VEC_safe_push (osdata_item_s, vec, item);
816 splay_tree_insert (tree, pid_i, (splay_tree_value)vec);
817 }
818 else
819 {
820 vec = (VEC (osdata_item_s) *) n->value;
821 VEC_safe_push (osdata_item_s, vec, item);
822 n->value = (splay_tree_value) vec;
823 }
824 }
825 }
826
827 make_cleanup_ui_out_list_begin_end (uiout, "groups");
828
829 for (ix_items = 0;
830 VEC_iterate (osdata_item_s, data->items,
831 ix_items, item);
832 ix_items++)
833 {
834 struct cleanup *back_to;
835
836 const char *pid = get_osdata_column (item, "pid");
837 const char *cmd = get_osdata_column (item, "command");
838 const char *user = get_osdata_column (item, "user");
839 const char *cores = get_osdata_column (item, "cores");
840
841 int pid_i = strtoul (pid, NULL, 0);
842
843 /* At present, the target will return all available processes
844 and if information about specific ones was required, we filter
845 undesired processes here. */
846 if (ids && bsearch (&pid_i, VEC_address (int, ids),
847 VEC_length (int, ids),
848 sizeof (int), compare_positive_ints) == NULL)
849 continue;
850
851
852 back_to = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
853
854 uiout->field_fmt ("id", "%s", pid);
855 uiout->field_string ("type", "process");
856 if (cmd)
857 uiout->field_string ("description", cmd);
858 if (user)
859 uiout->field_string ("user", user);
860 if (cores)
861 output_cores (uiout, "cores", cores);
862
863 if (recurse)
864 {
865 splay_tree_node n = splay_tree_lookup (tree, pid_i);
866 if (n)
867 {
868 VEC (osdata_item_s) *children = (VEC (osdata_item_s) *) n->value;
869 struct osdata_item *child;
870 int ix_child;
871
872 make_cleanup_ui_out_list_begin_end (uiout, "threads");
873
874 for (ix_child = 0;
875 VEC_iterate (osdata_item_s, children, ix_child, child);
876 ++ix_child)
877 {
878 struct cleanup *back_to_2 =
879 make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
880 const char *tid = get_osdata_column (child, "tid");
881 const char *tcore = get_osdata_column (child, "core");
882
883 uiout->field_string ("id", tid);
884 if (tcore)
885 uiout->field_string ("core", tcore);
886
887 do_cleanups (back_to_2);
888 }
889 }
890 }
891
892 do_cleanups (back_to);
893 }
894
895 do_cleanups (cleanup);
896 }
897
898 void
899 mi_cmd_list_thread_groups (const char *command, char **argv, int argc)
900 {
901 struct ui_out *uiout = current_uiout;
902 struct cleanup *back_to;
903 int available = 0;
904 int recurse = 0;
905 VEC (int) *ids = 0;
906
907 enum opt
908 {
909 AVAILABLE_OPT, RECURSE_OPT
910 };
911 static const struct mi_opt opts[] =
912 {
913 {"-available", AVAILABLE_OPT, 0},
914 {"-recurse", RECURSE_OPT, 1},
915 { 0, 0, 0 }
916 };
917
918 int oind = 0;
919 char *oarg;
920
921 while (1)
922 {
923 int opt = mi_getopt ("-list-thread-groups", argc, argv, opts,
924 &oind, &oarg);
925
926 if (opt < 0)
927 break;
928 switch ((enum opt) opt)
929 {
930 case AVAILABLE_OPT:
931 available = 1;
932 break;
933 case RECURSE_OPT:
934 if (strcmp (oarg, "0") == 0)
935 ;
936 else if (strcmp (oarg, "1") == 0)
937 recurse = 1;
938 else
939 error (_("only '0' and '1' are valid values "
940 "for the '--recurse' option"));
941 break;
942 }
943 }
944
945 for (; oind < argc; ++oind)
946 {
947 char *end;
948 int inf;
949
950 if (*(argv[oind]) != 'i')
951 error (_("invalid syntax of group id '%s'"), argv[oind]);
952
953 inf = strtoul (argv[oind] + 1, &end, 0);
954
955 if (*end != '\0')
956 error (_("invalid syntax of group id '%s'"), argv[oind]);
957 VEC_safe_push (int, ids, inf);
958 }
959 if (VEC_length (int, ids) > 1)
960 qsort (VEC_address (int, ids),
961 VEC_length (int, ids),
962 sizeof (int), compare_positive_ints);
963
964 back_to = make_cleanup (free_vector_of_ints, &ids);
965
966 if (available)
967 {
968 list_available_thread_groups (ids, recurse);
969 }
970 else if (VEC_length (int, ids) == 1)
971 {
972 /* Local thread groups, single id. */
973 int id = *VEC_address (int, ids);
974 struct inferior *inf = find_inferior_id (id);
975
976 if (!inf)
977 error (_("Non-existent thread group id '%d'"), id);
978
979 print_thread_info (uiout, NULL, inf->pid);
980 }
981 else
982 {
983 struct print_one_inferior_data data;
984
985 data.recurse = recurse;
986 data.inferiors = ids;
987
988 /* Local thread groups. Either no explicit ids -- and we
989 print everything, or several explicit ids. In both cases,
990 we print more than one group, and have to use 'groups'
991 as the top-level element. */
992 make_cleanup_ui_out_list_begin_end (uiout, "groups");
993 update_thread_list ();
994 iterate_over_inferiors (print_one_inferior, &data);
995 }
996
997 do_cleanups (back_to);
998 }
999
1000 void
1001 mi_cmd_data_list_register_names (const char *command, char **argv, int argc)
1002 {
1003 struct gdbarch *gdbarch;
1004 struct ui_out *uiout = current_uiout;
1005 int regnum, numregs;
1006 int i;
1007 struct cleanup *cleanup;
1008
1009 /* Note that the test for a valid register must include checking the
1010 gdbarch_register_name because gdbarch_num_regs may be allocated
1011 for the union of the register sets within a family of related
1012 processors. In this case, some entries of gdbarch_register_name
1013 will change depending upon the particular processor being
1014 debugged. */
1015
1016 gdbarch = get_current_arch ();
1017 numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
1018
1019 cleanup = make_cleanup_ui_out_list_begin_end (uiout, "register-names");
1020
1021 if (argc == 0) /* No args, just do all the regs. */
1022 {
1023 for (regnum = 0;
1024 regnum < numregs;
1025 regnum++)
1026 {
1027 if (gdbarch_register_name (gdbarch, regnum) == NULL
1028 || *(gdbarch_register_name (gdbarch, regnum)) == '\0')
1029 uiout->field_string (NULL, "");
1030 else
1031 uiout->field_string (NULL, gdbarch_register_name (gdbarch, regnum));
1032 }
1033 }
1034
1035 /* Else, list of register #s, just do listed regs. */
1036 for (i = 0; i < argc; i++)
1037 {
1038 regnum = atoi (argv[i]);
1039 if (regnum < 0 || regnum >= numregs)
1040 error (_("bad register number"));
1041
1042 if (gdbarch_register_name (gdbarch, regnum) == NULL
1043 || *(gdbarch_register_name (gdbarch, regnum)) == '\0')
1044 uiout->field_string (NULL, "");
1045 else
1046 uiout->field_string (NULL, gdbarch_register_name (gdbarch, regnum));
1047 }
1048 do_cleanups (cleanup);
1049 }
1050
1051 void
1052 mi_cmd_data_list_changed_registers (const char *command, char **argv, int argc)
1053 {
1054 static struct regcache *this_regs = NULL;
1055 struct ui_out *uiout = current_uiout;
1056 struct regcache *prev_regs;
1057 struct gdbarch *gdbarch;
1058 int regnum, numregs, changed;
1059 int i;
1060 struct cleanup *cleanup;
1061
1062 /* The last time we visited this function, the current frame's
1063 register contents were saved in THIS_REGS. Move THIS_REGS over
1064 to PREV_REGS, and refresh THIS_REGS with the now-current register
1065 contents. */
1066
1067 prev_regs = this_regs;
1068 this_regs = frame_save_as_regcache (get_selected_frame (NULL));
1069 cleanup = make_cleanup_regcache_xfree (prev_regs);
1070
1071 /* Note that the test for a valid register must include checking the
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. */
1077
1078 gdbarch = get_regcache_arch (this_regs);
1079 numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
1080
1081 make_cleanup_ui_out_list_begin_end (uiout, "changed-registers");
1082
1083 if (argc == 0)
1084 {
1085 /* No args, just do all the regs. */
1086 for (regnum = 0;
1087 regnum < numregs;
1088 regnum++)
1089 {
1090 if (gdbarch_register_name (gdbarch, regnum) == NULL
1091 || *(gdbarch_register_name (gdbarch, regnum)) == '\0')
1092 continue;
1093 changed = register_changed_p (regnum, prev_regs, this_regs);
1094 if (changed < 0)
1095 error (_("-data-list-changed-registers: "
1096 "Unable to read register contents."));
1097 else if (changed)
1098 uiout->field_int (NULL, regnum);
1099 }
1100 }
1101
1102 /* Else, list of register #s, just do listed regs. */
1103 for (i = 0; i < argc; i++)
1104 {
1105 regnum = atoi (argv[i]);
1106
1107 if (regnum >= 0
1108 && regnum < numregs
1109 && gdbarch_register_name (gdbarch, regnum) != NULL
1110 && *gdbarch_register_name (gdbarch, regnum) != '\000')
1111 {
1112 changed = register_changed_p (regnum, prev_regs, this_regs);
1113 if (changed < 0)
1114 error (_("-data-list-changed-registers: "
1115 "Unable to read register contents."));
1116 else if (changed)
1117 uiout->field_int (NULL, regnum);
1118 }
1119 else
1120 error (_("bad register number"));
1121 }
1122 do_cleanups (cleanup);
1123 }
1124
1125 static int
1126 register_changed_p (int regnum, struct regcache *prev_regs,
1127 struct regcache *this_regs)
1128 {
1129 struct gdbarch *gdbarch = get_regcache_arch (this_regs);
1130 gdb_byte prev_buffer[MAX_REGISTER_SIZE];
1131 gdb_byte this_buffer[MAX_REGISTER_SIZE];
1132 enum register_status prev_status;
1133 enum register_status this_status;
1134
1135 /* First time through or after gdbarch change consider all registers
1136 as changed. */
1137 if (!prev_regs || get_regcache_arch (prev_regs) != gdbarch)
1138 return 1;
1139
1140 /* Get register contents and compare. */
1141 prev_status = regcache_cooked_read (prev_regs, regnum, prev_buffer);
1142 this_status = regcache_cooked_read (this_regs, regnum, this_buffer);
1143
1144 if (this_status != prev_status)
1145 return 1;
1146 else if (this_status == REG_VALID)
1147 return memcmp (prev_buffer, this_buffer,
1148 register_size (gdbarch, regnum)) != 0;
1149 else
1150 return 0;
1151 }
1152
1153 /* Return a list of register number and value pairs. The valid
1154 arguments expected are: a letter indicating the format in which to
1155 display the registers contents. This can be one of: x
1156 (hexadecimal), d (decimal), N (natural), t (binary), o (octal), r
1157 (raw). After the format argument there can be a sequence of
1158 numbers, indicating which registers to fetch the content of. If
1159 the format is the only argument, a list of all the registers with
1160 their values is returned. */
1161
1162 void
1163 mi_cmd_data_list_register_values (const char *command, char **argv, int argc)
1164 {
1165 struct ui_out *uiout = current_uiout;
1166 struct frame_info *frame;
1167 struct gdbarch *gdbarch;
1168 int regnum, numregs, format;
1169 int i;
1170 struct cleanup *list_cleanup;
1171 int skip_unavailable = 0;
1172 int oind = 0;
1173 enum opt
1174 {
1175 SKIP_UNAVAILABLE,
1176 };
1177 static const struct mi_opt opts[] =
1178 {
1179 {"-skip-unavailable", SKIP_UNAVAILABLE, 0},
1180 { 0, 0, 0 }
1181 };
1182
1183 /* Note that the test for a valid register must include checking the
1184 gdbarch_register_name because gdbarch_num_regs may be allocated
1185 for the union of the register sets within a family of related
1186 processors. In this case, some entries of gdbarch_register_name
1187 will change depending upon the particular processor being
1188 debugged. */
1189
1190 while (1)
1191 {
1192 char *oarg;
1193 int opt = mi_getopt ("-data-list-register-values", argc, argv,
1194 opts, &oind, &oarg);
1195
1196 if (opt < 0)
1197 break;
1198 switch ((enum opt) opt)
1199 {
1200 case SKIP_UNAVAILABLE:
1201 skip_unavailable = 1;
1202 break;
1203 }
1204 }
1205
1206 if (argc - oind < 1)
1207 error (_("-data-list-register-values: Usage: "
1208 "-data-list-register-values [--skip-unavailable] <format>"
1209 " [<regnum1>...<regnumN>]"));
1210
1211 format = (int) argv[oind][0];
1212
1213 frame = get_selected_frame (NULL);
1214 gdbarch = get_frame_arch (frame);
1215 numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
1216
1217 list_cleanup = make_cleanup_ui_out_list_begin_end (uiout, "register-values");
1218
1219 if (argc - oind == 1)
1220 {
1221 /* No args, beside the format: do all the regs. */
1222 for (regnum = 0;
1223 regnum < numregs;
1224 regnum++)
1225 {
1226 if (gdbarch_register_name (gdbarch, regnum) == NULL
1227 || *(gdbarch_register_name (gdbarch, regnum)) == '\0')
1228 continue;
1229
1230 output_register (frame, regnum, format, skip_unavailable);
1231 }
1232 }
1233
1234 /* Else, list of register #s, just do listed regs. */
1235 for (i = 1 + oind; i < argc; i++)
1236 {
1237 regnum = atoi (argv[i]);
1238
1239 if (regnum >= 0
1240 && regnum < numregs
1241 && gdbarch_register_name (gdbarch, regnum) != NULL
1242 && *gdbarch_register_name (gdbarch, regnum) != '\000')
1243 output_register (frame, regnum, format, skip_unavailable);
1244 else
1245 error (_("bad register number"));
1246 }
1247 do_cleanups (list_cleanup);
1248 }
1249
1250 /* Output one register REGNUM's contents in the desired FORMAT. If
1251 SKIP_UNAVAILABLE is true, skip the register if it is
1252 unavailable. */
1253
1254 static void
1255 output_register (struct frame_info *frame, int regnum, int format,
1256 int skip_unavailable)
1257 {
1258 struct ui_out *uiout = current_uiout;
1259 struct value *val = value_of_register (regnum, frame);
1260 struct cleanup *tuple_cleanup;
1261 struct value_print_options opts;
1262
1263 if (skip_unavailable && !value_entirely_available (val))
1264 return;
1265
1266 tuple_cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
1267 uiout->field_int ("number", regnum);
1268
1269 if (format == 'N')
1270 format = 0;
1271
1272 if (format == 'r')
1273 format = 'z';
1274
1275 string_file stb;
1276
1277 get_formatted_print_options (&opts, format);
1278 opts.deref_ref = 1;
1279 val_print (value_type (val),
1280 value_embedded_offset (val), 0,
1281 &stb, 0, val, &opts, current_language);
1282 uiout->field_stream ("value", stb);
1283
1284 do_cleanups (tuple_cleanup);
1285 }
1286
1287 /* Write given values into registers. The registers and values are
1288 given as pairs. The corresponding MI command is
1289 -data-write-register-values <format>
1290 [<regnum1> <value1>...<regnumN> <valueN>] */
1291 void
1292 mi_cmd_data_write_register_values (const char *command, char **argv, int argc)
1293 {
1294 struct regcache *regcache;
1295 struct gdbarch *gdbarch;
1296 int numregs, i;
1297
1298 /* Note that the test for a valid register must include checking the
1299 gdbarch_register_name because gdbarch_num_regs may be allocated
1300 for the union of the register sets within a family of related
1301 processors. In this case, some entries of gdbarch_register_name
1302 will change depending upon the particular processor being
1303 debugged. */
1304
1305 regcache = get_current_regcache ();
1306 gdbarch = get_regcache_arch (regcache);
1307 numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
1308
1309 if (argc == 0)
1310 error (_("-data-write-register-values: Usage: -data-write-register-"
1311 "values <format> [<regnum1> <value1>...<regnumN> <valueN>]"));
1312
1313 if (!target_has_registers)
1314 error (_("-data-write-register-values: No registers."));
1315
1316 if (!(argc - 1))
1317 error (_("-data-write-register-values: No regs and values specified."));
1318
1319 if ((argc - 1) % 2)
1320 error (_("-data-write-register-values: "
1321 "Regs and vals are not in pairs."));
1322
1323 for (i = 1; i < argc; i = i + 2)
1324 {
1325 int regnum = atoi (argv[i]);
1326
1327 if (regnum >= 0 && regnum < numregs
1328 && gdbarch_register_name (gdbarch, regnum)
1329 && *gdbarch_register_name (gdbarch, regnum))
1330 {
1331 LONGEST value;
1332
1333 /* Get the value as a number. */
1334 value = parse_and_eval_address (argv[i + 1]);
1335
1336 /* Write it down. */
1337 regcache_cooked_write_signed (regcache, regnum, value);
1338 }
1339 else
1340 error (_("bad register number"));
1341 }
1342 }
1343
1344 /* Evaluate the value of the argument. The argument is an
1345 expression. If the expression contains spaces it needs to be
1346 included in double quotes. */
1347
1348 void
1349 mi_cmd_data_evaluate_expression (const char *command, char **argv, int argc)
1350 {
1351 struct value *val;
1352 struct value_print_options opts;
1353 struct ui_out *uiout = current_uiout;
1354
1355 if (argc != 1)
1356 error (_("-data-evaluate-expression: "
1357 "Usage: -data-evaluate-expression expression"));
1358
1359 expression_up expr = parse_expression (argv[0]);
1360
1361 val = evaluate_expression (expr.get ());
1362
1363 string_file stb;
1364
1365 /* Print the result of the expression evaluation. */
1366 get_user_print_options (&opts);
1367 opts.deref_ref = 0;
1368 common_val_print (val, &stb, 0, &opts, current_language);
1369
1370 uiout->field_stream ("value", stb);
1371 }
1372
1373 /* This is the -data-read-memory command.
1374
1375 ADDR: start address of data to be dumped.
1376 WORD-FORMAT: a char indicating format for the ``word''. See
1377 the ``x'' command.
1378 WORD-SIZE: size of each ``word''; 1,2,4, or 8 bytes.
1379 NR_ROW: Number of rows.
1380 NR_COL: The number of colums (words per row).
1381 ASCHAR: (OPTIONAL) Append an ascii character dump to each row. Use
1382 ASCHAR for unprintable characters.
1383
1384 Reads SIZE*NR_ROW*NR_COL bytes starting at ADDR from memory and
1385 displayes them. Returns:
1386
1387 {addr="...",rowN={wordN="..." ,... [,ascii="..."]}, ...}
1388
1389 Returns:
1390 The number of bytes read is SIZE*ROW*COL. */
1391
1392 void
1393 mi_cmd_data_read_memory (const char *command, char **argv, int argc)
1394 {
1395 struct gdbarch *gdbarch = get_current_arch ();
1396 struct ui_out *uiout = current_uiout;
1397 CORE_ADDR addr;
1398 long total_bytes, nr_cols, nr_rows;
1399 char word_format;
1400 struct type *word_type;
1401 long word_size;
1402 char word_asize;
1403 char aschar;
1404 int nr_bytes;
1405 long offset = 0;
1406 int oind = 0;
1407 char *oarg;
1408 enum opt
1409 {
1410 OFFSET_OPT
1411 };
1412 static const struct mi_opt opts[] =
1413 {
1414 {"o", OFFSET_OPT, 1},
1415 { 0, 0, 0 }
1416 };
1417
1418 while (1)
1419 {
1420 int opt = mi_getopt ("-data-read-memory", argc, argv, opts,
1421 &oind, &oarg);
1422
1423 if (opt < 0)
1424 break;
1425 switch ((enum opt) opt)
1426 {
1427 case OFFSET_OPT:
1428 offset = atol (oarg);
1429 break;
1430 }
1431 }
1432 argv += oind;
1433 argc -= oind;
1434
1435 if (argc < 5 || argc > 6)
1436 error (_("-data-read-memory: Usage: "
1437 "ADDR WORD-FORMAT WORD-SIZE NR-ROWS NR-COLS [ASCHAR]."));
1438
1439 /* Extract all the arguments. */
1440
1441 /* Start address of the memory dump. */
1442 addr = parse_and_eval_address (argv[0]) + offset;
1443 /* The format character to use when displaying a memory word. See
1444 the ``x'' command. */
1445 word_format = argv[1][0];
1446 /* The size of the memory word. */
1447 word_size = atol (argv[2]);
1448 switch (word_size)
1449 {
1450 case 1:
1451 word_type = builtin_type (gdbarch)->builtin_int8;
1452 word_asize = 'b';
1453 break;
1454 case 2:
1455 word_type = builtin_type (gdbarch)->builtin_int16;
1456 word_asize = 'h';
1457 break;
1458 case 4:
1459 word_type = builtin_type (gdbarch)->builtin_int32;
1460 word_asize = 'w';
1461 break;
1462 case 8:
1463 word_type = builtin_type (gdbarch)->builtin_int64;
1464 word_asize = 'g';
1465 break;
1466 default:
1467 word_type = builtin_type (gdbarch)->builtin_int8;
1468 word_asize = 'b';
1469 }
1470 /* The number of rows. */
1471 nr_rows = atol (argv[3]);
1472 if (nr_rows <= 0)
1473 error (_("-data-read-memory: invalid number of rows."));
1474
1475 /* Number of bytes per row. */
1476 nr_cols = atol (argv[4]);
1477 if (nr_cols <= 0)
1478 error (_("-data-read-memory: invalid number of columns."));
1479
1480 /* The un-printable character when printing ascii. */
1481 if (argc == 6)
1482 aschar = *argv[5];
1483 else
1484 aschar = 0;
1485
1486 /* Create a buffer and read it in. */
1487 total_bytes = word_size * nr_rows * nr_cols;
1488
1489 std::unique_ptr<gdb_byte[]> mbuf (new gdb_byte[total_bytes]);
1490
1491 /* Dispatch memory reads to the topmost target, not the flattened
1492 current_target. */
1493 nr_bytes = target_read (current_target.beneath,
1494 TARGET_OBJECT_MEMORY, NULL, mbuf.get (),
1495 addr, total_bytes);
1496 if (nr_bytes <= 0)
1497 error (_("Unable to read memory."));
1498
1499 /* Output the header information. */
1500 uiout->field_core_addr ("addr", gdbarch, addr);
1501 uiout->field_int ("nr-bytes", nr_bytes);
1502 uiout->field_int ("total-bytes", total_bytes);
1503 uiout->field_core_addr ("next-row", gdbarch, addr + word_size * nr_cols);
1504 uiout->field_core_addr ("prev-row", gdbarch, addr - word_size * nr_cols);
1505 uiout->field_core_addr ("next-page", gdbarch, addr + total_bytes);
1506 uiout->field_core_addr ("prev-page", gdbarch, addr - total_bytes);
1507
1508 /* Build the result as a two dimentional table. */
1509 {
1510 int row;
1511 int row_byte;
1512 struct cleanup *cleanup_list;
1513
1514 string_file stream;
1515
1516 cleanup_list = make_cleanup_ui_out_list_begin_end (uiout, "memory");
1517 for (row = 0, row_byte = 0;
1518 row < nr_rows;
1519 row++, row_byte += nr_cols * word_size)
1520 {
1521 int col;
1522 int col_byte;
1523 struct cleanup *cleanup_tuple;
1524 struct cleanup *cleanup_list_data;
1525 struct value_print_options opts;
1526
1527 cleanup_tuple = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
1528 uiout->field_core_addr ("addr", gdbarch, addr + row_byte);
1529 /* ui_out_field_core_addr_symbolic (uiout, "saddr", addr +
1530 row_byte); */
1531 cleanup_list_data = make_cleanup_ui_out_list_begin_end (uiout, "data");
1532 get_formatted_print_options (&opts, word_format);
1533 for (col = 0, col_byte = row_byte;
1534 col < nr_cols;
1535 col++, col_byte += word_size)
1536 {
1537 if (col_byte + word_size > nr_bytes)
1538 {
1539 uiout->field_string (NULL, "N/A");
1540 }
1541 else
1542 {
1543 stream.clear ();
1544 print_scalar_formatted (&mbuf[col_byte], word_type, &opts,
1545 word_asize, &stream);
1546 uiout->field_stream (NULL, stream);
1547 }
1548 }
1549 do_cleanups (cleanup_list_data);
1550 if (aschar)
1551 {
1552 int byte;
1553
1554 stream.clear ();
1555 for (byte = row_byte;
1556 byte < row_byte + word_size * nr_cols; byte++)
1557 {
1558 if (byte >= nr_bytes)
1559 stream.putc ('X');
1560 else if (mbuf[byte] < 32 || mbuf[byte] > 126)
1561 stream.putc (aschar);
1562 else
1563 stream.putc (mbuf[byte]);
1564 }
1565 uiout->field_stream ("ascii", stream);
1566 }
1567 do_cleanups (cleanup_tuple);
1568 }
1569 do_cleanups (cleanup_list);
1570 }
1571 }
1572
1573 void
1574 mi_cmd_data_read_memory_bytes (const char *command, char **argv, int argc)
1575 {
1576 struct gdbarch *gdbarch = get_current_arch ();
1577 struct ui_out *uiout = current_uiout;
1578 struct cleanup *cleanups;
1579 CORE_ADDR addr;
1580 LONGEST length;
1581 memory_read_result_s *read_result;
1582 int ix;
1583 VEC(memory_read_result_s) *result;
1584 long offset = 0;
1585 int unit_size = gdbarch_addressable_memory_unit_size (gdbarch);
1586 int oind = 0;
1587 char *oarg;
1588 enum opt
1589 {
1590 OFFSET_OPT
1591 };
1592 static const struct mi_opt opts[] =
1593 {
1594 {"o", OFFSET_OPT, 1},
1595 { 0, 0, 0 }
1596 };
1597
1598 while (1)
1599 {
1600 int opt = mi_getopt ("-data-read-memory-bytes", argc, argv, opts,
1601 &oind, &oarg);
1602 if (opt < 0)
1603 break;
1604 switch ((enum opt) opt)
1605 {
1606 case OFFSET_OPT:
1607 offset = atol (oarg);
1608 break;
1609 }
1610 }
1611 argv += oind;
1612 argc -= oind;
1613
1614 if (argc != 2)
1615 error (_("Usage: [ -o OFFSET ] ADDR LENGTH."));
1616
1617 addr = parse_and_eval_address (argv[0]) + offset;
1618 length = atol (argv[1]);
1619
1620 result = read_memory_robust (current_target.beneath, addr, length);
1621
1622 cleanups = make_cleanup (free_memory_read_result_vector, &result);
1623
1624 if (VEC_length (memory_read_result_s, result) == 0)
1625 error (_("Unable to read memory."));
1626
1627 make_cleanup_ui_out_list_begin_end (uiout, "memory");
1628 for (ix = 0;
1629 VEC_iterate (memory_read_result_s, result, ix, read_result);
1630 ++ix)
1631 {
1632 struct cleanup *t = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
1633 char *data, *p;
1634 int i;
1635 int alloc_len;
1636
1637 uiout->field_core_addr ("begin", gdbarch, read_result->begin);
1638 uiout->field_core_addr ("offset", gdbarch, read_result->begin - addr);
1639 uiout->field_core_addr ("end", gdbarch, read_result->end);
1640
1641 alloc_len = (read_result->end - read_result->begin) * 2 * unit_size + 1;
1642 data = (char *) xmalloc (alloc_len);
1643
1644 for (i = 0, p = data;
1645 i < ((read_result->end - read_result->begin) * unit_size);
1646 ++i, p += 2)
1647 {
1648 sprintf (p, "%02x", read_result->data[i]);
1649 }
1650 uiout->field_string ("contents", data);
1651 xfree (data);
1652 do_cleanups (t);
1653 }
1654 do_cleanups (cleanups);
1655 }
1656
1657 /* Implementation of the -data-write_memory command.
1658
1659 COLUMN_OFFSET: optional argument. Must be preceded by '-o'. The
1660 offset from the beginning of the memory grid row where the cell to
1661 be written is.
1662 ADDR: start address of the row in the memory grid where the memory
1663 cell is, if OFFSET_COLUMN is specified. Otherwise, the address of
1664 the location to write to.
1665 FORMAT: a char indicating format for the ``word''. See
1666 the ``x'' command.
1667 WORD_SIZE: size of each ``word''; 1,2,4, or 8 bytes
1668 VALUE: value to be written into the memory address.
1669
1670 Writes VALUE into ADDR + (COLUMN_OFFSET * WORD_SIZE).
1671
1672 Prints nothing. */
1673
1674 void
1675 mi_cmd_data_write_memory (const char *command, char **argv, int argc)
1676 {
1677 struct gdbarch *gdbarch = get_current_arch ();
1678 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1679 CORE_ADDR addr;
1680 long word_size;
1681 /* FIXME: ezannoni 2000-02-17 LONGEST could possibly not be big
1682 enough when using a compiler other than GCC. */
1683 LONGEST value;
1684 gdb_byte *buffer;
1685 struct cleanup *old_chain;
1686 long offset = 0;
1687 int oind = 0;
1688 char *oarg;
1689 enum opt
1690 {
1691 OFFSET_OPT
1692 };
1693 static const struct mi_opt opts[] =
1694 {
1695 {"o", OFFSET_OPT, 1},
1696 { 0, 0, 0 }
1697 };
1698
1699 while (1)
1700 {
1701 int opt = mi_getopt ("-data-write-memory", argc, argv, opts,
1702 &oind, &oarg);
1703
1704 if (opt < 0)
1705 break;
1706 switch ((enum opt) opt)
1707 {
1708 case OFFSET_OPT:
1709 offset = atol (oarg);
1710 break;
1711 }
1712 }
1713 argv += oind;
1714 argc -= oind;
1715
1716 if (argc != 4)
1717 error (_("-data-write-memory: Usage: "
1718 "[-o COLUMN_OFFSET] ADDR FORMAT WORD-SIZE VALUE."));
1719
1720 /* Extract all the arguments. */
1721 /* Start address of the memory dump. */
1722 addr = parse_and_eval_address (argv[0]);
1723 /* The size of the memory word. */
1724 word_size = atol (argv[2]);
1725
1726 /* Calculate the real address of the write destination. */
1727 addr += (offset * word_size);
1728
1729 /* Get the value as a number. */
1730 value = parse_and_eval_address (argv[3]);
1731 /* Get the value into an array. */
1732 buffer = (gdb_byte *) xmalloc (word_size);
1733 old_chain = make_cleanup (xfree, buffer);
1734 store_signed_integer (buffer, word_size, byte_order, value);
1735 /* Write it down to memory. */
1736 write_memory_with_notification (addr, buffer, word_size);
1737 /* Free the buffer. */
1738 do_cleanups (old_chain);
1739 }
1740
1741 /* Implementation of the -data-write-memory-bytes command.
1742
1743 ADDR: start address
1744 DATA: string of bytes to write at that address
1745 COUNT: number of bytes to be filled (decimal integer). */
1746
1747 void
1748 mi_cmd_data_write_memory_bytes (const char *command, char **argv, int argc)
1749 {
1750 CORE_ADDR addr;
1751 char *cdata;
1752 gdb_byte *data;
1753 gdb_byte *databuf;
1754 size_t len_hex, len_bytes, len_units, i, steps, remaining_units;
1755 long int count_units;
1756 struct cleanup *back_to;
1757 int unit_size;
1758
1759 if (argc != 2 && argc != 3)
1760 error (_("Usage: ADDR DATA [COUNT]."));
1761
1762 addr = parse_and_eval_address (argv[0]);
1763 cdata = argv[1];
1764 len_hex = strlen (cdata);
1765 unit_size = gdbarch_addressable_memory_unit_size (get_current_arch ());
1766
1767 if (len_hex % (unit_size * 2) != 0)
1768 error (_("Hex-encoded '%s' must represent an integral number of "
1769 "addressable memory units."),
1770 cdata);
1771
1772 len_bytes = len_hex / 2;
1773 len_units = len_bytes / unit_size;
1774
1775 if (argc == 3)
1776 count_units = strtoul (argv[2], NULL, 10);
1777 else
1778 count_units = len_units;
1779
1780 databuf = XNEWVEC (gdb_byte, len_bytes);
1781 back_to = make_cleanup (xfree, databuf);
1782
1783 for (i = 0; i < len_bytes; ++i)
1784 {
1785 int x;
1786 if (sscanf (cdata + i * 2, "%02x", &x) != 1)
1787 error (_("Invalid argument"));
1788 databuf[i] = (gdb_byte) x;
1789 }
1790
1791 if (len_units < count_units)
1792 {
1793 /* Pattern is made of less units than count:
1794 repeat pattern to fill memory. */
1795 data = (gdb_byte *) xmalloc (count_units * unit_size);
1796 make_cleanup (xfree, data);
1797
1798 /* Number of times the pattern is entirely repeated. */
1799 steps = count_units / len_units;
1800 /* Number of remaining addressable memory units. */
1801 remaining_units = count_units % len_units;
1802 for (i = 0; i < steps; i++)
1803 memcpy (data + i * len_bytes, databuf, len_bytes);
1804
1805 if (remaining_units > 0)
1806 memcpy (data + steps * len_bytes, databuf,
1807 remaining_units * unit_size);
1808 }
1809 else
1810 {
1811 /* Pattern is longer than or equal to count:
1812 just copy count addressable memory units. */
1813 data = databuf;
1814 }
1815
1816 write_memory_with_notification (addr, data, count_units);
1817
1818 do_cleanups (back_to);
1819 }
1820
1821 void
1822 mi_cmd_enable_timings (const char *command, char **argv, int argc)
1823 {
1824 if (argc == 0)
1825 do_timings = 1;
1826 else if (argc == 1)
1827 {
1828 if (strcmp (argv[0], "yes") == 0)
1829 do_timings = 1;
1830 else if (strcmp (argv[0], "no") == 0)
1831 do_timings = 0;
1832 else
1833 goto usage_error;
1834 }
1835 else
1836 goto usage_error;
1837
1838 return;
1839
1840 usage_error:
1841 error (_("-enable-timings: Usage: %s {yes|no}"), command);
1842 }
1843
1844 void
1845 mi_cmd_list_features (const char *command, char **argv, int argc)
1846 {
1847 if (argc == 0)
1848 {
1849 struct cleanup *cleanup = NULL;
1850 struct ui_out *uiout = current_uiout;
1851
1852 cleanup = make_cleanup_ui_out_list_begin_end (uiout, "features");
1853 uiout->field_string (NULL, "frozen-varobjs");
1854 uiout->field_string (NULL, "pending-breakpoints");
1855 uiout->field_string (NULL, "thread-info");
1856 uiout->field_string (NULL, "data-read-memory-bytes");
1857 uiout->field_string (NULL, "breakpoint-notifications");
1858 uiout->field_string (NULL, "ada-task-info");
1859 uiout->field_string (NULL, "language-option");
1860 uiout->field_string (NULL, "info-gdb-mi-command");
1861 uiout->field_string (NULL, "undefined-command-error-code");
1862 uiout->field_string (NULL, "exec-run-start-option");
1863
1864 if (ext_lang_initialized_p (get_ext_lang_defn (EXT_LANG_PYTHON)))
1865 uiout->field_string (NULL, "python");
1866
1867 do_cleanups (cleanup);
1868 return;
1869 }
1870
1871 error (_("-list-features should be passed no arguments"));
1872 }
1873
1874 void
1875 mi_cmd_list_target_features (const char *command, char **argv, int argc)
1876 {
1877 if (argc == 0)
1878 {
1879 struct cleanup *cleanup = NULL;
1880 struct ui_out *uiout = current_uiout;
1881
1882 cleanup = make_cleanup_ui_out_list_begin_end (uiout, "features");
1883 if (mi_async_p ())
1884 uiout->field_string (NULL, "async");
1885 if (target_can_execute_reverse)
1886 uiout->field_string (NULL, "reverse");
1887 do_cleanups (cleanup);
1888 return;
1889 }
1890
1891 error (_("-list-target-features should be passed no arguments"));
1892 }
1893
1894 void
1895 mi_cmd_add_inferior (const char *command, char **argv, int argc)
1896 {
1897 struct inferior *inf;
1898
1899 if (argc != 0)
1900 error (_("-add-inferior should be passed no arguments"));
1901
1902 inf = add_inferior_with_spaces ();
1903
1904 current_uiout->field_fmt ("inferior", "i%d", inf->num);
1905 }
1906
1907 /* Callback used to find the first inferior other than the current
1908 one. */
1909
1910 static int
1911 get_other_inferior (struct inferior *inf, void *arg)
1912 {
1913 if (inf == current_inferior ())
1914 return 0;
1915
1916 return 1;
1917 }
1918
1919 void
1920 mi_cmd_remove_inferior (const char *command, char **argv, int argc)
1921 {
1922 int id;
1923 struct inferior *inf;
1924
1925 if (argc != 1)
1926 error (_("-remove-inferior should be passed a single argument"));
1927
1928 if (sscanf (argv[0], "i%d", &id) != 1)
1929 error (_("the thread group id is syntactically invalid"));
1930
1931 inf = find_inferior_id (id);
1932 if (!inf)
1933 error (_("the specified thread group does not exist"));
1934
1935 if (inf->pid != 0)
1936 error (_("cannot remove an active inferior"));
1937
1938 if (inf == current_inferior ())
1939 {
1940 struct thread_info *tp = 0;
1941 struct inferior *new_inferior
1942 = iterate_over_inferiors (get_other_inferior, NULL);
1943
1944 if (new_inferior == NULL)
1945 error (_("Cannot remove last inferior"));
1946
1947 set_current_inferior (new_inferior);
1948 if (new_inferior->pid != 0)
1949 tp = any_thread_of_process (new_inferior->pid);
1950 switch_to_thread (tp ? tp->ptid : null_ptid);
1951 set_current_program_space (new_inferior->pspace);
1952 }
1953
1954 delete_inferior (inf);
1955 }
1956
1957 \f
1958
1959 /* Execute a command within a safe environment.
1960 Return <0 for error; >=0 for ok.
1961
1962 args->action will tell mi_execute_command what action
1963 to perfrom after the given command has executed (display/suppress
1964 prompt, display error). */
1965
1966 static void
1967 captured_mi_execute_command (struct ui_out *uiout, struct mi_parse *context)
1968 {
1969 struct mi_interp *mi = (struct mi_interp *) command_interp ();
1970 struct cleanup *cleanup;
1971
1972 if (do_timings)
1973 current_command_ts = context->cmd_start;
1974
1975 current_token = xstrdup (context->token);
1976 cleanup = make_cleanup (free_current_contents, &current_token);
1977
1978 running_result_record_printed = 0;
1979 mi_proceeded = 0;
1980 switch (context->op)
1981 {
1982 case MI_COMMAND:
1983 /* A MI command was read from the input stream. */
1984 if (mi_debug_p)
1985 /* FIXME: gdb_???? */
1986 fprintf_unfiltered (mi->raw_stdout,
1987 " token=`%s' command=`%s' args=`%s'\n",
1988 context->token, context->command, context->args);
1989
1990 mi_cmd_execute (context);
1991
1992 /* Print the result if there were no errors.
1993
1994 Remember that on the way out of executing a command, you have
1995 to directly use the mi_interp's uiout, since the command
1996 could have reset the interpreter, in which case the current
1997 uiout will most likely crash in the mi_out_* routines. */
1998 if (!running_result_record_printed)
1999 {
2000 fputs_unfiltered (context->token, mi->raw_stdout);
2001 /* There's no particularly good reason why target-connect results
2002 in not ^done. Should kill ^connected for MI3. */
2003 fputs_unfiltered (strcmp (context->command, "target-select") == 0
2004 ? "^connected" : "^done", mi->raw_stdout);
2005 mi_out_put (uiout, mi->raw_stdout);
2006 mi_out_rewind (uiout);
2007 mi_print_timing_maybe (mi->raw_stdout);
2008 fputs_unfiltered ("\n", mi->raw_stdout);
2009 }
2010 else
2011 /* The command does not want anything to be printed. In that
2012 case, the command probably should not have written anything
2013 to uiout, but in case it has written something, discard it. */
2014 mi_out_rewind (uiout);
2015 break;
2016
2017 case CLI_COMMAND:
2018 {
2019 char *argv[2];
2020
2021 /* A CLI command was read from the input stream. */
2022 /* This "feature" will be removed as soon as we have a
2023 complete set of mi commands. */
2024 /* Echo the command on the console. */
2025 fprintf_unfiltered (gdb_stdlog, "%s\n", context->command);
2026 /* Call the "console" interpreter. */
2027 argv[0] = (char *) INTERP_CONSOLE;
2028 argv[1] = context->command;
2029 mi_cmd_interpreter_exec ("-interpreter-exec", argv, 2);
2030
2031 /* If we changed interpreters, DON'T print out anything. */
2032 if (current_interp_named_p (INTERP_MI)
2033 || current_interp_named_p (INTERP_MI1)
2034 || current_interp_named_p (INTERP_MI2)
2035 || current_interp_named_p (INTERP_MI3))
2036 {
2037 if (!running_result_record_printed)
2038 {
2039 fputs_unfiltered (context->token, mi->raw_stdout);
2040 fputs_unfiltered ("^done", mi->raw_stdout);
2041 mi_out_put (uiout, mi->raw_stdout);
2042 mi_out_rewind (uiout);
2043 mi_print_timing_maybe (mi->raw_stdout);
2044 fputs_unfiltered ("\n", mi->raw_stdout);
2045 }
2046 else
2047 mi_out_rewind (uiout);
2048 }
2049 break;
2050 }
2051 }
2052
2053 do_cleanups (cleanup);
2054 }
2055
2056 /* Print a gdb exception to the MI output stream. */
2057
2058 static void
2059 mi_print_exception (const char *token, struct gdb_exception exception)
2060 {
2061 struct mi_interp *mi = (struct mi_interp *) current_interpreter ();
2062
2063 fputs_unfiltered (token, mi->raw_stdout);
2064 fputs_unfiltered ("^error,msg=\"", mi->raw_stdout);
2065 if (exception.message == NULL)
2066 fputs_unfiltered ("unknown error", mi->raw_stdout);
2067 else
2068 fputstr_unfiltered (exception.message, '"', mi->raw_stdout);
2069 fputs_unfiltered ("\"", mi->raw_stdout);
2070
2071 switch (exception.error)
2072 {
2073 case UNDEFINED_COMMAND_ERROR:
2074 fputs_unfiltered (",code=\"undefined-command\"", mi->raw_stdout);
2075 break;
2076 }
2077
2078 fputs_unfiltered ("\n", mi->raw_stdout);
2079 }
2080
2081 /* Determine whether the parsed command already notifies the
2082 user_selected_context_changed observer. */
2083
2084 static int
2085 command_notifies_uscc_observer (struct mi_parse *command)
2086 {
2087 if (command->op == CLI_COMMAND)
2088 {
2089 /* CLI commands "thread" and "inferior" already send it. */
2090 return (strncmp (command->command, "thread ", 7) == 0
2091 || strncmp (command->command, "inferior ", 9) == 0);
2092 }
2093 else /* MI_COMMAND */
2094 {
2095 if (strcmp (command->command, "interpreter-exec") == 0
2096 && command->argc > 1)
2097 {
2098 /* "thread" and "inferior" again, but through -interpreter-exec. */
2099 return (strncmp (command->argv[1], "thread ", 7) == 0
2100 || strncmp (command->argv[1], "inferior ", 9) == 0);
2101 }
2102
2103 else
2104 /* -thread-select already sends it. */
2105 return strcmp (command->command, "thread-select") == 0;
2106 }
2107 }
2108
2109 void
2110 mi_execute_command (const char *cmd, int from_tty)
2111 {
2112 char *token;
2113 std::unique_ptr<struct mi_parse> command;
2114
2115 /* This is to handle EOF (^D). We just quit gdb. */
2116 /* FIXME: we should call some API function here. */
2117 if (cmd == 0)
2118 quit_force (NULL, from_tty);
2119
2120 target_log_command (cmd);
2121
2122 TRY
2123 {
2124 command = mi_parse (cmd, &token);
2125 }
2126 CATCH (exception, RETURN_MASK_ALL)
2127 {
2128 mi_print_exception (token, exception);
2129 xfree (token);
2130 }
2131 END_CATCH
2132
2133 if (command != NULL)
2134 {
2135 ptid_t previous_ptid = inferior_ptid;
2136
2137 gdb::optional<scoped_restore_tmpl<int>> restore_suppress;
2138
2139 if (command->cmd != NULL && command->cmd->suppress_notification != NULL)
2140 restore_suppress.emplace (command->cmd->suppress_notification, 1);
2141
2142 command->token = token;
2143
2144 if (do_timings)
2145 {
2146 command->cmd_start = new mi_timestamp ();
2147 timestamp (command->cmd_start);
2148 }
2149
2150 TRY
2151 {
2152 captured_mi_execute_command (current_uiout, command.get ());
2153 }
2154 CATCH (result, RETURN_MASK_ALL)
2155 {
2156 /* Like in start_event_loop, enable input and force display
2157 of the prompt. Otherwise, any command that calls
2158 async_disable_stdin, and then throws, will leave input
2159 disabled. */
2160 async_enable_stdin ();
2161 current_ui->prompt_state = PROMPT_NEEDED;
2162
2163 /* The command execution failed and error() was called
2164 somewhere. */
2165 mi_print_exception (command->token, result);
2166 mi_out_rewind (current_uiout);
2167 }
2168 END_CATCH
2169
2170 bpstat_do_actions ();
2171
2172 if (/* The notifications are only output when the top-level
2173 interpreter (specified on the command line) is MI. */
2174 interp_ui_out (top_level_interpreter ())->is_mi_like_p ()
2175 /* Don't try report anything if there are no threads --
2176 the program is dead. */
2177 && thread_count () != 0
2178 /* If the command already reports the thread change, no need to do it
2179 again. */
2180 && !command_notifies_uscc_observer (command.get ()))
2181 {
2182 struct mi_interp *mi = (struct mi_interp *) top_level_interpreter ();
2183 int report_change = 0;
2184
2185 if (command->thread == -1)
2186 {
2187 report_change = (!ptid_equal (previous_ptid, null_ptid)
2188 && !ptid_equal (inferior_ptid, previous_ptid)
2189 && !ptid_equal (inferior_ptid, null_ptid));
2190 }
2191 else if (!ptid_equal (inferior_ptid, null_ptid))
2192 {
2193 struct thread_info *ti = inferior_thread ();
2194
2195 report_change = (ti->global_num != command->thread);
2196 }
2197
2198 if (report_change)
2199 {
2200 observer_notify_user_selected_context_changed
2201 (USER_SELECTED_THREAD | USER_SELECTED_FRAME);
2202 }
2203 }
2204 }
2205 }
2206
2207 static void
2208 mi_cmd_execute (struct mi_parse *parse)
2209 {
2210 struct cleanup *cleanup;
2211
2212 cleanup = prepare_execute_command ();
2213
2214 if (parse->all && parse->thread_group != -1)
2215 error (_("Cannot specify --thread-group together with --all"));
2216
2217 if (parse->all && parse->thread != -1)
2218 error (_("Cannot specify --thread together with --all"));
2219
2220 if (parse->thread_group != -1 && parse->thread != -1)
2221 error (_("Cannot specify --thread together with --thread-group"));
2222
2223 if (parse->frame != -1 && parse->thread == -1)
2224 error (_("Cannot specify --frame without --thread"));
2225
2226 if (parse->thread_group != -1)
2227 {
2228 struct inferior *inf = find_inferior_id (parse->thread_group);
2229 struct thread_info *tp = 0;
2230
2231 if (!inf)
2232 error (_("Invalid thread group for the --thread-group option"));
2233
2234 set_current_inferior (inf);
2235 /* This behaviour means that if --thread-group option identifies
2236 an inferior with multiple threads, then a random one will be
2237 picked. This is not a problem -- frontend should always
2238 provide --thread if it wishes to operate on a specific
2239 thread. */
2240 if (inf->pid != 0)
2241 tp = any_live_thread_of_process (inf->pid);
2242 switch_to_thread (tp ? tp->ptid : null_ptid);
2243 set_current_program_space (inf->pspace);
2244 }
2245
2246 if (parse->thread != -1)
2247 {
2248 struct thread_info *tp = find_thread_global_id (parse->thread);
2249
2250 if (!tp)
2251 error (_("Invalid thread id: %d"), parse->thread);
2252
2253 if (is_exited (tp->ptid))
2254 error (_("Thread id: %d has terminated"), parse->thread);
2255
2256 switch_to_thread (tp->ptid);
2257 }
2258
2259 if (parse->frame != -1)
2260 {
2261 struct frame_info *fid;
2262 int frame = parse->frame;
2263
2264 fid = find_relative_frame (get_current_frame (), &frame);
2265 if (frame == 0)
2266 /* find_relative_frame was successful */
2267 select_frame (fid);
2268 else
2269 error (_("Invalid frame id: %d"), frame);
2270 }
2271
2272 if (parse->language != language_unknown)
2273 {
2274 make_cleanup_restore_current_language ();
2275 set_language (parse->language);
2276 }
2277
2278 current_context = parse;
2279
2280 if (parse->cmd->argv_func != NULL)
2281 {
2282 parse->cmd->argv_func (parse->command, parse->argv, parse->argc);
2283 }
2284 else if (parse->cmd->cli.cmd != 0)
2285 {
2286 /* FIXME: DELETE THIS. */
2287 /* The operation is still implemented by a cli command. */
2288 /* Must be a synchronous one. */
2289 mi_execute_cli_command (parse->cmd->cli.cmd, parse->cmd->cli.args_p,
2290 parse->args);
2291 }
2292 else
2293 {
2294 /* FIXME: DELETE THIS. */
2295 string_file stb;
2296
2297 stb.puts ("Undefined mi command: ");
2298 stb.putstr (parse->command, '"');
2299 stb.puts (" (missing implementation)");
2300
2301 error_stream (stb);
2302 }
2303 do_cleanups (cleanup);
2304 }
2305
2306 /* FIXME: This is just a hack so we can get some extra commands going.
2307 We don't want to channel things through the CLI, but call libgdb directly.
2308 Use only for synchronous commands. */
2309
2310 void
2311 mi_execute_cli_command (const char *cmd, int args_p, const char *args)
2312 {
2313 if (cmd != 0)
2314 {
2315 struct cleanup *old_cleanups;
2316 char *run;
2317
2318 if (args_p)
2319 run = xstrprintf ("%s %s", cmd, args);
2320 else
2321 run = xstrdup (cmd);
2322 if (mi_debug_p)
2323 /* FIXME: gdb_???? */
2324 fprintf_unfiltered (gdb_stdout, "cli=%s run=%s\n",
2325 cmd, run);
2326 old_cleanups = make_cleanup (xfree, run);
2327 execute_command (run, 0 /* from_tty */ );
2328 do_cleanups (old_cleanups);
2329 return;
2330 }
2331 }
2332
2333 void
2334 mi_execute_async_cli_command (const char *cli_command, char **argv, int argc)
2335 {
2336 struct cleanup *old_cleanups;
2337 char *run;
2338
2339 if (mi_async_p ())
2340 run = xstrprintf ("%s %s&", cli_command, argc ? *argv : "");
2341 else
2342 run = xstrprintf ("%s %s", cli_command, argc ? *argv : "");
2343 old_cleanups = make_cleanup (xfree, run);
2344
2345 execute_command (run, 0 /* from_tty */ );
2346
2347 /* Do this before doing any printing. It would appear that some
2348 print code leaves garbage around in the buffer. */
2349 do_cleanups (old_cleanups);
2350 }
2351
2352 void
2353 mi_load_progress (const char *section_name,
2354 unsigned long sent_so_far,
2355 unsigned long total_section,
2356 unsigned long total_sent,
2357 unsigned long grand_total)
2358 {
2359 using namespace std::chrono;
2360 static steady_clock::time_point last_update;
2361 static char *previous_sect_name = NULL;
2362 int new_section;
2363 struct ui_out *saved_uiout;
2364 struct ui_out *uiout;
2365 struct mi_interp *mi = (struct mi_interp *) current_interpreter ();
2366
2367 /* This function is called through deprecated_show_load_progress
2368 which means uiout may not be correct. Fix it for the duration
2369 of this function. */
2370 saved_uiout = current_uiout;
2371
2372 if (current_interp_named_p (INTERP_MI)
2373 || current_interp_named_p (INTERP_MI2))
2374 current_uiout = mi_out_new (2);
2375 else if (current_interp_named_p (INTERP_MI1))
2376 current_uiout = mi_out_new (1);
2377 else if (current_interp_named_p (INTERP_MI3))
2378 current_uiout = mi_out_new (3);
2379 else
2380 return;
2381
2382 uiout = current_uiout;
2383
2384 new_section = (previous_sect_name ?
2385 strcmp (previous_sect_name, section_name) : 1);
2386 if (new_section)
2387 {
2388 struct cleanup *cleanup_tuple;
2389
2390 xfree (previous_sect_name);
2391 previous_sect_name = xstrdup (section_name);
2392
2393 if (current_token)
2394 fputs_unfiltered (current_token, mi->raw_stdout);
2395 fputs_unfiltered ("+download", mi->raw_stdout);
2396 cleanup_tuple = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
2397 uiout->field_string ("section", section_name);
2398 uiout->field_int ("section-size", total_section);
2399 uiout->field_int ("total-size", grand_total);
2400 do_cleanups (cleanup_tuple);
2401 mi_out_put (uiout, mi->raw_stdout);
2402 fputs_unfiltered ("\n", mi->raw_stdout);
2403 gdb_flush (mi->raw_stdout);
2404 }
2405
2406 steady_clock::time_point time_now = steady_clock::now ();
2407 if (time_now - last_update > milliseconds (500))
2408 {
2409 struct cleanup *cleanup_tuple;
2410
2411 last_update = time_now;
2412 if (current_token)
2413 fputs_unfiltered (current_token, mi->raw_stdout);
2414 fputs_unfiltered ("+download", mi->raw_stdout);
2415 cleanup_tuple = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
2416 uiout->field_string ("section", section_name);
2417 uiout->field_int ("section-sent", sent_so_far);
2418 uiout->field_int ("section-size", total_section);
2419 uiout->field_int ("total-sent", total_sent);
2420 uiout->field_int ("total-size", grand_total);
2421 do_cleanups (cleanup_tuple);
2422 mi_out_put (uiout, mi->raw_stdout);
2423 fputs_unfiltered ("\n", mi->raw_stdout);
2424 gdb_flush (mi->raw_stdout);
2425 }
2426
2427 xfree (uiout);
2428 current_uiout = saved_uiout;
2429 }
2430
2431 static void
2432 timestamp (struct mi_timestamp *tv)
2433 {
2434 using namespace std::chrono;
2435
2436 tv->wallclock = steady_clock::now ();
2437 run_time_clock::now (tv->utime, tv->stime);
2438 }
2439
2440 static void
2441 print_diff_now (struct ui_file *file, struct mi_timestamp *start)
2442 {
2443 struct mi_timestamp now;
2444
2445 timestamp (&now);
2446 print_diff (file, start, &now);
2447 }
2448
2449 void
2450 mi_print_timing_maybe (struct ui_file *file)
2451 {
2452 /* If the command is -enable-timing then do_timings may be true
2453 whilst current_command_ts is not initialized. */
2454 if (do_timings && current_command_ts)
2455 print_diff_now (file, current_command_ts);
2456 }
2457
2458 static void
2459 print_diff (struct ui_file *file, struct mi_timestamp *start,
2460 struct mi_timestamp *end)
2461 {
2462 using namespace std::chrono;
2463
2464 duration<double> wallclock = end->wallclock - start->wallclock;
2465 duration<double> utime = end->utime - start->utime;
2466 duration<double> stime = end->stime - start->stime;
2467
2468 fprintf_unfiltered
2469 (file,
2470 ",time={wallclock=\"%0.5f\",user=\"%0.5f\",system=\"%0.5f\"}",
2471 wallclock.count (), utime.count (), stime.count ());
2472 }
2473
2474 void
2475 mi_cmd_trace_define_variable (const char *command, char **argv, int argc)
2476 {
2477 LONGEST initval = 0;
2478 struct trace_state_variable *tsv;
2479 char *name = 0;
2480
2481 if (argc != 1 && argc != 2)
2482 error (_("Usage: -trace-define-variable VARIABLE [VALUE]"));
2483
2484 name = argv[0];
2485 if (*name++ != '$')
2486 error (_("Name of trace variable should start with '$'"));
2487
2488 validate_trace_state_variable_name (name);
2489
2490 tsv = find_trace_state_variable (name);
2491 if (!tsv)
2492 tsv = create_trace_state_variable (name);
2493
2494 if (argc == 2)
2495 initval = value_as_long (parse_and_eval (argv[1]));
2496
2497 tsv->initial_value = initval;
2498 }
2499
2500 void
2501 mi_cmd_trace_list_variables (const char *command, char **argv, int argc)
2502 {
2503 if (argc != 0)
2504 error (_("-trace-list-variables: no arguments allowed"));
2505
2506 tvariables_info_1 ();
2507 }
2508
2509 void
2510 mi_cmd_trace_find (const char *command, char **argv, int argc)
2511 {
2512 char *mode;
2513
2514 if (argc == 0)
2515 error (_("trace selection mode is required"));
2516
2517 mode = argv[0];
2518
2519 if (strcmp (mode, "none") == 0)
2520 {
2521 tfind_1 (tfind_number, -1, 0, 0, 0);
2522 return;
2523 }
2524
2525 check_trace_running (current_trace_status ());
2526
2527 if (strcmp (mode, "frame-number") == 0)
2528 {
2529 if (argc != 2)
2530 error (_("frame number is required"));
2531 tfind_1 (tfind_number, atoi (argv[1]), 0, 0, 0);
2532 }
2533 else if (strcmp (mode, "tracepoint-number") == 0)
2534 {
2535 if (argc != 2)
2536 error (_("tracepoint number is required"));
2537 tfind_1 (tfind_tp, atoi (argv[1]), 0, 0, 0);
2538 }
2539 else if (strcmp (mode, "pc") == 0)
2540 {
2541 if (argc != 2)
2542 error (_("PC is required"));
2543 tfind_1 (tfind_pc, 0, parse_and_eval_address (argv[1]), 0, 0);
2544 }
2545 else if (strcmp (mode, "pc-inside-range") == 0)
2546 {
2547 if (argc != 3)
2548 error (_("Start and end PC are required"));
2549 tfind_1 (tfind_range, 0, parse_and_eval_address (argv[1]),
2550 parse_and_eval_address (argv[2]), 0);
2551 }
2552 else if (strcmp (mode, "pc-outside-range") == 0)
2553 {
2554 if (argc != 3)
2555 error (_("Start and end PC are required"));
2556 tfind_1 (tfind_outside, 0, parse_and_eval_address (argv[1]),
2557 parse_and_eval_address (argv[2]), 0);
2558 }
2559 else if (strcmp (mode, "line") == 0)
2560 {
2561 struct symtabs_and_lines sals;
2562 struct symtab_and_line sal;
2563 static CORE_ADDR start_pc, end_pc;
2564 struct cleanup *back_to;
2565
2566 if (argc != 2)
2567 error (_("Line is required"));
2568
2569 sals = decode_line_with_current_source (argv[1],
2570 DECODE_LINE_FUNFIRSTLINE);
2571 back_to = make_cleanup (xfree, sals.sals);
2572
2573 sal = sals.sals[0];
2574
2575 if (sal.symtab == 0)
2576 error (_("Could not find the specified line"));
2577
2578 if (sal.line > 0 && find_line_pc_range (sal, &start_pc, &end_pc))
2579 tfind_1 (tfind_range, 0, start_pc, end_pc - 1, 0);
2580 else
2581 error (_("Could not find the specified line"));
2582
2583 do_cleanups (back_to);
2584 }
2585 else
2586 error (_("Invalid mode '%s'"), mode);
2587
2588 if (has_stack_frames () || get_traceframe_number () >= 0)
2589 print_stack_frame (get_selected_frame (NULL), 1, LOC_AND_ADDRESS, 1);
2590 }
2591
2592 void
2593 mi_cmd_trace_save (const char *command, char **argv, int argc)
2594 {
2595 int target_saves = 0;
2596 int generate_ctf = 0;
2597 char *filename;
2598 int oind = 0;
2599 char *oarg;
2600
2601 enum opt
2602 {
2603 TARGET_SAVE_OPT, CTF_OPT
2604 };
2605 static const struct mi_opt opts[] =
2606 {
2607 {"r", TARGET_SAVE_OPT, 0},
2608 {"ctf", CTF_OPT, 0},
2609 { 0, 0, 0 }
2610 };
2611
2612 while (1)
2613 {
2614 int opt = mi_getopt ("-trace-save", argc, argv, opts,
2615 &oind, &oarg);
2616
2617 if (opt < 0)
2618 break;
2619 switch ((enum opt) opt)
2620 {
2621 case TARGET_SAVE_OPT:
2622 target_saves = 1;
2623 break;
2624 case CTF_OPT:
2625 generate_ctf = 1;
2626 break;
2627 }
2628 }
2629
2630 if (argc - oind != 1)
2631 error (_("Exactly one argument required "
2632 "(file in which to save trace data)"));
2633
2634 filename = argv[oind];
2635
2636 if (generate_ctf)
2637 trace_save_ctf (filename, target_saves);
2638 else
2639 trace_save_tfile (filename, target_saves);
2640 }
2641
2642 void
2643 mi_cmd_trace_start (const char *command, char **argv, int argc)
2644 {
2645 start_tracing (NULL);
2646 }
2647
2648 void
2649 mi_cmd_trace_status (const char *command, char **argv, int argc)
2650 {
2651 trace_status_mi (0);
2652 }
2653
2654 void
2655 mi_cmd_trace_stop (const char *command, char **argv, int argc)
2656 {
2657 stop_tracing (NULL);
2658 trace_status_mi (1);
2659 }
2660
2661 /* Implement the "-ada-task-info" command. */
2662
2663 void
2664 mi_cmd_ada_task_info (const char *command, char **argv, int argc)
2665 {
2666 if (argc != 0 && argc != 1)
2667 error (_("Invalid MI command"));
2668
2669 print_ada_task_info (current_uiout, argv[0], current_inferior ());
2670 }
2671
2672 /* Print EXPRESSION according to VALUES. */
2673
2674 static void
2675 print_variable_or_computed (const char *expression, enum print_values values)
2676 {
2677 struct cleanup *old_chain;
2678 struct value *val;
2679 struct type *type;
2680 struct ui_out *uiout = current_uiout;
2681
2682 string_file stb;
2683
2684 expression_up expr = parse_expression (expression);
2685
2686 if (values == PRINT_SIMPLE_VALUES)
2687 val = evaluate_type (expr.get ());
2688 else
2689 val = evaluate_expression (expr.get ());
2690
2691 old_chain = make_cleanup (null_cleanup, NULL);
2692 if (values != PRINT_NO_VALUES)
2693 make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
2694 uiout->field_string ("name", expression);
2695
2696 switch (values)
2697 {
2698 case PRINT_SIMPLE_VALUES:
2699 type = check_typedef (value_type (val));
2700 type_print (value_type (val), "", &stb, -1);
2701 uiout->field_stream ("type", stb);
2702 if (TYPE_CODE (type) != TYPE_CODE_ARRAY
2703 && TYPE_CODE (type) != TYPE_CODE_STRUCT
2704 && TYPE_CODE (type) != TYPE_CODE_UNION)
2705 {
2706 struct value_print_options opts;
2707
2708 get_no_prettyformat_print_options (&opts);
2709 opts.deref_ref = 1;
2710 common_val_print (val, &stb, 0, &opts, current_language);
2711 uiout->field_stream ("value", stb);
2712 }
2713 break;
2714 case PRINT_ALL_VALUES:
2715 {
2716 struct value_print_options opts;
2717
2718 get_no_prettyformat_print_options (&opts);
2719 opts.deref_ref = 1;
2720 common_val_print (val, &stb, 0, &opts, current_language);
2721 uiout->field_stream ("value", stb);
2722 }
2723 break;
2724 }
2725
2726 do_cleanups (old_chain);
2727 }
2728
2729 /* Implement the "-trace-frame-collected" command. */
2730
2731 void
2732 mi_cmd_trace_frame_collected (const char *command, char **argv, int argc)
2733 {
2734 struct cleanup *old_chain;
2735 struct bp_location *tloc;
2736 int stepping_frame;
2737 struct collection_list *clist;
2738 struct collection_list tracepoint_list, stepping_list;
2739 struct traceframe_info *tinfo;
2740 int oind = 0;
2741 enum print_values var_print_values = PRINT_ALL_VALUES;
2742 enum print_values comp_print_values = PRINT_ALL_VALUES;
2743 int registers_format = 'x';
2744 int memory_contents = 0;
2745 struct ui_out *uiout = current_uiout;
2746 enum opt
2747 {
2748 VAR_PRINT_VALUES,
2749 COMP_PRINT_VALUES,
2750 REGISTERS_FORMAT,
2751 MEMORY_CONTENTS,
2752 };
2753 static const struct mi_opt opts[] =
2754 {
2755 {"-var-print-values", VAR_PRINT_VALUES, 1},
2756 {"-comp-print-values", COMP_PRINT_VALUES, 1},
2757 {"-registers-format", REGISTERS_FORMAT, 1},
2758 {"-memory-contents", MEMORY_CONTENTS, 0},
2759 { 0, 0, 0 }
2760 };
2761
2762 while (1)
2763 {
2764 char *oarg;
2765 int opt = mi_getopt ("-trace-frame-collected", argc, argv, opts,
2766 &oind, &oarg);
2767 if (opt < 0)
2768 break;
2769 switch ((enum opt) opt)
2770 {
2771 case VAR_PRINT_VALUES:
2772 var_print_values = mi_parse_print_values (oarg);
2773 break;
2774 case COMP_PRINT_VALUES:
2775 comp_print_values = mi_parse_print_values (oarg);
2776 break;
2777 case REGISTERS_FORMAT:
2778 registers_format = oarg[0];
2779 case MEMORY_CONTENTS:
2780 memory_contents = 1;
2781 break;
2782 }
2783 }
2784
2785 if (oind != argc)
2786 error (_("Usage: -trace-frame-collected "
2787 "[--var-print-values PRINT_VALUES] "
2788 "[--comp-print-values PRINT_VALUES] "
2789 "[--registers-format FORMAT]"
2790 "[--memory-contents]"));
2791
2792 /* This throws an error is not inspecting a trace frame. */
2793 tloc = get_traceframe_location (&stepping_frame);
2794
2795 /* This command only makes sense for the current frame, not the
2796 selected frame. */
2797 old_chain = make_cleanup_restore_current_thread ();
2798 select_frame (get_current_frame ());
2799
2800 encode_actions (tloc, &tracepoint_list, &stepping_list);
2801
2802 if (stepping_frame)
2803 clist = &stepping_list;
2804 else
2805 clist = &tracepoint_list;
2806
2807 tinfo = get_traceframe_info ();
2808
2809 /* Explicitly wholly collected variables. */
2810 {
2811 struct cleanup *list_cleanup;
2812 int i;
2813
2814 list_cleanup = make_cleanup_ui_out_list_begin_end (uiout,
2815 "explicit-variables");
2816
2817 const std::vector<std::string> &wholly_collected
2818 = clist->wholly_collected ();
2819 for (size_t i = 0; i < wholly_collected.size (); i++)
2820 {
2821 const std::string &str = wholly_collected[i];
2822 print_variable_or_computed (str.c_str (), var_print_values);
2823 }
2824
2825 do_cleanups (list_cleanup);
2826 }
2827
2828 /* Computed expressions. */
2829 {
2830 struct cleanup *list_cleanup;
2831 char *p;
2832 int i;
2833
2834 list_cleanup
2835 = make_cleanup_ui_out_list_begin_end (uiout,
2836 "computed-expressions");
2837
2838 const std::vector<std::string> &computed = clist->computed ();
2839 for (size_t i = 0; i < computed.size (); i++)
2840 {
2841 const std::string &str = computed[i];
2842 print_variable_or_computed (str.c_str (), comp_print_values);
2843 }
2844
2845 do_cleanups (list_cleanup);
2846 }
2847
2848 /* Registers. Given pseudo-registers, and that some architectures
2849 (like MIPS) actually hide the raw registers, we don't go through
2850 the trace frame info, but instead consult the register cache for
2851 register availability. */
2852 {
2853 struct cleanup *list_cleanup;
2854 struct frame_info *frame;
2855 struct gdbarch *gdbarch;
2856 int regnum;
2857 int numregs;
2858
2859 list_cleanup = make_cleanup_ui_out_list_begin_end (uiout, "registers");
2860
2861 frame = get_selected_frame (NULL);
2862 gdbarch = get_frame_arch (frame);
2863 numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
2864
2865 for (regnum = 0; regnum < numregs; regnum++)
2866 {
2867 if (gdbarch_register_name (gdbarch, regnum) == NULL
2868 || *(gdbarch_register_name (gdbarch, regnum)) == '\0')
2869 continue;
2870
2871 output_register (frame, regnum, registers_format, 1);
2872 }
2873
2874 do_cleanups (list_cleanup);
2875 }
2876
2877 /* Trace state variables. */
2878 {
2879 struct cleanup *list_cleanup;
2880 int tvar;
2881 char *tsvname;
2882 int i;
2883
2884 list_cleanup = make_cleanup_ui_out_list_begin_end (uiout, "tvars");
2885
2886 tsvname = NULL;
2887 make_cleanup (free_current_contents, &tsvname);
2888
2889 for (i = 0; VEC_iterate (int, tinfo->tvars, i, tvar); i++)
2890 {
2891 struct cleanup *cleanup_child;
2892 struct trace_state_variable *tsv;
2893
2894 tsv = find_trace_state_variable_by_number (tvar);
2895
2896 cleanup_child = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
2897
2898 if (tsv != NULL)
2899 {
2900 tsvname = (char *) xrealloc (tsvname, strlen (tsv->name) + 2);
2901 tsvname[0] = '$';
2902 strcpy (tsvname + 1, tsv->name);
2903 uiout->field_string ("name", tsvname);
2904
2905 tsv->value_known = target_get_trace_state_variable_value (tsv->number,
2906 &tsv->value);
2907 uiout->field_int ("current", tsv->value);
2908 }
2909 else
2910 {
2911 uiout->field_skip ("name");
2912 uiout->field_skip ("current");
2913 }
2914
2915 do_cleanups (cleanup_child);
2916 }
2917
2918 do_cleanups (list_cleanup);
2919 }
2920
2921 /* Memory. */
2922 {
2923 struct cleanup *list_cleanup;
2924 VEC(mem_range_s) *available_memory = NULL;
2925 struct mem_range *r;
2926 int i;
2927
2928 traceframe_available_memory (&available_memory, 0, ULONGEST_MAX);
2929 make_cleanup (VEC_cleanup(mem_range_s), &available_memory);
2930
2931 list_cleanup = make_cleanup_ui_out_list_begin_end (uiout, "memory");
2932
2933 for (i = 0; VEC_iterate (mem_range_s, available_memory, i, r); i++)
2934 {
2935 struct cleanup *cleanup_child;
2936 gdb_byte *data;
2937 struct gdbarch *gdbarch = target_gdbarch ();
2938
2939 cleanup_child = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
2940
2941 uiout->field_core_addr ("address", gdbarch, r->start);
2942 uiout->field_int ("length", r->length);
2943
2944 data = (gdb_byte *) xmalloc (r->length);
2945 make_cleanup (xfree, data);
2946
2947 if (memory_contents)
2948 {
2949 if (target_read_memory (r->start, data, r->length) == 0)
2950 {
2951 int m;
2952 char *data_str, *p;
2953
2954 data_str = (char *) xmalloc (r->length * 2 + 1);
2955 make_cleanup (xfree, data_str);
2956
2957 for (m = 0, p = data_str; m < r->length; ++m, p += 2)
2958 sprintf (p, "%02x", data[m]);
2959 uiout->field_string ("contents", data_str);
2960 }
2961 else
2962 uiout->field_skip ("contents");
2963 }
2964 do_cleanups (cleanup_child);
2965 }
2966
2967 do_cleanups (list_cleanup);
2968 }
2969
2970 do_cleanups (old_chain);
2971 }
2972
2973 void
2974 _initialize_mi_main (void)
2975 {
2976 struct cmd_list_element *c;
2977
2978 add_setshow_boolean_cmd ("mi-async", class_run,
2979 &mi_async_1, _("\
2980 Set whether MI asynchronous mode is enabled."), _("\
2981 Show whether MI asynchronous mode is enabled."), _("\
2982 Tells GDB whether MI should be in asynchronous mode."),
2983 set_mi_async_command,
2984 show_mi_async_command,
2985 &setlist,
2986 &showlist);
2987
2988 /* Alias old "target-async" to "mi-async". */
2989 c = add_alias_cmd ("target-async", "mi-async", class_run, 0, &setlist);
2990 deprecate_cmd (c, "set mi-async");
2991 c = add_alias_cmd ("target-async", "mi-async", class_run, 0, &showlist);
2992 deprecate_cmd (c, "show mi-async");
2993 }
This page took 0.108946 seconds and 5 git commands to generate.