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