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