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