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