mi-main.c revision 1.7 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 (¤t_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
1958
1960 /* Execute a command within a safe environment.
1961 Return <0 for error; >=0 for ok.
1962
1963 args->action will tell mi_execute_command what action
1964 to perfrom after the given command has executed (display/suppress
1965 prompt, display error). */
1966
1967 static void
1968 captured_mi_execute_command (struct ui_out *uiout, struct mi_parse *context)
1969 {
1970 struct mi_interp *mi = (struct mi_interp *) command_interp ();
1971 struct cleanup *cleanup;
1972
1973 if (do_timings)
1974 current_command_ts = context->cmd_start;
1975
1976 current_token = xstrdup (context->token);
1977 cleanup = make_cleanup (free_current_contents, ¤t_token);
1978
1979 running_result_record_printed = 0;
1980 mi_proceeded = 0;
1981 switch (context->op)
1982 {
1983 case MI_COMMAND:
1984 /* A MI command was read from the input stream. */
1985 if (mi_debug_p)
1986 /* FIXME: gdb_???? */
1987 fprintf_unfiltered (mi->raw_stdout,
1988 " token=`%s' command=`%s' args=`%s'\n",
1989 context->token, context->command, context->args);
1990
1991 mi_cmd_execute (context);
1992
1993 /* Print the result if there were no errors.
1994
1995 Remember that on the way out of executing a command, you have
1996 to directly use the mi_interp's uiout, since the command
1997 could have reset the interpreter, in which case the current
1998 uiout will most likely crash in the mi_out_* routines. */
1999 if (!running_result_record_printed)
2000 {
2001 fputs_unfiltered (context->token, mi->raw_stdout);
2002 /* There's no particularly good reason why target-connect results
2003 in not ^done. Should kill ^connected for MI3. */
2004 fputs_unfiltered (strcmp (context->command, "target-select") == 0
2005 ? "^connected" : "^done", mi->raw_stdout);
2006 mi_out_put (uiout, mi->raw_stdout);
2007 mi_out_rewind (uiout);
2008 mi_print_timing_maybe (mi->raw_stdout);
2009 fputs_unfiltered ("\n", mi->raw_stdout);
2010 }
2011 else
2012 /* The command does not want anything to be printed. In that
2013 case, the command probably should not have written anything
2014 to uiout, but in case it has written something, discard it. */
2015 mi_out_rewind (uiout);
2016 break;
2017
2018 case CLI_COMMAND:
2019 {
2020 char *argv[2];
2021
2022 /* A CLI command was read from the input stream. */
2023 /* This "feature" will be removed as soon as we have a
2024 complete set of mi commands. */
2025 /* Echo the command on the console. */
2026 fprintf_unfiltered (gdb_stdlog, "%s\n", context->command);
2027 /* Call the "console" interpreter. */
2028 argv[0] = (char *) INTERP_CONSOLE;
2029 argv[1] = context->command;
2030 mi_cmd_interpreter_exec ("-interpreter-exec", argv, 2);
2031
2032 /* If we changed interpreters, DON'T print out anything. */
2033 if (current_interp_named_p (INTERP_MI)
2034 || current_interp_named_p (INTERP_MI1)
2035 || current_interp_named_p (INTERP_MI2)
2036 || current_interp_named_p (INTERP_MI3))
2037 {
2038 if (!running_result_record_printed)
2039 {
2040 fputs_unfiltered (context->token, mi->raw_stdout);
2041 fputs_unfiltered ("^done", mi->raw_stdout);
2042 mi_out_put (uiout, mi->raw_stdout);
2043 mi_out_rewind (uiout);
2044 mi_print_timing_maybe (mi->raw_stdout);
2045 fputs_unfiltered ("\n", mi->raw_stdout);
2046 }
2047 else
2048 mi_out_rewind (uiout);
2049 }
2050 break;
2051 }
2052 }
2053
2054 do_cleanups (cleanup);
2055 }
2056
2057 /* Print a gdb exception to the MI output stream. */
2058
2059 static void
2060 mi_print_exception (const char *token, struct gdb_exception exception)
2061 {
2062 struct mi_interp *mi = (struct mi_interp *) current_interpreter ();
2063
2064 fputs_unfiltered (token, mi->raw_stdout);
2065 fputs_unfiltered ("^error,msg=\"", mi->raw_stdout);
2066 if (exception.message == NULL)
2067 fputs_unfiltered ("unknown error", mi->raw_stdout);
2068 else
2069 fputstr_unfiltered (exception.message, '"', mi->raw_stdout);
2070 fputs_unfiltered ("\"", mi->raw_stdout);
2071
2072 switch (exception.error)
2073 {
2074 case UNDEFINED_COMMAND_ERROR:
2075 fputs_unfiltered (",code=\"undefined-command\"", mi->raw_stdout);
2076 break;
2077 }
2078
2079 fputs_unfiltered ("\n", mi->raw_stdout);
2080 }
2081
2082 /* Determine whether the parsed command already notifies the
2083 user_selected_context_changed observer. */
2084
2085 static int
2086 command_notifies_uscc_observer (struct mi_parse *command)
2087 {
2088 if (command->op == CLI_COMMAND)
2089 {
2090 /* CLI commands "thread" and "inferior" already send it. */
2091 return (strncmp (command->command, "thread ", 7) == 0
2092 || strncmp (command->command, "inferior ", 9) == 0);
2093 }
2094 else /* MI_COMMAND */
2095 {
2096 if (strcmp (command->command, "interpreter-exec") == 0
2097 && command->argc > 1)
2098 {
2099 /* "thread" and "inferior" again, but through -interpreter-exec. */
2100 return (strncmp (command->argv[1], "thread ", 7) == 0
2101 || strncmp (command->argv[1], "inferior ", 9) == 0);
2102 }
2103
2104 else
2105 /* -thread-select already sends it. */
2106 return strcmp (command->command, "thread-select") == 0;
2107 }
2108 }
2109
2110 void
2111 mi_execute_command (const char *cmd, int from_tty)
2112 {
2113 char *token;
2114 std::unique_ptr<struct mi_parse> command;
2115
2116 /* This is to handle EOF (^D). We just quit gdb. */
2117 /* FIXME: we should call some API function here. */
2118 if (cmd == 0)
2119 quit_force (NULL, from_tty);
2120
2121 target_log_command (cmd);
2122
2123 TRY
2124 {
2125 command = mi_parse (cmd, &token);
2126 }
2127 CATCH (exception, RETURN_MASK_ALL)
2128 {
2129 mi_print_exception (token, exception);
2130 xfree (token);
2131 }
2132 END_CATCH
2133
2134 if (command != NULL)
2135 {
2136 ptid_t previous_ptid = inferior_ptid;
2137
2138 gdb::optional<scoped_restore_tmpl<int>> restore_suppress;
2139
2140 if (command->cmd != NULL && command->cmd->suppress_notification != NULL)
2141 restore_suppress.emplace (command->cmd->suppress_notification, 1);
2142
2143 command->token = token;
2144
2145 if (do_timings)
2146 {
2147 command->cmd_start = new mi_timestamp ();
2148 timestamp (command->cmd_start);
2149 }
2150
2151 TRY
2152 {
2153 captured_mi_execute_command (current_uiout, command.get ());
2154 }
2155 CATCH (result, RETURN_MASK_ALL)
2156 {
2157 /* Like in start_event_loop, enable input and force display
2158 of the prompt. Otherwise, any command that calls
2159 async_disable_stdin, and then throws, will leave input
2160 disabled. */
2161 async_enable_stdin ();
2162 current_ui->prompt_state = PROMPT_NEEDED;
2163
2164 /* The command execution failed and error() was called
2165 somewhere. */
2166 mi_print_exception (command->token, result);
2167 mi_out_rewind (current_uiout);
2168 }
2169 END_CATCH
2170
2171 bpstat_do_actions ();
2172
2173 if (/* The notifications are only output when the top-level
2174 interpreter (specified on the command line) is MI. */
2175 interp_ui_out (top_level_interpreter ())->is_mi_like_p ()
2176 /* Don't try report anything if there are no threads --
2177 the program is dead. */
2178 && thread_count () != 0
2179 /* If the command already reports the thread change, no need to do it
2180 again. */
2181 && !command_notifies_uscc_observer (command.get ()))
2182 {
2183 struct mi_interp *mi = (struct mi_interp *) top_level_interpreter ();
2184 int report_change = 0;
2185
2186 if (command->thread == -1)
2187 {
2188 report_change = (!ptid_equal (previous_ptid, null_ptid)
2189 && !ptid_equal (inferior_ptid, previous_ptid)
2190 && !ptid_equal (inferior_ptid, null_ptid));
2191 }
2192 else if (!ptid_equal (inferior_ptid, null_ptid))
2193 {
2194 struct thread_info *ti = inferior_thread ();
2195
2196 report_change = (ti->global_num != command->thread);
2197 }
2198
2199 if (report_change)
2200 {
2201 observer_notify_user_selected_context_changed
2202 (USER_SELECTED_THREAD | USER_SELECTED_FRAME);
2203 }
2204 }
2205 }
2206 }
2207
2208 static void
2209 mi_cmd_execute (struct mi_parse *parse)
2210 {
2211 struct cleanup *cleanup;
2212
2213 cleanup = prepare_execute_command ();
2214
2215 if (parse->all && parse->thread_group != -1)
2216 error (_("Cannot specify --thread-group together with --all"));
2217
2218 if (parse->all && parse->thread != -1)
2219 error (_("Cannot specify --thread together with --all"));
2220
2221 if (parse->thread_group != -1 && parse->thread != -1)
2222 error (_("Cannot specify --thread together with --thread-group"));
2223
2224 if (parse->frame != -1 && parse->thread == -1)
2225 error (_("Cannot specify --frame without --thread"));
2226
2227 if (parse->thread_group != -1)
2228 {
2229 struct inferior *inf = find_inferior_id (parse->thread_group);
2230 struct thread_info *tp = 0;
2231
2232 if (!inf)
2233 error (_("Invalid thread group for the --thread-group option"));
2234
2235 set_current_inferior (inf);
2236 /* This behaviour means that if --thread-group option identifies
2237 an inferior with multiple threads, then a random one will be
2238 picked. This is not a problem -- frontend should always
2239 provide --thread if it wishes to operate on a specific
2240 thread. */
2241 if (inf->pid != 0)
2242 tp = any_live_thread_of_process (inf->pid);
2243 switch_to_thread (tp ? tp->ptid : null_ptid);
2244 set_current_program_space (inf->pspace);
2245 }
2246
2247 if (parse->thread != -1)
2248 {
2249 struct thread_info *tp = find_thread_global_id (parse->thread);
2250
2251 if (!tp)
2252 error (_("Invalid thread id: %d"), parse->thread);
2253
2254 if (is_exited (tp->ptid))
2255 error (_("Thread id: %d has terminated"), parse->thread);
2256
2257 switch_to_thread (tp->ptid);
2258 }
2259
2260 if (parse->frame != -1)
2261 {
2262 struct frame_info *fid;
2263 int frame = parse->frame;
2264
2265 fid = find_relative_frame (get_current_frame (), &frame);
2266 if (frame == 0)
2267 /* find_relative_frame was successful */
2268 select_frame (fid);
2269 else
2270 error (_("Invalid frame id: %d"), frame);
2271 }
2272
2273 if (parse->language != language_unknown)
2274 {
2275 make_cleanup_restore_current_language ();
2276 set_language (parse->language);
2277 }
2278
2279 current_context = parse;
2280
2281 if (parse->cmd->argv_func != NULL)
2282 {
2283 parse->cmd->argv_func (parse->command, parse->argv, parse->argc);
2284 }
2285 else if (parse->cmd->cli.cmd != 0)
2286 {
2287 /* FIXME: DELETE THIS. */
2288 /* The operation is still implemented by a cli command. */
2289 /* Must be a synchronous one. */
2290 mi_execute_cli_command (parse->cmd->cli.cmd, parse->cmd->cli.args_p,
2291 parse->args);
2292 }
2293 else
2294 {
2295 /* FIXME: DELETE THIS. */
2296 string_file stb;
2297
2298 stb.puts ("Undefined mi command: ");
2299 stb.putstr (parse->command, '"');
2300 stb.puts (" (missing implementation)");
2301
2302 error_stream (stb);
2303 }
2304 do_cleanups (cleanup);
2305 }
2306
2307 /* FIXME: This is just a hack so we can get some extra commands going.
2308 We don't want to channel things through the CLI, but call libgdb directly.
2309 Use only for synchronous commands. */
2310
2311 void
2312 mi_execute_cli_command (const char *cmd, int args_p, const char *args)
2313 {
2314 if (cmd != 0)
2315 {
2316 struct cleanup *old_cleanups;
2317 char *run;
2318
2319 if (args_p)
2320 run = xstrprintf ("%s %s", cmd, args);
2321 else
2322 run = xstrdup (cmd);
2323 if (mi_debug_p)
2324 /* FIXME: gdb_???? */
2325 fprintf_unfiltered (gdb_stdout, "cli=%s run=%s\n",
2326 cmd, run);
2327 old_cleanups = make_cleanup (xfree, run);
2328 execute_command (run, 0 /* from_tty */ );
2329 do_cleanups (old_cleanups);
2330 return;
2331 }
2332 }
2333
2334 void
2335 mi_execute_async_cli_command (const char *cli_command, char **argv, int argc)
2336 {
2337 struct cleanup *old_cleanups;
2338 char *run;
2339
2340 if (mi_async_p ())
2341 run = xstrprintf ("%s %s&", cli_command, argc ? *argv : "");
2342 else
2343 run = xstrprintf ("%s %s", cli_command, argc ? *argv : "");
2344 old_cleanups = make_cleanup (xfree, run);
2345
2346 execute_command (run, 0 /* from_tty */ );
2347
2348 /* Do this before doing any printing. It would appear that some
2349 print code leaves garbage around in the buffer. */
2350 do_cleanups (old_cleanups);
2351 }
2352
2353 void
2354 mi_load_progress (const char *section_name,
2355 unsigned long sent_so_far,
2356 unsigned long total_section,
2357 unsigned long total_sent,
2358 unsigned long grand_total)
2359 {
2360 using namespace std::chrono;
2361 static steady_clock::time_point last_update;
2362 static char *previous_sect_name = NULL;
2363 int new_section;
2364 struct ui_out *saved_uiout;
2365 struct ui_out *uiout;
2366 struct mi_interp *mi = (struct mi_interp *) current_interpreter ();
2367
2368 /* This function is called through deprecated_show_load_progress
2369 which means uiout may not be correct. Fix it for the duration
2370 of this function. */
2371 saved_uiout = current_uiout;
2372
2373 if (current_interp_named_p (INTERP_MI)
2374 || current_interp_named_p (INTERP_MI2))
2375 current_uiout = mi_out_new (2);
2376 else if (current_interp_named_p (INTERP_MI1))
2377 current_uiout = mi_out_new (1);
2378 else if (current_interp_named_p (INTERP_MI3))
2379 current_uiout = mi_out_new (3);
2380 else
2381 return;
2382
2383 uiout = current_uiout;
2384
2385 new_section = (previous_sect_name ?
2386 strcmp (previous_sect_name, section_name) : 1);
2387 if (new_section)
2388 {
2389 struct cleanup *cleanup_tuple;
2390
2391 xfree (previous_sect_name);
2392 previous_sect_name = xstrdup (section_name);
2393
2394 if (current_token)
2395 fputs_unfiltered (current_token, mi->raw_stdout);
2396 fputs_unfiltered ("+download", mi->raw_stdout);
2397 cleanup_tuple = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
2398 uiout->field_string ("section", section_name);
2399 uiout->field_int ("section-size", total_section);
2400 uiout->field_int ("total-size", grand_total);
2401 do_cleanups (cleanup_tuple);
2402 mi_out_put (uiout, mi->raw_stdout);
2403 fputs_unfiltered ("\n", mi->raw_stdout);
2404 gdb_flush (mi->raw_stdout);
2405 }
2406
2407 steady_clock::time_point time_now = steady_clock::now ();
2408 if (time_now - last_update > milliseconds (500))
2409 {
2410 struct cleanup *cleanup_tuple;
2411
2412 last_update = time_now;
2413 if (current_token)
2414 fputs_unfiltered (current_token, mi->raw_stdout);
2415 fputs_unfiltered ("+download", mi->raw_stdout);
2416 cleanup_tuple = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
2417 uiout->field_string ("section", section_name);
2418 uiout->field_int ("section-sent", sent_so_far);
2419 uiout->field_int ("section-size", total_section);
2420 uiout->field_int ("total-sent", total_sent);
2421 uiout->field_int ("total-size", grand_total);
2422 do_cleanups (cleanup_tuple);
2423 mi_out_put (uiout, mi->raw_stdout);
2424 fputs_unfiltered ("\n", mi->raw_stdout);
2425 gdb_flush (mi->raw_stdout);
2426 }
2427
2428 xfree (uiout);
2429 current_uiout = saved_uiout;
2430 }
2431
2432 static void
2433 timestamp (struct mi_timestamp *tv)
2434 {
2435 using namespace std::chrono;
2436
2437 tv->wallclock = steady_clock::now ();
2438 run_time_clock::now (tv->utime, tv->stime);
2439 }
2440
2441 static void
2442 print_diff_now (struct ui_file *file, struct mi_timestamp *start)
2443 {
2444 struct mi_timestamp now;
2445
2446 timestamp (&now);
2447 print_diff (file, start, &now);
2448 }
2449
2450 void
2451 mi_print_timing_maybe (struct ui_file *file)
2452 {
2453 /* If the command is -enable-timing then do_timings may be true
2454 whilst current_command_ts is not initialized. */
2455 if (do_timings && current_command_ts)
2456 print_diff_now (file, current_command_ts);
2457 }
2458
2459 static void
2460 print_diff (struct ui_file *file, struct mi_timestamp *start,
2461 struct mi_timestamp *end)
2462 {
2463 using namespace std::chrono;
2464
2465 duration<double> wallclock = end->wallclock - start->wallclock;
2466 duration<double> utime = end->utime - start->utime;
2467 duration<double> stime = end->stime - start->stime;
2468
2469 fprintf_unfiltered
2470 (file,
2471 ",time={wallclock=\"%0.5f\",user=\"%0.5f\",system=\"%0.5f\"}",
2472 wallclock.count (), utime.count (), stime.count ());
2473 }
2474
2475 void
2476 mi_cmd_trace_define_variable (const char *command, char **argv, int argc)
2477 {
2478 LONGEST initval = 0;
2479 struct trace_state_variable *tsv;
2480 char *name = 0;
2481
2482 if (argc != 1 && argc != 2)
2483 error (_("Usage: -trace-define-variable VARIABLE [VALUE]"));
2484
2485 name = argv[0];
2486 if (*name++ != '$')
2487 error (_("Name of trace variable should start with '$'"));
2488
2489 validate_trace_state_variable_name (name);
2490
2491 tsv = find_trace_state_variable (name);
2492 if (!tsv)
2493 tsv = create_trace_state_variable (name);
2494
2495 if (argc == 2)
2496 initval = value_as_long (parse_and_eval (argv[1]));
2497
2498 tsv->initial_value = initval;
2499 }
2500
2501 void
2502 mi_cmd_trace_list_variables (const char *command, char **argv, int argc)
2503 {
2504 if (argc != 0)
2505 error (_("-trace-list-variables: no arguments allowed"));
2506
2507 tvariables_info_1 ();
2508 }
2509
2510 void
2511 mi_cmd_trace_find (const char *command, char **argv, int argc)
2512 {
2513 char *mode;
2514
2515 if (argc == 0)
2516 error (_("trace selection mode is required"));
2517
2518 mode = argv[0];
2519
2520 if (strcmp (mode, "none") == 0)
2521 {
2522 tfind_1 (tfind_number, -1, 0, 0, 0);
2523 return;
2524 }
2525
2526 check_trace_running (current_trace_status ());
2527
2528 if (strcmp (mode, "frame-number") == 0)
2529 {
2530 if (argc != 2)
2531 error (_("frame number is required"));
2532 tfind_1 (tfind_number, atoi (argv[1]), 0, 0, 0);
2533 }
2534 else if (strcmp (mode, "tracepoint-number") == 0)
2535 {
2536 if (argc != 2)
2537 error (_("tracepoint number is required"));
2538 tfind_1 (tfind_tp, atoi (argv[1]), 0, 0, 0);
2539 }
2540 else if (strcmp (mode, "pc") == 0)
2541 {
2542 if (argc != 2)
2543 error (_("PC is required"));
2544 tfind_1 (tfind_pc, 0, parse_and_eval_address (argv[1]), 0, 0);
2545 }
2546 else if (strcmp (mode, "pc-inside-range") == 0)
2547 {
2548 if (argc != 3)
2549 error (_("Start and end PC are required"));
2550 tfind_1 (tfind_range, 0, parse_and_eval_address (argv[1]),
2551 parse_and_eval_address (argv[2]), 0);
2552 }
2553 else if (strcmp (mode, "pc-outside-range") == 0)
2554 {
2555 if (argc != 3)
2556 error (_("Start and end PC are required"));
2557 tfind_1 (tfind_outside, 0, parse_and_eval_address (argv[1]),
2558 parse_and_eval_address (argv[2]), 0);
2559 }
2560 else if (strcmp (mode, "line") == 0)
2561 {
2562 struct symtabs_and_lines sals;
2563 struct symtab_and_line sal;
2564 static CORE_ADDR start_pc, end_pc;
2565 struct cleanup *back_to;
2566
2567 if (argc != 2)
2568 error (_("Line is required"));
2569
2570 sals = decode_line_with_current_source (argv[1],
2571 DECODE_LINE_FUNFIRSTLINE);
2572 back_to = make_cleanup (xfree, sals.sals);
2573
2574 sal = sals.sals[0];
2575
2576 if (sal.symtab == 0)
2577 error (_("Could not find the specified line"));
2578
2579 if (sal.line > 0 && find_line_pc_range (sal, &start_pc, &end_pc))
2580 tfind_1 (tfind_range, 0, start_pc, end_pc - 1, 0);
2581 else
2582 error (_("Could not find the specified line"));
2583
2584 do_cleanups (back_to);
2585 }
2586 else
2587 error (_("Invalid mode '%s'"), mode);
2588
2589 if (has_stack_frames () || get_traceframe_number () >= 0)
2590 print_stack_frame (get_selected_frame (NULL), 1, LOC_AND_ADDRESS, 1);
2591 }
2592
2593 void
2594 mi_cmd_trace_save (const char *command, char **argv, int argc)
2595 {
2596 int target_saves = 0;
2597 int generate_ctf = 0;
2598 char *filename;
2599 int oind = 0;
2600 char *oarg;
2601
2602 enum opt
2603 {
2604 TARGET_SAVE_OPT, CTF_OPT
2605 };
2606 static const struct mi_opt opts[] =
2607 {
2608 {"r", TARGET_SAVE_OPT, 0},
2609 {"ctf", CTF_OPT, 0},
2610 { 0, 0, 0 }
2611 };
2612
2613 while (1)
2614 {
2615 int opt = mi_getopt ("-trace-save", argc, argv, opts,
2616 &oind, &oarg);
2617
2618 if (opt < 0)
2619 break;
2620 switch ((enum opt) opt)
2621 {
2622 case TARGET_SAVE_OPT:
2623 target_saves = 1;
2624 break;
2625 case CTF_OPT:
2626 generate_ctf = 1;
2627 break;
2628 }
2629 }
2630
2631 if (argc - oind != 1)
2632 error (_("Exactly one argument required "
2633 "(file in which to save trace data)"));
2634
2635 filename = argv[oind];
2636
2637 if (generate_ctf)
2638 trace_save_ctf (filename, target_saves);
2639 else
2640 trace_save_tfile (filename, target_saves);
2641 }
2642
2643 void
2644 mi_cmd_trace_start (const char *command, char **argv, int argc)
2645 {
2646 start_tracing (NULL);
2647 }
2648
2649 void
2650 mi_cmd_trace_status (const char *command, char **argv, int argc)
2651 {
2652 trace_status_mi (0);
2653 }
2654
2655 void
2656 mi_cmd_trace_stop (const char *command, char **argv, int argc)
2657 {
2658 stop_tracing (NULL);
2659 trace_status_mi (1);
2660 }
2661
2662 /* Implement the "-ada-task-info" command. */
2663
2664 void
2665 mi_cmd_ada_task_info (const char *command, char **argv, int argc)
2666 {
2667 if (argc != 0 && argc != 1)
2668 error (_("Invalid MI command"));
2669
2670 print_ada_task_info (current_uiout, argv[0], current_inferior ());
2671 }
2672
2673 /* Print EXPRESSION according to VALUES. */
2674
2675 static void
2676 print_variable_or_computed (const char *expression, enum print_values values)
2677 {
2678 struct cleanup *old_chain;
2679 struct value *val;
2680 struct type *type;
2681 struct ui_out *uiout = current_uiout;
2682
2683 string_file stb;
2684
2685 expression_up expr = parse_expression (expression);
2686
2687 if (values == PRINT_SIMPLE_VALUES)
2688 val = evaluate_type (expr.get ());
2689 else
2690 val = evaluate_expression (expr.get ());
2691
2692 old_chain = make_cleanup (null_cleanup, NULL);
2693 if (values != PRINT_NO_VALUES)
2694 make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
2695 uiout->field_string ("name", expression);
2696
2697 switch (values)
2698 {
2699 case PRINT_SIMPLE_VALUES:
2700 type = check_typedef (value_type (val));
2701 type_print (value_type (val), "", &stb, -1);
2702 uiout->field_stream ("type", stb);
2703 if (TYPE_CODE (type) != TYPE_CODE_ARRAY
2704 && TYPE_CODE (type) != TYPE_CODE_STRUCT
2705 && TYPE_CODE (type) != TYPE_CODE_UNION)
2706 {
2707 struct value_print_options opts;
2708
2709 get_no_prettyformat_print_options (&opts);
2710 opts.deref_ref = 1;
2711 common_val_print (val, &stb, 0, &opts, current_language);
2712 uiout->field_stream ("value", stb);
2713 }
2714 break;
2715 case PRINT_ALL_VALUES:
2716 {
2717 struct value_print_options opts;
2718
2719 get_no_prettyformat_print_options (&opts);
2720 opts.deref_ref = 1;
2721 common_val_print (val, &stb, 0, &opts, current_language);
2722 uiout->field_stream ("value", stb);
2723 }
2724 break;
2725 }
2726
2727 do_cleanups (old_chain);
2728 }
2729
2730 /* Implement the "-trace-frame-collected" command. */
2731
2732 void
2733 mi_cmd_trace_frame_collected (const char *command, char **argv, int argc)
2734 {
2735 struct cleanup *old_chain;
2736 struct bp_location *tloc;
2737 int stepping_frame;
2738 struct collection_list *clist;
2739 struct collection_list tracepoint_list, stepping_list;
2740 struct traceframe_info *tinfo;
2741 int oind = 0;
2742 enum print_values var_print_values = PRINT_ALL_VALUES;
2743 enum print_values comp_print_values = PRINT_ALL_VALUES;
2744 int registers_format = 'x';
2745 int memory_contents = 0;
2746 struct ui_out *uiout = current_uiout;
2747 enum opt
2748 {
2749 VAR_PRINT_VALUES,
2750 COMP_PRINT_VALUES,
2751 REGISTERS_FORMAT,
2752 MEMORY_CONTENTS,
2753 };
2754 static const struct mi_opt opts[] =
2755 {
2756 {"-var-print-values", VAR_PRINT_VALUES, 1},
2757 {"-comp-print-values", COMP_PRINT_VALUES, 1},
2758 {"-registers-format", REGISTERS_FORMAT, 1},
2759 {"-memory-contents", MEMORY_CONTENTS, 0},
2760 { 0, 0, 0 }
2761 };
2762
2763 while (1)
2764 {
2765 char *oarg;
2766 int opt = mi_getopt ("-trace-frame-collected", argc, argv, opts,
2767 &oind, &oarg);
2768 if (opt < 0)
2769 break;
2770 switch ((enum opt) opt)
2771 {
2772 case VAR_PRINT_VALUES:
2773 var_print_values = mi_parse_print_values (oarg);
2774 break;
2775 case COMP_PRINT_VALUES:
2776 comp_print_values = mi_parse_print_values (oarg);
2777 break;
2778 case REGISTERS_FORMAT:
2779 registers_format = oarg[0];
2780 case MEMORY_CONTENTS:
2781 memory_contents = 1;
2782 break;
2783 }
2784 }
2785
2786 if (oind != argc)
2787 error (_("Usage: -trace-frame-collected "
2788 "[--var-print-values PRINT_VALUES] "
2789 "[--comp-print-values PRINT_VALUES] "
2790 "[--registers-format FORMAT]"
2791 "[--memory-contents]"));
2792
2793 /* This throws an error is not inspecting a trace frame. */
2794 tloc = get_traceframe_location (&stepping_frame);
2795
2796 /* This command only makes sense for the current frame, not the
2797 selected frame. */
2798 old_chain = make_cleanup_restore_current_thread ();
2799 select_frame (get_current_frame ());
2800
2801 encode_actions (tloc, &tracepoint_list, &stepping_list);
2802
2803 if (stepping_frame)
2804 clist = &stepping_list;
2805 else
2806 clist = &tracepoint_list;
2807
2808 tinfo = get_traceframe_info ();
2809
2810 /* Explicitly wholly collected variables. */
2811 {
2812 struct cleanup *list_cleanup;
2813 int i;
2814
2815 list_cleanup = make_cleanup_ui_out_list_begin_end (uiout,
2816 "explicit-variables");
2817
2818 const std::vector<std::string> &wholly_collected
2819 = clist->wholly_collected ();
2820 for (size_t i = 0; i < wholly_collected.size (); i++)
2821 {
2822 const std::string &str = wholly_collected[i];
2823 print_variable_or_computed (str.c_str (), var_print_values);
2824 }
2825
2826 do_cleanups (list_cleanup);
2827 }
2828
2829 /* Computed expressions. */
2830 {
2831 struct cleanup *list_cleanup;
2832 char *p;
2833 int i;
2834
2835 list_cleanup
2836 = make_cleanup_ui_out_list_begin_end (uiout,
2837 "computed-expressions");
2838
2839 const std::vector<std::string> &computed = clist->computed ();
2840 for (size_t i = 0; i < computed.size (); i++)
2841 {
2842 const std::string &str = computed[i];
2843 print_variable_or_computed (str.c_str (), comp_print_values);
2844 }
2845
2846 do_cleanups (list_cleanup);
2847 }
2848
2849 /* Registers. Given pseudo-registers, and that some architectures
2850 (like MIPS) actually hide the raw registers, we don't go through
2851 the trace frame info, but instead consult the register cache for
2852 register availability. */
2853 {
2854 struct cleanup *list_cleanup;
2855 struct frame_info *frame;
2856 struct gdbarch *gdbarch;
2857 int regnum;
2858 int numregs;
2859
2860 list_cleanup = make_cleanup_ui_out_list_begin_end (uiout, "registers");
2861
2862 frame = get_selected_frame (NULL);
2863 gdbarch = get_frame_arch (frame);
2864 numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
2865
2866 for (regnum = 0; regnum < numregs; regnum++)
2867 {
2868 if (gdbarch_register_name (gdbarch, regnum) == NULL
2869 || *(gdbarch_register_name (gdbarch, regnum)) == '\0')
2870 continue;
2871
2872 output_register (frame, regnum, registers_format, 1);
2873 }
2874
2875 do_cleanups (list_cleanup);
2876 }
2877
2878 /* Trace state variables. */
2879 {
2880 struct cleanup *list_cleanup;
2881 int tvar;
2882 char *tsvname;
2883 int i;
2884
2885 list_cleanup = make_cleanup_ui_out_list_begin_end (uiout, "tvars");
2886
2887 tsvname = NULL;
2888 make_cleanup (free_current_contents, &tsvname);
2889
2890 for (i = 0; VEC_iterate (int, tinfo->tvars, i, tvar); i++)
2891 {
2892 struct cleanup *cleanup_child;
2893 struct trace_state_variable *tsv;
2894
2895 tsv = find_trace_state_variable_by_number (tvar);
2896
2897 cleanup_child = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
2898
2899 if (tsv != NULL)
2900 {
2901 tsvname = (char *) xrealloc (tsvname, strlen (tsv->name) + 2);
2902 tsvname[0] = '$';
2903 strcpy (tsvname + 1, tsv->name);
2904 uiout->field_string ("name", tsvname);
2905
2906 tsv->value_known = target_get_trace_state_variable_value (tsv->number,
2907 &tsv->value);
2908 uiout->field_int ("current", tsv->value);
2909 }
2910 else
2911 {
2912 uiout->field_skip ("name");
2913 uiout->field_skip ("current");
2914 }
2915
2916 do_cleanups (cleanup_child);
2917 }
2918
2919 do_cleanups (list_cleanup);
2920 }
2921
2922 /* Memory. */
2923 {
2924 struct cleanup *list_cleanup;
2925 VEC(mem_range_s) *available_memory = NULL;
2926 struct mem_range *r;
2927 int i;
2928
2929 traceframe_available_memory (&available_memory, 0, ULONGEST_MAX);
2930 make_cleanup (VEC_cleanup(mem_range_s), &available_memory);
2931
2932 list_cleanup = make_cleanup_ui_out_list_begin_end (uiout, "memory");
2933
2934 for (i = 0; VEC_iterate (mem_range_s, available_memory, i, r); i++)
2935 {
2936 struct cleanup *cleanup_child;
2937 gdb_byte *data;
2938 struct gdbarch *gdbarch = target_gdbarch ();
2939
2940 cleanup_child = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
2941
2942 uiout->field_core_addr ("address", gdbarch, r->start);
2943 uiout->field_int ("length", r->length);
2944
2945 data = (gdb_byte *) xmalloc (r->length);
2946 make_cleanup (xfree, data);
2947
2948 if (memory_contents)
2949 {
2950 if (target_read_memory (r->start, data, r->length) == 0)
2951 {
2952 int m;
2953 char *data_str, *p;
2954
2955 data_str = (char *) xmalloc (r->length * 2 + 1);
2956 make_cleanup (xfree, data_str);
2957
2958 for (m = 0, p = data_str; m < r->length; ++m, p += 2)
2959 sprintf (p, "%02x", data[m]);
2960 uiout->field_string ("contents", data_str);
2961 }
2962 else
2963 uiout->field_skip ("contents");
2964 }
2965 do_cleanups (cleanup_child);
2966 }
2967
2968 do_cleanups (list_cleanup);
2969 }
2970
2971 do_cleanups (old_chain);
2972 }
2973
2974 void
2975 _initialize_mi_main (void)
2976 {
2977 struct cmd_list_element *c;
2978
2979 add_setshow_boolean_cmd ("mi-async", class_run,
2980 &mi_async_1, _("\
2981 Set whether MI asynchronous mode is enabled."), _("\
2982 Show whether MI asynchronous mode is enabled."), _("\
2983 Tells GDB whether MI should be in asynchronous mode."),
2984 set_mi_async_command,
2985 show_mi_async_command,
2986 &setlist,
2987 &showlist);
2988
2989 /* Alias old "target-async" to "mi-async". */
2990 c = add_alias_cmd ("target-async", "mi-async", class_run, 0, &setlist);
2991 deprecate_cmd (c, "set mi-async");
2992 c = add_alias_cmd ("target-async", "mi-async", class_run, 0, &showlist);
2993 deprecate_cmd (c, "show mi-async");
2994 }
2995