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