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