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