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