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