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