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