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