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