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