ARI fixes: Add missing internationalization markups throughout
[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 (_("-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 (_("-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   if (argc != 0 && argc != 1)
507     error (_("Invalid MI command"));
508
509   print_thread_info (uiout, argv[0], -1);
510 }
511
512 struct collect_cores_data
513 {
514   int pid;
515
516   VEC (int) *cores;
517 };
518
519 static int
520 collect_cores (struct thread_info *ti, void *xdata)
521 {
522   struct collect_cores_data *data = xdata;
523
524   if (ptid_get_pid (ti->ptid) == data->pid)
525     {
526       int core = target_core_of_thread (ti->ptid);
527
528       if (core != -1)
529         VEC_safe_push (int, data->cores, core);
530     }
531
532   return 0;
533 }
534
535 static int *
536 unique (int *b, int *e)
537 {
538   int *d = b;
539
540   while (++b != e)
541     if (*d != *b)
542       *++d = *b;
543   return ++d;
544 }
545
546 struct print_one_inferior_data
547 {
548   int recurse;
549   VEC (int) *inferiors;
550 };
551
552 static int
553 print_one_inferior (struct inferior *inferior, void *xdata)
554 {
555   struct print_one_inferior_data *top_data = xdata;
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
677   /* This keeps a map from integer (pid) to VEC (struct osdata_item *)*
678      The vector contains information about all threads for the given pid.
679      This is assigned an initial value to avoid "may be used uninitialized"
680      warning from gcc.  */
681   splay_tree tree = NULL;
682
683   /* get_osdata will throw if it cannot return data.  */
684   data = get_osdata ("processes");
685   make_cleanup_osdata_free (data);
686
687   if (recurse)
688     {
689       struct osdata *threads = get_osdata ("threads");
690
691       make_cleanup_osdata_free (threads);
692       tree = splay_tree_new (splay_tree_int_comparator,
693                              do_nothing,
694                              free_vector_of_osdata_items);
695       make_cleanup (free_splay_tree, tree);
696
697       for (ix_items = 0;
698            VEC_iterate (osdata_item_s, threads->items,
699                         ix_items, item);
700            ix_items++)
701         {
702           const char *pid = get_osdata_column (item, "pid");
703           int pid_i = strtoul (pid, NULL, 0);
704           VEC (osdata_item_s) *vec = 0;
705
706           splay_tree_node n = splay_tree_lookup (tree, pid_i);
707           if (!n)
708             {
709               VEC_safe_push (osdata_item_s, vec, item);
710               splay_tree_insert (tree, pid_i, (splay_tree_value)vec);
711             }
712           else
713             {
714               vec = (VEC (osdata_item_s) *) n->value;
715               VEC_safe_push (osdata_item_s, vec, item);
716               n->value = (splay_tree_value) vec;
717             }
718         }
719     }
720
721   make_cleanup_ui_out_list_begin_end (uiout, "groups");
722
723   for (ix_items = 0;
724        VEC_iterate (osdata_item_s, data->items,
725                     ix_items, item);
726        ix_items++)
727     {
728       struct cleanup *back_to;
729
730       const char *pid = get_osdata_column (item, "pid");
731       const char *cmd = get_osdata_column (item, "command");
732       const char *user = get_osdata_column (item, "user");
733       const char *cores = get_osdata_column (item, "cores");
734
735       int pid_i = strtoul (pid, NULL, 0);
736
737       /* At present, the target will return all available processes
738          and if information about specific ones was required, we filter
739          undesired processes here.  */
740       if (ids && bsearch (&pid_i, VEC_address (int, ids),
741                           VEC_length (int, ids),
742                           sizeof (int), compare_positive_ints) == NULL)
743         continue;
744
745
746       back_to = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
747
748       ui_out_field_fmt (uiout, "id", "%s", pid);
749       ui_out_field_string (uiout, "type", "process");
750       if (cmd)
751         ui_out_field_string (uiout, "description", cmd);
752       if (user)
753         ui_out_field_string (uiout, "user", user);
754       if (cores)
755         output_cores (uiout, "cores", cores);
756
757       if (recurse)
758         {
759           splay_tree_node n = splay_tree_lookup (tree, pid_i);
760           if (n)
761             {
762               VEC (osdata_item_s) *children = (VEC (osdata_item_s) *) n->value;
763               struct osdata_item *child;
764               int ix_child;
765
766               make_cleanup_ui_out_list_begin_end (uiout, "threads");
767
768               for (ix_child = 0;
769                    VEC_iterate (osdata_item_s, children, ix_child, child);
770                    ++ix_child)
771                 {
772                   struct cleanup *back_to_2 =
773                     make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
774                   const char *tid = get_osdata_column (child, "tid");
775                   const char *tcore = get_osdata_column (child, "core");
776
777                   ui_out_field_string (uiout, "id", tid);
778                   if (tcore)
779                     ui_out_field_string (uiout, "core", tcore);
780
781                   do_cleanups (back_to_2);
782                 }
783             }
784         }
785
786       do_cleanups (back_to);
787     }
788 }
789
790 void
791 mi_cmd_list_thread_groups (char *command, char **argv, int argc)
792 {
793   struct cleanup *back_to;
794   int available = 0;
795   int recurse = 0;
796   VEC (int) *ids = 0;
797
798   enum opt
799     {
800       AVAILABLE_OPT, RECURSE_OPT
801     };
802   static struct mi_opt opts[] =
803   {
804     {"-available", AVAILABLE_OPT, 0},
805     {"-recurse", RECURSE_OPT, 1},
806     { 0, 0, 0 }
807   };
808
809   int optind = 0;
810   char *optarg;
811
812   while (1)
813     {
814       int opt = mi_getopt ("-list-thread-groups", argc, argv, opts,
815                            &optind, &optarg);
816
817       if (opt < 0)
818         break;
819       switch ((enum opt) opt)
820         {
821         case AVAILABLE_OPT:
822           available = 1;
823           break;
824         case RECURSE_OPT:
825           if (strcmp (optarg, "0") == 0)
826             ;
827           else if (strcmp (optarg, "1") == 0)
828             recurse = 1;
829           else
830             error (_("only '0' and '1' are valid values "
831                      "for the '--recurse' option"));
832           break;
833         }
834     }
835
836   for (; optind < argc; ++optind)
837     {
838       char *end;
839       int inf;
840
841       if (*(argv[optind]) != 'i')
842         error (_("invalid syntax of group id '%s'"), argv[optind]);
843
844       inf = strtoul (argv[optind] + 1, &end, 0);
845
846       if (*end != '\0')
847         error (_("invalid syntax of group id '%s'"), argv[optind]);
848       VEC_safe_push (int, ids, inf);
849     }
850   if (VEC_length (int, ids) > 1)
851     qsort (VEC_address (int, ids),
852            VEC_length (int, ids),
853            sizeof (int), compare_positive_ints);
854
855   back_to = make_cleanup (free_vector_of_ints, &ids);
856
857   if (available)
858     {
859       list_available_thread_groups (ids, recurse);
860     }
861   else if (VEC_length (int, ids) == 1)
862     {
863       /* Local thread groups, single id. */
864       int id = *VEC_address (int, ids);
865       struct inferior *inf = find_inferior_id (id);
866
867       if (!inf)
868         error (_("Non-existent thread group id '%d'"), id);
869       
870       print_thread_info (uiout, NULL, inf->pid);
871     }
872   else
873     {
874       struct print_one_inferior_data data;
875
876       data.recurse = recurse;
877       data.inferiors = ids;
878
879       /* Local thread groups.  Either no explicit ids -- and we
880          print everything, or several explicit ids.  In both cases,
881          we print more than one group, and have to use 'groups'
882          as the top-level element.  */
883       make_cleanup_ui_out_list_begin_end (uiout, "groups");
884       update_thread_list ();
885       iterate_over_inferiors (print_one_inferior, &data);
886     }
887
888   do_cleanups (back_to);
889 }
890
891 void
892 mi_cmd_data_list_register_names (char *command, char **argv, int argc)
893 {
894   struct gdbarch *gdbarch;
895   int regnum, numregs;
896   int i;
897   struct cleanup *cleanup;
898
899   /* Note that the test for a valid register must include checking the
900      gdbarch_register_name because gdbarch_num_regs may be allocated for
901      the union of the register sets within a family of related processors.
902      In this case, some entries of gdbarch_register_name will change depending
903      upon the particular processor being debugged.  */
904
905   gdbarch = get_current_arch ();
906   numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
907
908   cleanup = make_cleanup_ui_out_list_begin_end (uiout, "register-names");
909
910   if (argc == 0)                /* No args, just do all the regs.  */
911     {
912       for (regnum = 0;
913            regnum < numregs;
914            regnum++)
915         {
916           if (gdbarch_register_name (gdbarch, regnum) == NULL
917               || *(gdbarch_register_name (gdbarch, regnum)) == '\0')
918             ui_out_field_string (uiout, NULL, "");
919           else
920             ui_out_field_string (uiout, NULL,
921                                  gdbarch_register_name (gdbarch, regnum));
922         }
923     }
924
925   /* Else, list of register #s, just do listed regs.  */
926   for (i = 0; i < argc; i++)
927     {
928       regnum = atoi (argv[i]);
929       if (regnum < 0 || regnum >= numregs)
930         error (_("bad register number"));
931
932       if (gdbarch_register_name (gdbarch, regnum) == NULL
933           || *(gdbarch_register_name (gdbarch, regnum)) == '\0')
934         ui_out_field_string (uiout, NULL, "");
935       else
936         ui_out_field_string (uiout, NULL,
937                              gdbarch_register_name (gdbarch, regnum));
938     }
939   do_cleanups (cleanup);
940 }
941
942 void
943 mi_cmd_data_list_changed_registers (char *command, char **argv, int argc)
944 {
945   static struct regcache *this_regs = NULL;
946   struct regcache *prev_regs;
947   struct gdbarch *gdbarch;
948   int regnum, numregs, changed;
949   int i;
950   struct cleanup *cleanup;
951
952   /* The last time we visited this function, the current frame's register
953      contents were saved in THIS_REGS.  Move THIS_REGS over to PREV_REGS,
954      and refresh THIS_REGS with the now-current register contents.  */
955
956   prev_regs = this_regs;
957   this_regs = frame_save_as_regcache (get_selected_frame (NULL));
958   cleanup = make_cleanup_regcache_xfree (prev_regs);
959
960   /* Note that the test for a valid register must include checking the
961      gdbarch_register_name because gdbarch_num_regs may be allocated for
962      the union of the register sets within a family of related processors.
963      In this  case, some entries of gdbarch_register_name will change depending
964      upon the particular processor being debugged.  */
965
966   gdbarch = get_regcache_arch (this_regs);
967   numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
968
969   make_cleanup_ui_out_list_begin_end (uiout, "changed-registers");
970
971   if (argc == 0)                /* No args, just do all the regs.  */
972     {
973       for (regnum = 0;
974            regnum < numregs;
975            regnum++)
976         {
977           if (gdbarch_register_name (gdbarch, regnum) == NULL
978               || *(gdbarch_register_name (gdbarch, regnum)) == '\0')
979             continue;
980           changed = register_changed_p (regnum, prev_regs, this_regs);
981           if (changed < 0)
982             error (_("-data-list-changed-registers: "
983                      "Unable to read register contents."));
984           else if (changed)
985             ui_out_field_int (uiout, NULL, regnum);
986         }
987     }
988
989   /* Else, list of register #s, just do listed regs.  */
990   for (i = 0; i < argc; i++)
991     {
992       regnum = atoi (argv[i]);
993
994       if (regnum >= 0
995           && regnum < numregs
996           && gdbarch_register_name (gdbarch, regnum) != NULL
997           && *gdbarch_register_name (gdbarch, regnum) != '\000')
998         {
999           changed = register_changed_p (regnum, prev_regs, this_regs);
1000           if (changed < 0)
1001             error (_("-data-list-changed-registers: "
1002                      "Unable to read register contents."));
1003           else if (changed)
1004             ui_out_field_int (uiout, NULL, regnum);
1005         }
1006       else
1007         error (_("bad register number"));
1008     }
1009   do_cleanups (cleanup);
1010 }
1011
1012 static int
1013 register_changed_p (int regnum, struct regcache *prev_regs,
1014                     struct regcache *this_regs)
1015 {
1016   struct gdbarch *gdbarch = get_regcache_arch (this_regs);
1017   gdb_byte prev_buffer[MAX_REGISTER_SIZE];
1018   gdb_byte this_buffer[MAX_REGISTER_SIZE];
1019
1020   /* Registers not valid in this frame return count as unchanged.  */
1021   if (regcache_register_status (this_regs, regnum) == REG_UNKNOWN)
1022     return 0;
1023
1024   /* First time through or after gdbarch change consider all registers as
1025      changed.  Same for registers not valid in the previous frame.  */
1026   if (!prev_regs || get_regcache_arch (prev_regs) != gdbarch
1027       || regcache_register_status (prev_regs, regnum) == REG_UNKNOWN)
1028     return 1;
1029
1030   /* Get register contents and compare.  */
1031   regcache_cooked_read (prev_regs, regnum, prev_buffer);
1032   regcache_cooked_read (this_regs, regnum, this_buffer);
1033
1034   return memcmp (prev_buffer, this_buffer,
1035                  register_size (gdbarch, regnum)) != 0;
1036 }
1037
1038 /* Return a list of register number and value pairs.  The valid
1039    arguments expected are: a letter indicating the format in which to
1040    display the registers contents.  This can be one of: x (hexadecimal), d
1041    (decimal), N (natural), t (binary), o (octal), r (raw).  After the
1042    format argumetn there can be a sequence of numbers, indicating which
1043    registers to fetch the content of.  If the format is the only argument,
1044    a list of all the registers with their values is returned.  */
1045 void
1046 mi_cmd_data_list_register_values (char *command, char **argv, int argc)
1047 {
1048   struct frame_info *frame;
1049   struct gdbarch *gdbarch;
1050   int regnum, numregs, format;
1051   int i;
1052   struct cleanup *list_cleanup, *tuple_cleanup;
1053
1054   /* Note that the test for a valid register must include checking the
1055      gdbarch_register_name because gdbarch_num_regs may be allocated for
1056      the union of the register sets within a family of related processors.
1057      In this case, some entries of gdbarch_register_name will change depending
1058      upon the particular processor being debugged.  */
1059
1060   if (argc == 0)
1061     error (_("-data-list-register-values: Usage: "
1062              "-data-list-register-values <format> [<regnum1>...<regnumN>]"));
1063
1064   format = (int) argv[0][0];
1065
1066   frame = get_selected_frame (NULL);
1067   gdbarch = get_frame_arch (frame);
1068   numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
1069
1070   list_cleanup = make_cleanup_ui_out_list_begin_end (uiout, "register-values");
1071
1072   if (argc == 1)            /* No args, beside the format: do all the regs.  */
1073     {
1074       for (regnum = 0;
1075            regnum < numregs;
1076            regnum++)
1077         {
1078           if (gdbarch_register_name (gdbarch, regnum) == NULL
1079               || *(gdbarch_register_name (gdbarch, regnum)) == '\0')
1080             continue;
1081           tuple_cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
1082           ui_out_field_int (uiout, "number", regnum);
1083           get_register (frame, regnum, format);
1084           do_cleanups (tuple_cleanup);
1085         }
1086     }
1087
1088   /* Else, list of register #s, just do listed regs.  */
1089   for (i = 1; i < argc; i++)
1090     {
1091       regnum = atoi (argv[i]);
1092
1093       if (regnum >= 0
1094           && regnum < numregs
1095           && gdbarch_register_name (gdbarch, regnum) != NULL
1096           && *gdbarch_register_name (gdbarch, regnum) != '\000')
1097         {
1098           tuple_cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
1099           ui_out_field_int (uiout, "number", regnum);
1100           get_register (frame, regnum, format);
1101           do_cleanups (tuple_cleanup);
1102         }
1103       else
1104         error (_("bad register number"));
1105     }
1106   do_cleanups (list_cleanup);
1107 }
1108
1109 /* Output one register's contents in the desired format.  */
1110 static void
1111 get_register (struct frame_info *frame, int regnum, int format)
1112 {
1113   struct gdbarch *gdbarch = get_frame_arch (frame);
1114   CORE_ADDR addr;
1115   enum lval_type lval;
1116   static struct ui_stream *stb = NULL;
1117   struct value *val;
1118
1119   stb = ui_out_stream_new (uiout);
1120
1121   if (format == 'N')
1122     format = 0;
1123
1124   val = get_frame_register_value (frame, regnum);
1125
1126   if (value_optimized_out (val))
1127     error (_("Optimized out"));
1128
1129   if (format == 'r')
1130     {
1131       int j;
1132       char *ptr, buf[1024];
1133       const gdb_byte *valaddr = value_contents_for_printing (val);
1134
1135       strcpy (buf, "0x");
1136       ptr = buf + 2;
1137       for (j = 0; j < register_size (gdbarch, regnum); j++)
1138         {
1139           int idx = gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG ?
1140                     j : register_size (gdbarch, regnum) - 1 - j;
1141
1142           sprintf (ptr, "%02x", (unsigned char) valaddr[idx]);
1143           ptr += 2;
1144         }
1145       ui_out_field_string (uiout, "value", buf);
1146       /*fputs_filtered (buf, gdb_stdout); */
1147     }
1148   else
1149     {
1150       struct value_print_options opts;
1151
1152       get_formatted_print_options (&opts, format);
1153       opts.deref_ref = 1;
1154       val_print (value_type (val),
1155                  value_contents_for_printing (val),
1156                  value_embedded_offset (val), 0,
1157                  stb->stream, 0, val, &opts, current_language);
1158       ui_out_field_stream (uiout, "value", stb);
1159       ui_out_stream_delete (stb);
1160     }
1161 }
1162
1163 /* Write given values into registers. The registers and values are
1164    given as pairs.  The corresponding MI command is 
1165    -data-write-register-values <format>
1166                                [<regnum1> <value1>...<regnumN> <valueN>] */
1167 void
1168 mi_cmd_data_write_register_values (char *command, char **argv, int argc)
1169 {
1170   struct regcache *regcache;
1171   struct gdbarch *gdbarch;
1172   int numregs, i;
1173   char format;
1174
1175   /* Note that the test for a valid register must include checking the
1176      gdbarch_register_name because gdbarch_num_regs may be allocated for
1177      the union of the register sets within a family of related processors.
1178      In this case, some entries of gdbarch_register_name will change depending
1179      upon the particular processor being debugged.  */
1180
1181   regcache = get_current_regcache ();
1182   gdbarch = get_regcache_arch (regcache);
1183   numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
1184
1185   if (argc == 0)
1186     error (_("-data-write-register-values: Usage: -data-write-register-"
1187              "values <format> [<regnum1> <value1>...<regnumN> <valueN>]"));
1188
1189   format = (int) argv[0][0];
1190
1191   if (!target_has_registers)
1192     error (_("-data-write-register-values: No registers."));
1193
1194   if (!(argc - 1))
1195     error (_("-data-write-register-values: No regs and values specified."));
1196
1197   if ((argc - 1) % 2)
1198     error (_("-data-write-register-values: "
1199              "Regs and vals are not in pairs."));
1200
1201   for (i = 1; i < argc; i = i + 2)
1202     {
1203       int regnum = atoi (argv[i]);
1204
1205       if (regnum >= 0 && regnum < numregs
1206           && gdbarch_register_name (gdbarch, regnum)
1207           && *gdbarch_register_name (gdbarch, regnum))
1208         {
1209           LONGEST value;
1210
1211           /* Get the value as a number.  */
1212           value = parse_and_eval_address (argv[i + 1]);
1213
1214           /* Write it down.  */
1215           regcache_cooked_write_signed (regcache, regnum, value);
1216         }
1217       else
1218         error (_("bad register number"));
1219     }
1220 }
1221
1222 /* Evaluate the value of the argument.  The argument is an
1223    expression. If the expression contains spaces it needs to be
1224    included in double quotes.  */
1225 void
1226 mi_cmd_data_evaluate_expression (char *command, char **argv, int argc)
1227 {
1228   struct expression *expr;
1229   struct cleanup *old_chain = NULL;
1230   struct value *val;
1231   struct ui_stream *stb = NULL;
1232   struct value_print_options opts;
1233
1234   stb = ui_out_stream_new (uiout);
1235
1236   if (argc != 1)
1237     {
1238       ui_out_stream_delete (stb);
1239       error (_("-data-evaluate-expression: "
1240                "Usage: -data-evaluate-expression expression"));
1241     }
1242
1243   expr = parse_expression (argv[0]);
1244
1245   old_chain = make_cleanup (free_current_contents, &expr);
1246
1247   val = evaluate_expression (expr);
1248
1249   /* Print the result of the expression evaluation.  */
1250   get_user_print_options (&opts);
1251   opts.deref_ref = 0;
1252   common_val_print (val, stb->stream, 0, &opts, current_language);
1253
1254   ui_out_field_stream (uiout, "value", stb);
1255   ui_out_stream_delete (stb);
1256
1257   do_cleanups (old_chain);
1258 }
1259
1260 /* DATA-MEMORY-READ:
1261
1262    ADDR: start address of data to be dumped.
1263    WORD-FORMAT: a char indicating format for the ``word''.  See 
1264    the ``x'' command.
1265    WORD-SIZE: size of each ``word''; 1,2,4, or 8 bytes.
1266    NR_ROW: Number of rows.
1267    NR_COL: The number of colums (words per row).
1268    ASCHAR: (OPTIONAL) Append an ascii character dump to each row.  Use
1269    ASCHAR for unprintable characters.
1270
1271    Reads SIZE*NR_ROW*NR_COL bytes starting at ADDR from memory and
1272    displayes them.  Returns:
1273
1274    {addr="...",rowN={wordN="..." ,... [,ascii="..."]}, ...}
1275
1276    Returns: 
1277    The number of bytes read is SIZE*ROW*COL. */
1278
1279 void
1280 mi_cmd_data_read_memory (char *command, char **argv, int argc)
1281 {
1282   struct gdbarch *gdbarch = get_current_arch ();
1283   struct cleanup *cleanups = make_cleanup (null_cleanup, NULL);
1284   CORE_ADDR addr;
1285   long total_bytes;
1286   long nr_cols;
1287   long nr_rows;
1288   char word_format;
1289   struct type *word_type;
1290   long word_size;
1291   char word_asize;
1292   char aschar;
1293   gdb_byte *mbuf;
1294   int nr_bytes;
1295   long offset = 0;
1296   int optind = 0;
1297   char *optarg;
1298   enum opt
1299     {
1300       OFFSET_OPT
1301     };
1302   static struct mi_opt opts[] =
1303   {
1304     {"o", OFFSET_OPT, 1},
1305     { 0, 0, 0 }
1306   };
1307
1308   while (1)
1309     {
1310       int opt = mi_getopt ("-data-read-memory", argc, argv, opts,
1311                            &optind, &optarg);
1312
1313       if (opt < 0)
1314         break;
1315       switch ((enum opt) opt)
1316         {
1317         case OFFSET_OPT:
1318           offset = atol (optarg);
1319           break;
1320         }
1321     }
1322   argv += optind;
1323   argc -= optind;
1324
1325   if (argc < 5 || argc > 6)
1326     error (_("-data-read-memory: Usage: "
1327              "ADDR WORD-FORMAT WORD-SIZE NR-ROWS NR-COLS [ASCHAR]."));
1328
1329   /* Extract all the arguments. */
1330
1331   /* Start address of the memory dump.  */
1332   addr = parse_and_eval_address (argv[0]) + offset;
1333   /* The format character to use when displaying a memory word.  See
1334      the ``x'' command. */
1335   word_format = argv[1][0];
1336   /* The size of the memory word.  */
1337   word_size = atol (argv[2]);
1338   switch (word_size)
1339     {
1340     case 1:
1341       word_type = builtin_type (gdbarch)->builtin_int8;
1342       word_asize = 'b';
1343       break;
1344     case 2:
1345       word_type = builtin_type (gdbarch)->builtin_int16;
1346       word_asize = 'h';
1347       break;
1348     case 4:
1349       word_type = builtin_type (gdbarch)->builtin_int32;
1350       word_asize = 'w';
1351       break;
1352     case 8:
1353       word_type = builtin_type (gdbarch)->builtin_int64;
1354       word_asize = 'g';
1355       break;
1356     default:
1357       word_type = builtin_type (gdbarch)->builtin_int8;
1358       word_asize = 'b';
1359     }
1360   /* The number of rows.  */
1361   nr_rows = atol (argv[3]);
1362   if (nr_rows <= 0)
1363     error (_("-data-read-memory: invalid number of rows."));
1364
1365   /* Number of bytes per row.  */
1366   nr_cols = atol (argv[4]);
1367   if (nr_cols <= 0)
1368     error (_("-data-read-memory: invalid number of columns."));
1369
1370   /* The un-printable character when printing ascii.  */
1371   if (argc == 6)
1372     aschar = *argv[5];
1373   else
1374     aschar = 0;
1375
1376   /* Create a buffer and read it in.  */
1377   total_bytes = word_size * nr_rows * nr_cols;
1378   mbuf = xcalloc (total_bytes, 1);
1379   make_cleanup (xfree, mbuf);
1380
1381   /* Dispatch memory reads to the topmost target, not the flattened
1382      current_target.  */
1383   nr_bytes = target_read (current_target.beneath,
1384                           TARGET_OBJECT_MEMORY, NULL, mbuf,
1385                           addr, total_bytes);
1386   if (nr_bytes <= 0)
1387     error (_("Unable to read memory."));
1388
1389   /* Output the header information.  */
1390   ui_out_field_core_addr (uiout, "addr", gdbarch, addr);
1391   ui_out_field_int (uiout, "nr-bytes", nr_bytes);
1392   ui_out_field_int (uiout, "total-bytes", total_bytes);
1393   ui_out_field_core_addr (uiout, "next-row",
1394                           gdbarch, addr + word_size * nr_cols);
1395   ui_out_field_core_addr (uiout, "prev-row",
1396                           gdbarch, addr - word_size * nr_cols);
1397   ui_out_field_core_addr (uiout, "next-page", gdbarch, addr + total_bytes);
1398   ui_out_field_core_addr (uiout, "prev-page", gdbarch, addr - total_bytes);
1399
1400   /* Build the result as a two dimentional table.  */
1401   {
1402     struct ui_stream *stream = ui_out_stream_new (uiout);
1403     struct cleanup *cleanup_list_memory;
1404     int row;
1405     int row_byte;
1406
1407     cleanup_list_memory = make_cleanup_ui_out_list_begin_end (uiout, "memory");
1408     for (row = 0, row_byte = 0;
1409          row < nr_rows;
1410          row++, row_byte += nr_cols * word_size)
1411       {
1412         int col;
1413         int col_byte;
1414         struct cleanup *cleanup_tuple;
1415         struct cleanup *cleanup_list_data;
1416         struct value_print_options opts;
1417
1418         cleanup_tuple = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
1419         ui_out_field_core_addr (uiout, "addr", gdbarch, addr + row_byte);
1420         /* ui_out_field_core_addr_symbolic (uiout, "saddr", addr +
1421            row_byte); */
1422         cleanup_list_data = make_cleanup_ui_out_list_begin_end (uiout, "data");
1423         get_formatted_print_options (&opts, word_format);
1424         for (col = 0, col_byte = row_byte;
1425              col < nr_cols;
1426              col++, col_byte += word_size)
1427           {
1428             if (col_byte + word_size > nr_bytes)
1429               {
1430                 ui_out_field_string (uiout, NULL, "N/A");
1431               }
1432             else
1433               {
1434                 ui_file_rewind (stream->stream);
1435                 print_scalar_formatted (mbuf + col_byte, word_type, &opts,
1436                                         word_asize, stream->stream);
1437                 ui_out_field_stream (uiout, NULL, stream);
1438               }
1439           }
1440         do_cleanups (cleanup_list_data);
1441         if (aschar)
1442           {
1443             int byte;
1444
1445             ui_file_rewind (stream->stream);
1446             for (byte = row_byte;
1447                  byte < row_byte + word_size * nr_cols; byte++)
1448               {
1449                 if (byte >= nr_bytes)
1450                   {
1451                     fputc_unfiltered ('X', stream->stream);
1452                   }
1453                 else if (mbuf[byte] < 32 || mbuf[byte] > 126)
1454                   {
1455                     fputc_unfiltered (aschar, stream->stream);
1456                   }
1457                 else
1458                   fputc_unfiltered (mbuf[byte], stream->stream);
1459               }
1460             ui_out_field_stream (uiout, "ascii", stream);
1461           }
1462         do_cleanups (cleanup_tuple);
1463       }
1464     ui_out_stream_delete (stream);
1465     do_cleanups (cleanup_list_memory);
1466   }
1467   do_cleanups (cleanups);
1468 }
1469
1470 void
1471 mi_cmd_data_read_memory_bytes (char *command, char **argv, int argc)
1472 {
1473   struct gdbarch *gdbarch = get_current_arch ();
1474   struct cleanup *cleanups;
1475   CORE_ADDR addr;
1476   LONGEST length;
1477   memory_read_result_s *read_result;
1478   int ix;
1479   VEC(memory_read_result_s) *result;
1480   long offset = 0;
1481   int optind = 0;
1482   char *optarg;
1483   enum opt
1484     {
1485       OFFSET_OPT
1486     };
1487   static struct mi_opt opts[] =
1488   {
1489     {"o", OFFSET_OPT, 1},
1490     { 0, 0, 0 }
1491   };
1492
1493   while (1)
1494     {
1495       int opt = mi_getopt ("-data-read-memory-bytes", argc, argv, opts,
1496                            &optind, &optarg);
1497       if (opt < 0)
1498         break;
1499       switch ((enum opt) opt)
1500         {
1501         case OFFSET_OPT:
1502           offset = atol (optarg);
1503           break;
1504         }
1505     }
1506   argv += optind;
1507   argc -= optind;
1508
1509   if (argc != 2)
1510     error (_("Usage: [ -o OFFSET ] ADDR LENGTH."));
1511
1512   addr = parse_and_eval_address (argv[0]) + offset;
1513   length = atol (argv[1]);
1514
1515   result = read_memory_robust (current_target.beneath, addr, length);
1516
1517   cleanups = make_cleanup (free_memory_read_result_vector, result);
1518
1519   if (VEC_length (memory_read_result_s, result) == 0)
1520     error (_("Unable to read memory."));
1521
1522   make_cleanup_ui_out_list_begin_end (uiout, "memory");
1523   for (ix = 0;
1524        VEC_iterate (memory_read_result_s, result, ix, read_result);
1525        ++ix)
1526     {
1527       struct cleanup *t = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
1528       char *data, *p;
1529       int i;
1530
1531       ui_out_field_core_addr (uiout, "begin", gdbarch, read_result->begin);
1532       ui_out_field_core_addr (uiout, "offset", gdbarch, read_result->begin
1533                               - addr);
1534       ui_out_field_core_addr (uiout, "end", gdbarch, read_result->end);
1535
1536       data = xmalloc ((read_result->end - read_result->begin) * 2 + 1);
1537
1538       for (i = 0, p = data;
1539            i < (read_result->end - read_result->begin);
1540            ++i, p += 2)
1541         {
1542           sprintf (p, "%02x", read_result->data[i]);
1543         }
1544       ui_out_field_string (uiout, "contents", data);
1545       xfree (data);
1546       do_cleanups (t);
1547     }
1548   do_cleanups (cleanups);
1549 }
1550
1551
1552 /* DATA-MEMORY-WRITE:
1553
1554    COLUMN_OFFSET: optional argument. Must be preceeded by '-o'. The
1555    offset from the beginning of the memory grid row where the cell to
1556    be written is.
1557    ADDR: start address of the row in the memory grid where the memory
1558    cell is, if OFFSET_COLUMN is specified.  Otherwise, the address of
1559    the location to write to.
1560    FORMAT: a char indicating format for the ``word''.  See 
1561    the ``x'' command.
1562    WORD_SIZE: size of each ``word''; 1,2,4, or 8 bytes
1563    VALUE: value to be written into the memory address.
1564
1565    Writes VALUE into ADDR + (COLUMN_OFFSET * WORD_SIZE).
1566
1567    Prints nothing.  */
1568 void
1569 mi_cmd_data_write_memory (char *command, char **argv, int argc)
1570 {
1571   struct gdbarch *gdbarch = get_current_arch ();
1572   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1573   CORE_ADDR addr;
1574   char word_format;
1575   long word_size;
1576   /* FIXME: ezannoni 2000-02-17 LONGEST could possibly not be big
1577      enough when using a compiler other than GCC.  */
1578   LONGEST value;
1579   void *buffer;
1580   struct cleanup *old_chain;
1581   long offset = 0;
1582   int optind = 0;
1583   char *optarg;
1584   enum opt
1585     {
1586       OFFSET_OPT
1587     };
1588   static struct mi_opt opts[] =
1589   {
1590     {"o", OFFSET_OPT, 1},
1591     { 0, 0, 0 }
1592   };
1593
1594   while (1)
1595     {
1596       int opt = mi_getopt ("-data-write-memory", argc, argv, opts,
1597                            &optind, &optarg);
1598
1599       if (opt < 0)
1600         break;
1601       switch ((enum opt) opt)
1602         {
1603         case OFFSET_OPT:
1604           offset = atol (optarg);
1605           break;
1606         }
1607     }
1608   argv += optind;
1609   argc -= optind;
1610
1611   if (argc != 4)
1612     error (_("-data-write-memory: Usage: "
1613              "[-o COLUMN_OFFSET] ADDR FORMAT WORD-SIZE VALUE."));
1614
1615   /* Extract all the arguments.  */
1616   /* Start address of the memory dump.  */
1617   addr = parse_and_eval_address (argv[0]);
1618   /* The format character to use when displaying a memory word.  See
1619      the ``x'' command.  */
1620   word_format = argv[1][0];
1621   /* The size of the memory word. */
1622   word_size = atol (argv[2]);
1623
1624   /* Calculate the real address of the write destination.  */
1625   addr += (offset * word_size);
1626
1627   /* Get the value as a number.  */
1628   value = parse_and_eval_address (argv[3]);
1629   /* Get the value into an array.  */
1630   buffer = xmalloc (word_size);
1631   old_chain = make_cleanup (xfree, buffer);
1632   store_signed_integer (buffer, word_size, byte_order, value);
1633   /* Write it down to memory.  */
1634   write_memory (addr, buffer, word_size);
1635   /* Free the buffer.  */
1636   do_cleanups (old_chain);
1637 }
1638
1639 /* DATA-MEMORY-WRITE-RAW:
1640
1641    ADDR: start address
1642    DATA: string of bytes to write at that address. */
1643 void
1644 mi_cmd_data_write_memory_bytes (char *command, char **argv, int argc)
1645 {
1646   CORE_ADDR addr;
1647   char *cdata;
1648   gdb_byte *data;
1649   int len, r, i;
1650   struct cleanup *back_to;
1651
1652   if (argc != 2)
1653     error (_("Usage: ADDR DATA."));
1654
1655   addr = parse_and_eval_address (argv[0]);
1656   cdata = argv[1];
1657   len = strlen (cdata)/2;
1658
1659   data = xmalloc (len);
1660   back_to = make_cleanup (xfree, data);
1661
1662   for (i = 0; i < len; ++i)
1663     {
1664       int x;
1665       sscanf (cdata + i * 2, "%02x", &x);
1666       data[i] = (gdb_byte)x;
1667     }
1668
1669   r = target_write_memory (addr, data, len);
1670   if (r != 0)
1671     error (_("Could not write memory"));
1672
1673   do_cleanups (back_to);
1674 }
1675
1676
1677 void
1678 mi_cmd_enable_timings (char *command, char **argv, int argc)
1679 {
1680   if (argc == 0)
1681     do_timings = 1;
1682   else if (argc == 1)
1683     {
1684       if (strcmp (argv[0], "yes") == 0)
1685         do_timings = 1;
1686       else if (strcmp (argv[0], "no") == 0)
1687         do_timings = 0;
1688       else
1689         goto usage_error;
1690     }
1691   else
1692     goto usage_error;
1693     
1694   return;
1695
1696  usage_error:
1697   error (_("-enable-timings: Usage: %s {yes|no}"), command);
1698 }
1699
1700 void
1701 mi_cmd_list_features (char *command, char **argv, int argc)
1702 {
1703   if (argc == 0)
1704     {
1705       struct cleanup *cleanup = NULL;
1706
1707       cleanup = make_cleanup_ui_out_list_begin_end (uiout, "features");      
1708       ui_out_field_string (uiout, NULL, "frozen-varobjs");
1709       ui_out_field_string (uiout, NULL, "pending-breakpoints");
1710       ui_out_field_string (uiout, NULL, "thread-info");
1711       ui_out_field_string (uiout, NULL, "data-read-memory-bytes");
1712       
1713 #if HAVE_PYTHON
1714       ui_out_field_string (uiout, NULL, "python");
1715 #endif
1716       
1717       do_cleanups (cleanup);
1718       return;
1719     }
1720
1721   error (_("-list-features should be passed no arguments"));
1722 }
1723
1724 void
1725 mi_cmd_list_target_features (char *command, char **argv, int argc)
1726 {
1727   if (argc == 0)
1728     {
1729       struct cleanup *cleanup = NULL;
1730
1731       cleanup = make_cleanup_ui_out_list_begin_end (uiout, "features");      
1732       if (target_can_async_p ())
1733         ui_out_field_string (uiout, NULL, "async");
1734       if (target_can_execute_reverse)
1735         ui_out_field_string (uiout, NULL, "reverse");
1736       
1737       do_cleanups (cleanup);
1738       return;
1739     }
1740
1741   error (_("-list-target-features should be passed no arguments"));
1742 }
1743
1744 void
1745 mi_cmd_add_inferior (char *command, char **argv, int argc)
1746 {
1747   struct inferior *inf;
1748
1749   if (argc != 0)
1750     error (_("-add-inferior should be passed no arguments"));
1751
1752   inf = add_inferior_with_spaces ();
1753
1754   ui_out_field_fmt (uiout, "inferior", "i%d", inf->num);
1755 }
1756
1757 /* Callback used to find the first inferior other than the
1758    current one. */
1759    
1760 static int
1761 get_other_inferior (struct inferior *inf, void *arg)
1762 {
1763   if (inf == current_inferior ())
1764     return 0;
1765
1766   return 1;
1767 }
1768
1769 void
1770 mi_cmd_remove_inferior (char *command, char **argv, int argc)
1771 {
1772   int id;
1773   struct inferior *inf;
1774
1775   if (argc != 1)
1776     error (_("-remove-inferior should be passed a single argument"));
1777
1778   if (sscanf (argv[0], "i%d", &id) != 1)
1779     error (_("the thread group id is syntactically invalid"));
1780
1781   inf = find_inferior_id (id);
1782   if (!inf)
1783     error (_("the specified thread group does not exist"));
1784
1785   if (inf->pid != 0)
1786     error (_("cannot remove an active inferior"));
1787
1788   if (inf == current_inferior ())
1789     {
1790       struct thread_info *tp = 0;
1791       struct inferior *new_inferior 
1792         = iterate_over_inferiors (get_other_inferior, NULL);
1793
1794       if (new_inferior == NULL)
1795         error (_("Cannot remove last inferior"));
1796
1797       set_current_inferior (new_inferior);
1798       if (new_inferior->pid != 0)
1799         tp = any_thread_of_process (new_inferior->pid);
1800       switch_to_thread (tp ? tp->ptid : null_ptid);
1801       set_current_program_space (new_inferior->pspace);
1802     }
1803
1804   delete_inferior_1 (inf, 1 /* silent */);
1805 }
1806
1807 \f
1808
1809 /* Execute a command within a safe environment.
1810    Return <0 for error; >=0 for ok.
1811
1812    args->action will tell mi_execute_command what action
1813    to perfrom after the given command has executed (display/suppress
1814    prompt, display error). */
1815
1816 static void
1817 captured_mi_execute_command (struct ui_out *uiout, void *data)
1818 {
1819   struct cleanup *cleanup;
1820   struct mi_parse *context = (struct mi_parse *) data;
1821
1822   if (do_timings)
1823     current_command_ts = context->cmd_start;
1824
1825   current_token = xstrdup (context->token);
1826   cleanup = make_cleanup (free_current_contents, &current_token);
1827
1828   running_result_record_printed = 0;
1829   mi_proceeded = 0;
1830   switch (context->op)
1831     {
1832     case MI_COMMAND:
1833       /* A MI command was read from the input stream.  */
1834       if (mi_debug_p)
1835         /* FIXME: gdb_???? */
1836         fprintf_unfiltered (raw_stdout, " token=`%s' command=`%s' args=`%s'\n",
1837                             context->token, context->command, context->args);
1838
1839
1840       mi_cmd_execute (context);
1841
1842       /* Print the result if there were no errors.
1843
1844          Remember that on the way out of executing a command, you have
1845          to directly use the mi_interp's uiout, since the command could 
1846          have reset the interpreter, in which case the current uiout 
1847          will most likely crash in the mi_out_* routines.  */
1848       if (!running_result_record_printed)
1849         {
1850           fputs_unfiltered (context->token, raw_stdout);
1851           /* There's no particularly good reason why target-connect results
1852              in not ^done.  Should kill ^connected for MI3.  */
1853           fputs_unfiltered (strcmp (context->command, "target-select") == 0
1854                             ? "^connected" : "^done", raw_stdout);
1855           mi_out_put (uiout, raw_stdout);
1856           mi_out_rewind (uiout);
1857           mi_print_timing_maybe ();
1858           fputs_unfiltered ("\n", raw_stdout);
1859         }
1860       else
1861             /* The command does not want anything to be printed.  In that
1862                case, the command probably should not have written anything
1863                to uiout, but in case it has written something, discard it.  */
1864         mi_out_rewind (uiout);
1865       break;
1866
1867     case CLI_COMMAND:
1868       {
1869         char *argv[2];
1870
1871         /* A CLI command was read from the input stream.  */
1872         /* This "feature" will be removed as soon as we have a
1873            complete set of mi commands.  */
1874         /* Echo the command on the console.  */
1875         fprintf_unfiltered (gdb_stdlog, "%s\n", context->command);
1876         /* Call the "console" interpreter.  */
1877         argv[0] = "console";
1878         argv[1] = context->command;
1879         mi_cmd_interpreter_exec ("-interpreter-exec", argv, 2);
1880
1881         /* If we changed interpreters, DON'T print out anything.  */
1882         if (current_interp_named_p (INTERP_MI)
1883             || current_interp_named_p (INTERP_MI1)
1884             || current_interp_named_p (INTERP_MI2)
1885             || current_interp_named_p (INTERP_MI3))
1886           {
1887             if (!running_result_record_printed)
1888               {
1889                 fputs_unfiltered (context->token, raw_stdout);
1890                 fputs_unfiltered ("^done", raw_stdout);
1891                 mi_out_put (uiout, raw_stdout);
1892                 mi_out_rewind (uiout);
1893                 mi_print_timing_maybe ();
1894                 fputs_unfiltered ("\n", raw_stdout);            
1895               }
1896             else
1897               mi_out_rewind (uiout);
1898           }
1899         break;
1900       }
1901
1902     }
1903
1904   do_cleanups (cleanup);
1905
1906   return;
1907 }
1908
1909 /* Print a gdb exception to the MI output stream.  */
1910
1911 static void
1912 mi_print_exception (const char *token, struct gdb_exception exception)
1913 {
1914   fputs_unfiltered (token, raw_stdout);
1915   fputs_unfiltered ("^error,msg=\"", raw_stdout);
1916   if (exception.message == NULL)
1917     fputs_unfiltered ("unknown error", raw_stdout);
1918   else
1919     fputstr_unfiltered (exception.message, '"', raw_stdout);
1920   fputs_unfiltered ("\"\n", raw_stdout);
1921 }
1922
1923 void
1924 mi_execute_command (char *cmd, int from_tty)
1925 {
1926   char *token;
1927   struct mi_parse *command = NULL;
1928   volatile struct gdb_exception exception;
1929
1930   /* This is to handle EOF (^D). We just quit gdb.  */
1931   /* FIXME: we should call some API function here.  */
1932   if (cmd == 0)
1933     quit_force (NULL, from_tty);
1934
1935   target_log_command (cmd);
1936
1937   TRY_CATCH (exception, RETURN_MASK_ALL)
1938     {
1939       command = mi_parse (cmd, &token);
1940     }
1941   if (exception.reason < 0)
1942     {
1943       mi_print_exception (token, exception);
1944       xfree (token);
1945     }
1946   else
1947     {
1948       struct gdb_exception result;
1949       ptid_t previous_ptid = inferior_ptid;
1950
1951       command->token = token;
1952
1953       if (do_timings)
1954         {
1955           command->cmd_start = (struct mi_timestamp *)
1956             xmalloc (sizeof (struct mi_timestamp));
1957           timestamp (command->cmd_start);
1958         }
1959
1960       result = catch_exception (uiout, captured_mi_execute_command, command,
1961                                 RETURN_MASK_ALL);
1962       if (result.reason < 0)
1963         {
1964           /* The command execution failed and error() was called
1965              somewhere.  */
1966           mi_print_exception (command->token, result);
1967           mi_out_rewind (uiout);
1968         }
1969
1970       bpstat_do_actions ();
1971
1972       if (/* The notifications are only output when the top-level
1973              interpreter (specified on the command line) is MI.  */      
1974           ui_out_is_mi_like_p (interp_ui_out (top_level_interpreter ()))
1975           /* Don't try report anything if there are no threads -- 
1976              the program is dead.  */
1977           && thread_count () != 0
1978           /* -thread-select explicitly changes thread. If frontend uses that
1979              internally, we don't want to emit =thread-selected, since
1980              =thread-selected is supposed to indicate user's intentions.  */
1981           && strcmp (command->command, "thread-select") != 0)
1982         {
1983           struct mi_interp *mi = top_level_interpreter_data ();
1984           int report_change = 0;
1985
1986           if (command->thread == -1)
1987             {
1988               report_change = (!ptid_equal (previous_ptid, null_ptid)
1989                                && !ptid_equal (inferior_ptid, previous_ptid)
1990                                && !ptid_equal (inferior_ptid, null_ptid));
1991             }
1992           else if (!ptid_equal (inferior_ptid, null_ptid))
1993             {
1994               struct thread_info *ti = inferior_thread ();
1995
1996               report_change = (ti->num != command->thread);
1997             }
1998
1999           if (report_change)
2000             {     
2001               struct thread_info *ti = inferior_thread ();
2002
2003               target_terminal_ours ();
2004               fprintf_unfiltered (mi->event_channel, 
2005                                   "thread-selected,id=\"%d\"",
2006                                   ti->num);
2007               gdb_flush (mi->event_channel);
2008             }
2009         }
2010
2011       mi_parse_free (command);
2012     }
2013
2014   fputs_unfiltered ("(gdb) \n", raw_stdout);
2015   gdb_flush (raw_stdout);
2016   /* Print any buffered hook code.  */
2017   /* ..... */
2018 }
2019
2020 static void
2021 mi_cmd_execute (struct mi_parse *parse)
2022 {
2023   struct cleanup *cleanup;
2024
2025   prepare_execute_command ();
2026
2027   cleanup = make_cleanup (null_cleanup, NULL);
2028
2029   if (parse->all && parse->thread_group != -1)
2030     error (_("Cannot specify --thread-group together with --all"));
2031
2032   if (parse->all && parse->thread != -1)
2033     error (_("Cannot specify --thread together with --all"));
2034
2035   if (parse->thread_group != -1 && parse->thread != -1)
2036     error (_("Cannot specify --thread together with --thread-group"));
2037
2038   if (parse->frame != -1 && parse->thread == -1)
2039     error (_("Cannot specify --frame without --thread"));
2040
2041   if (parse->thread_group != -1)
2042     {
2043       struct inferior *inf = find_inferior_id (parse->thread_group);
2044       struct thread_info *tp = 0;
2045
2046       if (!inf)
2047         error (_("Invalid thread group for the --thread-group option"));
2048
2049       set_current_inferior (inf);
2050       /* This behaviour means that if --thread-group option identifies
2051          an inferior with multiple threads, then a random one will be picked.
2052          This is not a problem -- frontend should always provide --thread if
2053          it wishes to operate on a specific thread.  */
2054       if (inf->pid != 0)
2055         tp = any_thread_of_process (inf->pid);
2056       switch_to_thread (tp ? tp->ptid : null_ptid);
2057       set_current_program_space (inf->pspace);
2058     }
2059
2060   if (parse->thread != -1)
2061     {
2062       struct thread_info *tp = find_thread_id (parse->thread);
2063
2064       if (!tp)
2065         error (_("Invalid thread id: %d"), parse->thread);
2066
2067       if (is_exited (tp->ptid))
2068         error (_("Thread id: %d has terminated"), parse->thread);
2069
2070       switch_to_thread (tp->ptid);
2071     }
2072
2073   if (parse->frame != -1)
2074     {
2075       struct frame_info *fid;
2076       int frame = parse->frame;
2077
2078       fid = find_relative_frame (get_current_frame (), &frame);
2079       if (frame == 0)
2080         /* find_relative_frame was successful */
2081         select_frame (fid);
2082       else
2083         error (_("Invalid frame id: %d"), frame);
2084     }
2085
2086   current_context = parse;
2087
2088   if (parse->cmd->argv_func != NULL)
2089     parse->cmd->argv_func (parse->command, parse->argv, parse->argc);
2090   else if (parse->cmd->cli.cmd != 0)
2091     {
2092       /* FIXME: DELETE THIS. */
2093       /* The operation is still implemented by a cli command.  */
2094       /* Must be a synchronous one.  */
2095       mi_execute_cli_command (parse->cmd->cli.cmd, parse->cmd->cli.args_p,
2096                               parse->args);
2097     }
2098   else
2099     {
2100       /* FIXME: DELETE THIS.  */
2101       struct ui_file *stb;
2102
2103       stb = mem_fileopen ();
2104
2105       fputs_unfiltered ("Undefined mi command: ", stb);
2106       fputstr_unfiltered (parse->command, '"', stb);
2107       fputs_unfiltered (" (missing implementation)", stb);
2108
2109       make_cleanup_ui_file_delete (stb);
2110       error_stream (stb);
2111     }
2112   do_cleanups (cleanup);
2113 }
2114
2115 /* FIXME: This is just a hack so we can get some extra commands going.
2116    We don't want to channel things through the CLI, but call libgdb directly.
2117    Use only for synchronous commands.  */
2118
2119 void
2120 mi_execute_cli_command (const char *cmd, int args_p, const char *args)
2121 {
2122   if (cmd != 0)
2123     {
2124       struct cleanup *old_cleanups;
2125       char *run;
2126
2127       if (args_p)
2128         run = xstrprintf ("%s %s", cmd, args);
2129       else
2130         run = xstrdup (cmd);
2131       if (mi_debug_p)
2132         /* FIXME: gdb_???? */
2133         fprintf_unfiltered (gdb_stdout, "cli=%s run=%s\n",
2134                             cmd, run);
2135       old_cleanups = make_cleanup (xfree, run);
2136       execute_command ( /*ui */ run, 0 /*from_tty */ );
2137       do_cleanups (old_cleanups);
2138       return;
2139     }
2140 }
2141
2142 void
2143 mi_execute_async_cli_command (char *cli_command, char **argv, int argc)
2144 {
2145   struct cleanup *old_cleanups;
2146   char *run;
2147
2148   if (target_can_async_p ())
2149     run = xstrprintf ("%s %s&", cli_command, argc ? *argv : "");
2150   else
2151     run = xstrprintf ("%s %s", cli_command, argc ? *argv : "");
2152   old_cleanups = make_cleanup (xfree, run);  
2153
2154   execute_command ( /*ui */ run, 0 /*from_tty */ );
2155
2156   if (target_can_async_p ())
2157     {
2158       /* If we're not executing, an exception should have been throw.  */
2159       gdb_assert (is_running (inferior_ptid));
2160       do_cleanups (old_cleanups);
2161     }
2162   else
2163     {
2164       /* Do this before doing any printing.  It would appear that some
2165          print code leaves garbage around in the buffer.  */
2166       do_cleanups (old_cleanups);
2167     }
2168 }
2169
2170 void
2171 mi_load_progress (const char *section_name,
2172                   unsigned long sent_so_far,
2173                   unsigned long total_section,
2174                   unsigned long total_sent,
2175                   unsigned long grand_total)
2176 {
2177   struct timeval time_now, delta, update_threshold;
2178   static struct timeval last_update;
2179   static char *previous_sect_name = NULL;
2180   int new_section;
2181   struct ui_out *saved_uiout;
2182
2183   /* This function is called through deprecated_show_load_progress
2184      which means uiout may not be correct.  Fix it for the duration
2185      of this function.  */
2186   saved_uiout = uiout;
2187
2188   if (current_interp_named_p (INTERP_MI)
2189       || current_interp_named_p (INTERP_MI2))
2190     uiout = mi_out_new (2);
2191   else if (current_interp_named_p (INTERP_MI1))
2192     uiout = mi_out_new (1);
2193   else if (current_interp_named_p (INTERP_MI3))
2194     uiout = mi_out_new (3);
2195   else
2196     return;
2197
2198   update_threshold.tv_sec = 0;
2199   update_threshold.tv_usec = 500000;
2200   gettimeofday (&time_now, NULL);
2201
2202   delta.tv_usec = time_now.tv_usec - last_update.tv_usec;
2203   delta.tv_sec = time_now.tv_sec - last_update.tv_sec;
2204
2205   if (delta.tv_usec < 0)
2206     {
2207       delta.tv_sec -= 1;
2208       delta.tv_usec += 1000000L;
2209     }
2210
2211   new_section = (previous_sect_name ?
2212                  strcmp (previous_sect_name, section_name) : 1);
2213   if (new_section)
2214     {
2215       struct cleanup *cleanup_tuple;
2216
2217       xfree (previous_sect_name);
2218       previous_sect_name = xstrdup (section_name);
2219
2220       if (current_token)
2221         fputs_unfiltered (current_token, raw_stdout);
2222       fputs_unfiltered ("+download", raw_stdout);
2223       cleanup_tuple = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
2224       ui_out_field_string (uiout, "section", section_name);
2225       ui_out_field_int (uiout, "section-size", total_section);
2226       ui_out_field_int (uiout, "total-size", grand_total);
2227       do_cleanups (cleanup_tuple);
2228       mi_out_put (uiout, raw_stdout);
2229       fputs_unfiltered ("\n", raw_stdout);
2230       gdb_flush (raw_stdout);
2231     }
2232
2233   if (delta.tv_sec >= update_threshold.tv_sec &&
2234       delta.tv_usec >= update_threshold.tv_usec)
2235     {
2236       struct cleanup *cleanup_tuple;
2237
2238       last_update.tv_sec = time_now.tv_sec;
2239       last_update.tv_usec = time_now.tv_usec;
2240       if (current_token)
2241         fputs_unfiltered (current_token, raw_stdout);
2242       fputs_unfiltered ("+download", raw_stdout);
2243       cleanup_tuple = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
2244       ui_out_field_string (uiout, "section", section_name);
2245       ui_out_field_int (uiout, "section-sent", sent_so_far);
2246       ui_out_field_int (uiout, "section-size", total_section);
2247       ui_out_field_int (uiout, "total-sent", total_sent);
2248       ui_out_field_int (uiout, "total-size", grand_total);
2249       do_cleanups (cleanup_tuple);
2250       mi_out_put (uiout, raw_stdout);
2251       fputs_unfiltered ("\n", raw_stdout);
2252       gdb_flush (raw_stdout);
2253     }
2254
2255   xfree (uiout);
2256   uiout = saved_uiout;
2257 }
2258
2259 static void 
2260 timestamp (struct mi_timestamp *tv)
2261   {
2262     gettimeofday (&tv->wallclock, NULL);
2263 #ifdef HAVE_GETRUSAGE
2264     getrusage (RUSAGE_SELF, &rusage);
2265     tv->utime.tv_sec = rusage.ru_utime.tv_sec;
2266     tv->utime.tv_usec = rusage.ru_utime.tv_usec;
2267     tv->stime.tv_sec = rusage.ru_stime.tv_sec;
2268     tv->stime.tv_usec = rusage.ru_stime.tv_usec;
2269 #else
2270     {
2271       long usec = get_run_time ();
2272
2273       tv->utime.tv_sec = usec/1000000L;
2274       tv->utime.tv_usec = usec - 1000000L*tv->utime.tv_sec;
2275       tv->stime.tv_sec = 0;
2276       tv->stime.tv_usec = 0;
2277     }
2278 #endif
2279   }
2280
2281 static void 
2282 print_diff_now (struct mi_timestamp *start)
2283   {
2284     struct mi_timestamp now;
2285
2286     timestamp (&now);
2287     print_diff (start, &now);
2288   }
2289
2290 void
2291 mi_print_timing_maybe (void)
2292 {
2293   /* If the command is -enable-timing then do_timings may be
2294      true whilst current_command_ts is not initialized.  */
2295   if (do_timings && current_command_ts)
2296     print_diff_now (current_command_ts);
2297 }
2298
2299 static long 
2300 timeval_diff (struct timeval start, struct timeval end)
2301   {
2302     return ((end.tv_sec - start.tv_sec) * 1000000L)
2303       + (end.tv_usec - start.tv_usec);
2304   }
2305
2306 static void 
2307 print_diff (struct mi_timestamp *start, struct mi_timestamp *end)
2308   {
2309     fprintf_unfiltered
2310       (raw_stdout,
2311        ",time={wallclock=\"%0.5f\",user=\"%0.5f\",system=\"%0.5f\"}", 
2312        timeval_diff (start->wallclock, end->wallclock) / 1000000.0, 
2313        timeval_diff (start->utime, end->utime) / 1000000.0, 
2314        timeval_diff (start->stime, end->stime) / 1000000.0);
2315   }
2316
2317 void
2318 mi_cmd_trace_define_variable (char *command, char **argv, int argc)
2319 {
2320   struct expression *expr;
2321   struct cleanup *back_to;
2322   LONGEST initval = 0;
2323   struct trace_state_variable *tsv;
2324   char *name = 0;
2325
2326   if (argc != 1 && argc != 2)
2327     error (_("Usage: -trace-define-variable VARIABLE [VALUE]"));
2328
2329   expr = parse_expression (argv[0]);
2330   back_to = make_cleanup (xfree, expr);
2331
2332   if (expr->nelts == 3 && expr->elts[0].opcode == OP_INTERNALVAR)
2333     {
2334       struct internalvar *intvar = expr->elts[1].internalvar;
2335
2336       if (intvar)
2337         name = internalvar_name (intvar);
2338     }
2339
2340   if (!name || *name == '\0')
2341     error (_("Invalid name of trace variable"));
2342
2343   tsv = find_trace_state_variable (name);
2344   if (!tsv)
2345     tsv = create_trace_state_variable (name);
2346
2347   if (argc == 2)
2348     initval = value_as_long (parse_and_eval (argv[1]));
2349
2350   tsv->initial_value = initval;
2351
2352   do_cleanups (back_to);
2353 }
2354
2355 void
2356 mi_cmd_trace_list_variables (char *command, char **argv, int argc)
2357 {
2358   if (argc != 0)
2359     error (_("-trace-list-variables: no arguments are allowed"));
2360
2361   tvariables_info_1 ();
2362 }
2363
2364 void
2365 mi_cmd_trace_find (char *command, char **argv, int argc)
2366 {
2367   char *mode;
2368
2369   if (argc == 0)
2370     error (_("trace selection mode is required"));
2371
2372   mode = argv[0];
2373
2374   if (strcmp (mode, "none") == 0)
2375     {
2376       tfind_1 (tfind_number, -1, 0, 0, 0);
2377       return;
2378     }
2379
2380   if (current_trace_status ()->running)
2381     error (_("May not look at trace frames while trace is running."));
2382
2383   if (strcmp (mode, "frame-number") == 0)
2384     {
2385       if (argc != 2)
2386         error (_("frame number is required"));
2387       tfind_1 (tfind_number, atoi (argv[1]), 0, 0, 0);
2388     }
2389   else if (strcmp (mode, "tracepoint-number") == 0)
2390     {
2391       if (argc != 2)
2392         error (_("tracepoint number is required"));
2393       tfind_1 (tfind_tp, atoi (argv[1]), 0, 0, 0);
2394     }
2395   else if (strcmp (mode, "pc") == 0)
2396     {
2397       if (argc != 2)
2398         error (_("PC is required"));
2399       tfind_1 (tfind_pc, 0, parse_and_eval_address (argv[1]), 0, 0);
2400     }
2401   else if (strcmp (mode, "pc-inside-range") == 0)
2402     {
2403       if (argc != 3)
2404         error (_("Start and end PC are required"));
2405       tfind_1 (tfind_range, 0, parse_and_eval_address (argv[1]),
2406                parse_and_eval_address (argv[2]), 0);
2407     }
2408   else if (strcmp (mode, "pc-outside-range") == 0)
2409     {
2410       if (argc != 3)
2411         error (_("Start and end PC are required"));
2412       tfind_1 (tfind_outside, 0, parse_and_eval_address (argv[1]),
2413                parse_and_eval_address (argv[2]), 0);
2414     }
2415   else if (strcmp (mode, "line") == 0)
2416     {
2417       struct symtabs_and_lines sals;
2418       struct symtab_and_line sal;
2419       static CORE_ADDR start_pc, end_pc;
2420       struct cleanup *back_to;
2421
2422       if (argc != 2)
2423         error (_("Line is required"));
2424
2425       sals = decode_line_spec (argv[1], 1);
2426       back_to = make_cleanup (xfree, sals.sals);
2427
2428       sal = sals.sals[0];
2429
2430       if (sal.symtab == 0)
2431         error (_("Could not find the specified line"));
2432
2433       if (sal.line > 0 && find_line_pc_range (sal, &start_pc, &end_pc))
2434         tfind_1 (tfind_range, 0, start_pc, end_pc - 1, 0);
2435       else
2436         error (_("Could not find the specified line"));
2437
2438       do_cleanups (back_to);
2439     }
2440   else
2441     error (_("Invalid mode '%s'"), mode);
2442
2443   if (has_stack_frames () || get_traceframe_number () >= 0)
2444     {
2445       print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC);
2446     }
2447 }
2448
2449 void
2450 mi_cmd_trace_save (char *command, char **argv, int argc)
2451 {
2452   int target_saves = 0;
2453   char *filename;
2454
2455   if (argc != 1 && argc != 2)
2456     error (_("Usage: -trace-save [-r] filename"));
2457
2458   if (argc == 2)
2459     {
2460       filename = argv[1];
2461       if (strcmp (argv[0], "-r") == 0)
2462         target_saves = 1;
2463       else
2464         error (_("Invalid option: %s"), argv[0]);
2465     }
2466   else
2467     {
2468       filename = argv[0];
2469     }
2470
2471   trace_save (filename, target_saves);
2472 }
2473
2474
2475 void
2476 mi_cmd_trace_start (char *command, char **argv, int argc)
2477 {
2478   start_tracing ();
2479 }
2480
2481 void
2482 mi_cmd_trace_status (char *command, char **argv, int argc)
2483 {
2484   trace_status_mi (0);
2485 }
2486
2487 void
2488 mi_cmd_trace_stop (char *command, char **argv, int argc)
2489 {
2490   stop_tracing ();
2491   trace_status_mi (1);
2492 }