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