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