* mi/mi-main.c (get_register): Use get_frame_register_value rather
[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   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 ("-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 ("-data-list-changed-registers: "
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_register_status (this_regs, regnum) == REG_UNKNOWN)
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_register_status (prev_regs, regnum) == REG_UNKNOWN)
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 ("-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   CORE_ADDR addr;
1120   enum lval_type lval;
1121   static struct ui_stream *stb = NULL;
1122   struct value *val;
1123
1124   stb = ui_out_stream_new (uiout);
1125
1126   if (format == 'N')
1127     format = 0;
1128
1129   val = get_frame_register_value (frame, regnum);
1130
1131   if (value_optimized_out (val))
1132     error ("Optimized out");
1133
1134   if (format == 'r')
1135     {
1136       int j;
1137       char *ptr, buf[1024];
1138       const gdb_byte *valaddr = value_contents_for_printing (val);
1139
1140       strcpy (buf, "0x");
1141       ptr = buf + 2;
1142       for (j = 0; j < register_size (gdbarch, regnum); j++)
1143         {
1144           int idx = gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG ?
1145                     j : register_size (gdbarch, regnum) - 1 - j;
1146
1147           sprintf (ptr, "%02x", (unsigned char) valaddr[idx]);
1148           ptr += 2;
1149         }
1150       ui_out_field_string (uiout, "value", buf);
1151       /*fputs_filtered (buf, gdb_stdout); */
1152     }
1153   else
1154     {
1155       struct value_print_options opts;
1156
1157       get_formatted_print_options (&opts, format);
1158       opts.deref_ref = 1;
1159       val_print (value_type (val),
1160                  value_contents_for_printing (val),
1161                  value_embedded_offset (val), 0,
1162                  stb->stream, 0, val, &opts, current_language);
1163       ui_out_field_stream (uiout, "value", stb);
1164       ui_out_stream_delete (stb);
1165     }
1166 }
1167
1168 /* Write given values into registers. The registers and values are
1169    given as pairs.  The corresponding MI command is 
1170    -data-write-register-values <format>
1171                                [<regnum1> <value1>...<regnumN> <valueN>] */
1172 void
1173 mi_cmd_data_write_register_values (char *command, char **argv, int argc)
1174 {
1175   struct regcache *regcache;
1176   struct gdbarch *gdbarch;
1177   int numregs, i;
1178   char format;
1179
1180   /* Note that the test for a valid register must include checking the
1181      gdbarch_register_name because gdbarch_num_regs may be allocated for
1182      the union of the register sets within a family of related processors.
1183      In this case, some entries of gdbarch_register_name will change depending
1184      upon the particular processor being debugged.  */
1185
1186   regcache = get_current_regcache ();
1187   gdbarch = get_regcache_arch (regcache);
1188   numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
1189
1190   if (argc == 0)
1191     error ("-data-write-register-values: Usage: -data-write-register-"
1192            "values <format> [<regnum1> <value1>...<regnumN> <valueN>]");
1193
1194   format = (int) argv[0][0];
1195
1196   if (!target_has_registers)
1197     error ("-data-write-register-values: No registers.");
1198
1199   if (!(argc - 1))
1200     error ("-data-write-register-values: No regs and values specified.");
1201
1202   if ((argc - 1) % 2)
1203     error ("-data-write-register-values: "
1204            "Regs and vals are not in pairs.");
1205
1206   for (i = 1; i < argc; i = i + 2)
1207     {
1208       int regnum = atoi (argv[i]);
1209
1210       if (regnum >= 0 && regnum < numregs
1211           && gdbarch_register_name (gdbarch, regnum)
1212           && *gdbarch_register_name (gdbarch, regnum))
1213         {
1214           LONGEST value;
1215
1216           /* Get the value as a number.  */
1217           value = parse_and_eval_address (argv[i + 1]);
1218
1219           /* Write it down.  */
1220           regcache_cooked_write_signed (regcache, regnum, value);
1221         }
1222       else
1223         error ("bad register number");
1224     }
1225 }
1226
1227 /* Evaluate the value of the argument.  The argument is an
1228    expression. If the expression contains spaces it needs to be
1229    included in double quotes.  */
1230 void
1231 mi_cmd_data_evaluate_expression (char *command, char **argv, int argc)
1232 {
1233   struct expression *expr;
1234   struct cleanup *old_chain = NULL;
1235   struct value *val;
1236   struct ui_stream *stb = NULL;
1237   struct value_print_options opts;
1238
1239   stb = ui_out_stream_new (uiout);
1240
1241   if (argc != 1)
1242     {
1243       ui_out_stream_delete (stb);
1244       error ("-data-evaluate-expression: "
1245              "Usage: -data-evaluate-expression expression");
1246     }
1247
1248   expr = parse_expression (argv[0]);
1249
1250   old_chain = make_cleanup (free_current_contents, &expr);
1251
1252   val = evaluate_expression (expr);
1253
1254   /* Print the result of the expression evaluation.  */
1255   get_user_print_options (&opts);
1256   opts.deref_ref = 0;
1257   common_val_print (val, stb->stream, 0, &opts, current_language);
1258
1259   ui_out_field_stream (uiout, "value", stb);
1260   ui_out_stream_delete (stb);
1261
1262   do_cleanups (old_chain);
1263 }
1264
1265 /* DATA-MEMORY-READ:
1266
1267    ADDR: start address of data to be dumped.
1268    WORD-FORMAT: a char indicating format for the ``word''.  See 
1269    the ``x'' command.
1270    WORD-SIZE: size of each ``word''; 1,2,4, or 8 bytes.
1271    NR_ROW: Number of rows.
1272    NR_COL: The number of colums (words per row).
1273    ASCHAR: (OPTIONAL) Append an ascii character dump to each row.  Use
1274    ASCHAR for unprintable characters.
1275
1276    Reads SIZE*NR_ROW*NR_COL bytes starting at ADDR from memory and
1277    displayes them.  Returns:
1278
1279    {addr="...",rowN={wordN="..." ,... [,ascii="..."]}, ...}
1280
1281    Returns: 
1282    The number of bytes read is SIZE*ROW*COL. */
1283
1284 void
1285 mi_cmd_data_read_memory (char *command, char **argv, int argc)
1286 {
1287   struct gdbarch *gdbarch = get_current_arch ();
1288   struct cleanup *cleanups = make_cleanup (null_cleanup, NULL);
1289   CORE_ADDR addr;
1290   long total_bytes;
1291   long nr_cols;
1292   long nr_rows;
1293   char word_format;
1294   struct type *word_type;
1295   long word_size;
1296   char word_asize;
1297   char aschar;
1298   gdb_byte *mbuf;
1299   int nr_bytes;
1300   long offset = 0;
1301   int optind = 0;
1302   char *optarg;
1303   enum opt
1304     {
1305       OFFSET_OPT
1306     };
1307   static struct mi_opt opts[] =
1308   {
1309     {"o", OFFSET_OPT, 1},
1310     { 0, 0, 0 }
1311   };
1312
1313   while (1)
1314     {
1315       int opt = mi_getopt ("-data-read-memory", argc, argv, opts,
1316                            &optind, &optarg);
1317
1318       if (opt < 0)
1319         break;
1320       switch ((enum opt) opt)
1321         {
1322         case OFFSET_OPT:
1323           offset = atol (optarg);
1324           break;
1325         }
1326     }
1327   argv += optind;
1328   argc -= optind;
1329
1330   if (argc < 5 || argc > 6)
1331     error ("-data-read-memory: Usage: "
1332            "ADDR WORD-FORMAT WORD-SIZE NR-ROWS NR-COLS [ASCHAR].");
1333
1334   /* Extract all the arguments. */
1335
1336   /* Start address of the memory dump.  */
1337   addr = parse_and_eval_address (argv[0]) + offset;
1338   /* The format character to use when displaying a memory word.  See
1339      the ``x'' command. */
1340   word_format = argv[1][0];
1341   /* The size of the memory word.  */
1342   word_size = atol (argv[2]);
1343   switch (word_size)
1344     {
1345     case 1:
1346       word_type = builtin_type (gdbarch)->builtin_int8;
1347       word_asize = 'b';
1348       break;
1349     case 2:
1350       word_type = builtin_type (gdbarch)->builtin_int16;
1351       word_asize = 'h';
1352       break;
1353     case 4:
1354       word_type = builtin_type (gdbarch)->builtin_int32;
1355       word_asize = 'w';
1356       break;
1357     case 8:
1358       word_type = builtin_type (gdbarch)->builtin_int64;
1359       word_asize = 'g';
1360       break;
1361     default:
1362       word_type = builtin_type (gdbarch)->builtin_int8;
1363       word_asize = 'b';
1364     }
1365   /* The number of rows.  */
1366   nr_rows = atol (argv[3]);
1367   if (nr_rows <= 0)
1368     error ("-data-read-memory: invalid number of rows.");
1369
1370   /* Number of bytes per row.  */
1371   nr_cols = atol (argv[4]);
1372   if (nr_cols <= 0)
1373     error ("-data-read-memory: invalid number of columns.");
1374
1375   /* The un-printable character when printing ascii.  */
1376   if (argc == 6)
1377     aschar = *argv[5];
1378   else
1379     aschar = 0;
1380
1381   /* Create a buffer and read it in.  */
1382   total_bytes = word_size * nr_rows * nr_cols;
1383   mbuf = xcalloc (total_bytes, 1);
1384   make_cleanup (xfree, mbuf);
1385
1386   /* Dispatch memory reads to the topmost target, not the flattened
1387      current_target.  */
1388   nr_bytes = target_read (current_target.beneath,
1389                           TARGET_OBJECT_MEMORY, NULL, mbuf,
1390                           addr, total_bytes);
1391   if (nr_bytes <= 0)
1392     error ("Unable to read memory.");
1393
1394   /* Output the header information.  */
1395   ui_out_field_core_addr (uiout, "addr", gdbarch, addr);
1396   ui_out_field_int (uiout, "nr-bytes", nr_bytes);
1397   ui_out_field_int (uiout, "total-bytes", total_bytes);
1398   ui_out_field_core_addr (uiout, "next-row",
1399                           gdbarch, addr + word_size * nr_cols);
1400   ui_out_field_core_addr (uiout, "prev-row",
1401                           gdbarch, addr - word_size * nr_cols);
1402   ui_out_field_core_addr (uiout, "next-page", gdbarch, addr + total_bytes);
1403   ui_out_field_core_addr (uiout, "prev-page", gdbarch, addr - total_bytes);
1404
1405   /* Build the result as a two dimentional table.  */
1406   {
1407     struct ui_stream *stream = ui_out_stream_new (uiout);
1408     struct cleanup *cleanup_list_memory;
1409     int row;
1410     int row_byte;
1411
1412     cleanup_list_memory = make_cleanup_ui_out_list_begin_end (uiout, "memory");
1413     for (row = 0, row_byte = 0;
1414          row < nr_rows;
1415          row++, row_byte += nr_cols * word_size)
1416       {
1417         int col;
1418         int col_byte;
1419         struct cleanup *cleanup_tuple;
1420         struct cleanup *cleanup_list_data;
1421         struct value_print_options opts;
1422
1423         cleanup_tuple = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
1424         ui_out_field_core_addr (uiout, "addr", gdbarch, addr + row_byte);
1425         /* ui_out_field_core_addr_symbolic (uiout, "saddr", addr +
1426            row_byte); */
1427         cleanup_list_data = make_cleanup_ui_out_list_begin_end (uiout, "data");
1428         get_formatted_print_options (&opts, word_format);
1429         for (col = 0, col_byte = row_byte;
1430              col < nr_cols;
1431              col++, col_byte += word_size)
1432           {
1433             if (col_byte + word_size > nr_bytes)
1434               {
1435                 ui_out_field_string (uiout, NULL, "N/A");
1436               }
1437             else
1438               {
1439                 ui_file_rewind (stream->stream);
1440                 print_scalar_formatted (mbuf + col_byte, word_type, &opts,
1441                                         word_asize, stream->stream);
1442                 ui_out_field_stream (uiout, NULL, stream);
1443               }
1444           }
1445         do_cleanups (cleanup_list_data);
1446         if (aschar)
1447           {
1448             int byte;
1449
1450             ui_file_rewind (stream->stream);
1451             for (byte = row_byte;
1452                  byte < row_byte + word_size * nr_cols; byte++)
1453               {
1454                 if (byte >= nr_bytes)
1455                   {
1456                     fputc_unfiltered ('X', stream->stream);
1457                   }
1458                 else if (mbuf[byte] < 32 || mbuf[byte] > 126)
1459                   {
1460                     fputc_unfiltered (aschar, stream->stream);
1461                   }
1462                 else
1463                   fputc_unfiltered (mbuf[byte], stream->stream);
1464               }
1465             ui_out_field_stream (uiout, "ascii", stream);
1466           }
1467         do_cleanups (cleanup_tuple);
1468       }
1469     ui_out_stream_delete (stream);
1470     do_cleanups (cleanup_list_memory);
1471   }
1472   do_cleanups (cleanups);
1473 }
1474
1475 void
1476 mi_cmd_data_read_memory_bytes (char *command, char **argv, int argc)
1477 {
1478   struct gdbarch *gdbarch = get_current_arch ();
1479   struct cleanup *cleanups;
1480   CORE_ADDR addr;
1481   LONGEST length;
1482   memory_read_result_s *read_result;
1483   int ix;
1484   VEC(memory_read_result_s) *result;
1485   long offset = 0;
1486   int optind = 0;
1487   char *optarg;
1488   enum opt
1489     {
1490       OFFSET_OPT
1491     };
1492   static struct mi_opt opts[] =
1493   {
1494     {"o", OFFSET_OPT, 1},
1495     { 0, 0, 0 }
1496   };
1497
1498   while (1)
1499     {
1500       int opt = mi_getopt ("-data-read-memory-bytes", argc, argv, opts,
1501                            &optind, &optarg);
1502       if (opt < 0)
1503         break;
1504       switch ((enum opt) opt)
1505         {
1506         case OFFSET_OPT:
1507           offset = atol (optarg);
1508           break;
1509         }
1510     }
1511   argv += optind;
1512   argc -= optind;
1513
1514   if (argc != 2)
1515     error ("Usage: [ -o OFFSET ] ADDR LENGTH.");
1516
1517   addr = parse_and_eval_address (argv[0]) + offset;
1518   length = atol (argv[1]);
1519
1520   result = read_memory_robust (current_target.beneath, addr, length);
1521
1522   cleanups = make_cleanup (free_memory_read_result_vector, result);
1523
1524   if (VEC_length (memory_read_result_s, result) == 0)
1525     error ("Unable to read memory.");
1526
1527   make_cleanup_ui_out_list_begin_end (uiout, "memory");
1528   for (ix = 0;
1529        VEC_iterate (memory_read_result_s, result, ix, read_result);
1530        ++ix)
1531     {
1532       struct cleanup *t = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
1533       char *data, *p;
1534       int i;
1535
1536       ui_out_field_core_addr (uiout, "begin", gdbarch, read_result->begin);
1537       ui_out_field_core_addr (uiout, "offset", gdbarch, read_result->begin
1538                               - addr);
1539       ui_out_field_core_addr (uiout, "end", gdbarch, read_result->end);
1540
1541       data = xmalloc ((read_result->end - read_result->begin) * 2 + 1);
1542
1543       for (i = 0, p = data;
1544            i < (read_result->end - read_result->begin);
1545            ++i, p += 2)
1546         {
1547           sprintf (p, "%02x", read_result->data[i]);
1548         }
1549       ui_out_field_string (uiout, "contents", data);
1550       xfree (data);
1551       do_cleanups (t);
1552     }
1553   do_cleanups (cleanups);
1554 }
1555
1556
1557 /* DATA-MEMORY-WRITE:
1558
1559    COLUMN_OFFSET: optional argument. Must be preceeded by '-o'. The
1560    offset from the beginning of the memory grid row where the cell to
1561    be written is.
1562    ADDR: start address of the row in the memory grid where the memory
1563    cell is, if OFFSET_COLUMN is specified.  Otherwise, the address of
1564    the location to write to.
1565    FORMAT: a char indicating format for the ``word''.  See 
1566    the ``x'' command.
1567    WORD_SIZE: size of each ``word''; 1,2,4, or 8 bytes
1568    VALUE: value to be written into the memory address.
1569
1570    Writes VALUE into ADDR + (COLUMN_OFFSET * WORD_SIZE).
1571
1572    Prints nothing.  */
1573 void
1574 mi_cmd_data_write_memory (char *command, char **argv, int argc)
1575 {
1576   struct gdbarch *gdbarch = get_current_arch ();
1577   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1578   CORE_ADDR addr;
1579   char word_format;
1580   long word_size;
1581   /* FIXME: ezannoni 2000-02-17 LONGEST could possibly not be big
1582      enough when using a compiler other than GCC.  */
1583   LONGEST value;
1584   void *buffer;
1585   struct cleanup *old_chain;
1586   long offset = 0;
1587   int optind = 0;
1588   char *optarg;
1589   enum opt
1590     {
1591       OFFSET_OPT
1592     };
1593   static struct mi_opt opts[] =
1594   {
1595     {"o", OFFSET_OPT, 1},
1596     { 0, 0, 0 }
1597   };
1598
1599   while (1)
1600     {
1601       int opt = mi_getopt ("-data-write-memory", argc, argv, opts,
1602                            &optind, &optarg);
1603
1604       if (opt < 0)
1605         break;
1606       switch ((enum opt) opt)
1607         {
1608         case OFFSET_OPT:
1609           offset = atol (optarg);
1610           break;
1611         }
1612     }
1613   argv += optind;
1614   argc -= optind;
1615
1616   if (argc != 4)
1617     error ("-data-write-memory: Usage: "
1618            "[-o COLUMN_OFFSET] ADDR FORMAT WORD-SIZE VALUE.");
1619
1620   /* Extract all the arguments.  */
1621   /* Start address of the memory dump.  */
1622   addr = parse_and_eval_address (argv[0]);
1623   /* The format character to use when displaying a memory word.  See
1624      the ``x'' command.  */
1625   word_format = argv[1][0];
1626   /* The size of the memory word. */
1627   word_size = atol (argv[2]);
1628
1629   /* Calculate the real address of the write destination.  */
1630   addr += (offset * word_size);
1631
1632   /* Get the value as a number.  */
1633   value = parse_and_eval_address (argv[3]);
1634   /* Get the value into an array.  */
1635   buffer = xmalloc (word_size);
1636   old_chain = make_cleanup (xfree, buffer);
1637   store_signed_integer (buffer, word_size, byte_order, value);
1638   /* Write it down to memory.  */
1639   write_memory (addr, buffer, word_size);
1640   /* Free the buffer.  */
1641   do_cleanups (old_chain);
1642 }
1643
1644 /* DATA-MEMORY-WRITE-RAW:
1645
1646    ADDR: start address
1647    DATA: string of bytes to write at that address. */
1648 void
1649 mi_cmd_data_write_memory_bytes (char *command, char **argv, int argc)
1650 {
1651   CORE_ADDR addr;
1652   char *cdata;
1653   gdb_byte *data;
1654   int len, r, i;
1655   struct cleanup *back_to;
1656
1657   if (argc != 2)
1658     error ("Usage: ADDR DATA.");
1659
1660   addr = parse_and_eval_address (argv[0]);
1661   cdata = argv[1];
1662   len = strlen (cdata)/2;
1663
1664   data = xmalloc (len);
1665   back_to = make_cleanup (xfree, data);
1666
1667   for (i = 0; i < len; ++i)
1668     {
1669       int x;
1670       sscanf (cdata + i * 2, "%02x", &x);
1671       data[i] = (gdb_byte)x;
1672     }
1673
1674   r = target_write_memory (addr, data, len);
1675   if (r != 0)
1676     error (_("Could not write memory"));
1677
1678   do_cleanups (back_to);
1679 }
1680
1681
1682 void
1683 mi_cmd_enable_timings (char *command, char **argv, int argc)
1684 {
1685   if (argc == 0)
1686     do_timings = 1;
1687   else if (argc == 1)
1688     {
1689       if (strcmp (argv[0], "yes") == 0)
1690         do_timings = 1;
1691       else if (strcmp (argv[0], "no") == 0)
1692         do_timings = 0;
1693       else
1694         goto usage_error;
1695     }
1696   else
1697     goto usage_error;
1698     
1699   return;
1700
1701  usage_error:
1702   error ("-enable-timings: Usage: %s {yes|no}", command);
1703 }
1704
1705 void
1706 mi_cmd_list_features (char *command, char **argv, int argc)
1707 {
1708   if (argc == 0)
1709     {
1710       struct cleanup *cleanup = NULL;
1711
1712       cleanup = make_cleanup_ui_out_list_begin_end (uiout, "features");      
1713       ui_out_field_string (uiout, NULL, "frozen-varobjs");
1714       ui_out_field_string (uiout, NULL, "pending-breakpoints");
1715       ui_out_field_string (uiout, NULL, "thread-info");
1716       ui_out_field_string (uiout, NULL, "data-read-memory-bytes");
1717       
1718 #if HAVE_PYTHON
1719       ui_out_field_string (uiout, NULL, "python");
1720 #endif
1721       
1722       do_cleanups (cleanup);
1723       return;
1724     }
1725
1726   error ("-list-features should be passed no arguments");
1727 }
1728
1729 void
1730 mi_cmd_list_target_features (char *command, char **argv, int argc)
1731 {
1732   if (argc == 0)
1733     {
1734       struct cleanup *cleanup = NULL;
1735
1736       cleanup = make_cleanup_ui_out_list_begin_end (uiout, "features");      
1737       if (target_can_async_p ())
1738         ui_out_field_string (uiout, NULL, "async");
1739       if (target_can_execute_reverse)
1740         ui_out_field_string (uiout, NULL, "reverse");
1741       
1742       do_cleanups (cleanup);
1743       return;
1744     }
1745
1746   error ("-list-target-features should be passed no arguments");
1747 }
1748
1749 void
1750 mi_cmd_add_inferior (char *command, char **argv, int argc)
1751 {
1752   struct inferior *inf;
1753
1754   if (argc != 0)
1755     error (_("-add-inferior should be passed no arguments"));
1756
1757   inf = add_inferior_with_spaces ();
1758
1759   ui_out_field_fmt (uiout, "inferior", "i%d", inf->num);
1760 }
1761
1762 /* Callback used to find the first inferior other than the
1763    current one. */
1764    
1765 static int
1766 get_other_inferior (struct inferior *inf, void *arg)
1767 {
1768   if (inf == current_inferior ())
1769     return 0;
1770
1771   return 1;
1772 }
1773
1774 void
1775 mi_cmd_remove_inferior (char *command, char **argv, int argc)
1776 {
1777   int id;
1778   struct inferior *inf;
1779
1780   if (argc != 1)
1781     error ("-remove-inferior should be passed a single argument");
1782
1783   if (sscanf (argv[0], "i%d", &id) != 1)
1784     error ("the thread group id is syntactically invalid");
1785
1786   inf = find_inferior_id (id);
1787   if (!inf)
1788     error ("the specified thread group does not exist");
1789
1790   if (inf->pid != 0)
1791     error (_("cannot remove an active inferior"));
1792
1793   if (inf == current_inferior ())
1794     {
1795       struct thread_info *tp = 0;
1796       struct inferior *new_inferior 
1797         = iterate_over_inferiors (get_other_inferior, NULL);
1798
1799       if (new_inferior == NULL)
1800         error (_("Cannot remove last inferior"));
1801
1802       set_current_inferior (new_inferior);
1803       if (new_inferior->pid != 0)
1804         tp = any_thread_of_process (new_inferior->pid);
1805       switch_to_thread (tp ? tp->ptid : null_ptid);
1806       set_current_program_space (new_inferior->pspace);
1807     }
1808
1809   delete_inferior_1 (inf, 1 /* silent */);
1810 }
1811
1812 \f
1813
1814 /* Execute a command within a safe environment.
1815    Return <0 for error; >=0 for ok.
1816
1817    args->action will tell mi_execute_command what action
1818    to perfrom after the given command has executed (display/suppress
1819    prompt, display error). */
1820
1821 static void
1822 captured_mi_execute_command (struct ui_out *uiout, void *data)
1823 {
1824   struct cleanup *cleanup;
1825   struct mi_parse *context = (struct mi_parse *) data;
1826
1827   if (do_timings)
1828     current_command_ts = context->cmd_start;
1829
1830   current_token = xstrdup (context->token);
1831   cleanup = make_cleanup (free_current_contents, &current_token);
1832
1833   running_result_record_printed = 0;
1834   mi_proceeded = 0;
1835   switch (context->op)
1836     {
1837     case MI_COMMAND:
1838       /* A MI command was read from the input stream.  */
1839       if (mi_debug_p)
1840         /* FIXME: gdb_???? */
1841         fprintf_unfiltered (raw_stdout, " token=`%s' command=`%s' args=`%s'\n",
1842                             context->token, context->command, context->args);
1843
1844
1845       mi_cmd_execute (context);
1846
1847       /* Print the result if there were no errors.
1848
1849          Remember that on the way out of executing a command, you have
1850          to directly use the mi_interp's uiout, since the command could 
1851          have reset the interpreter, in which case the current uiout 
1852          will most likely crash in the mi_out_* routines.  */
1853       if (!running_result_record_printed)
1854         {
1855           fputs_unfiltered (context->token, raw_stdout);
1856           /* There's no particularly good reason why target-connect results
1857              in not ^done.  Should kill ^connected for MI3.  */
1858           fputs_unfiltered (strcmp (context->command, "target-select") == 0
1859                             ? "^connected" : "^done", raw_stdout);
1860           mi_out_put (uiout, raw_stdout);
1861           mi_out_rewind (uiout);
1862           mi_print_timing_maybe ();
1863           fputs_unfiltered ("\n", raw_stdout);
1864         }
1865       else
1866             /* The command does not want anything to be printed.  In that
1867                case, the command probably should not have written anything
1868                to uiout, but in case it has written something, discard it.  */
1869         mi_out_rewind (uiout);
1870       break;
1871
1872     case CLI_COMMAND:
1873       {
1874         char *argv[2];
1875
1876         /* A CLI command was read from the input stream.  */
1877         /* This "feature" will be removed as soon as we have a
1878            complete set of mi commands.  */
1879         /* Echo the command on the console.  */
1880         fprintf_unfiltered (gdb_stdlog, "%s\n", context->command);
1881         /* Call the "console" interpreter.  */
1882         argv[0] = "console";
1883         argv[1] = context->command;
1884         mi_cmd_interpreter_exec ("-interpreter-exec", argv, 2);
1885
1886         /* If we changed interpreters, DON'T print out anything.  */
1887         if (current_interp_named_p (INTERP_MI)
1888             || current_interp_named_p (INTERP_MI1)
1889             || current_interp_named_p (INTERP_MI2)
1890             || current_interp_named_p (INTERP_MI3))
1891           {
1892             if (!running_result_record_printed)
1893               {
1894                 fputs_unfiltered (context->token, raw_stdout);
1895                 fputs_unfiltered ("^done", raw_stdout);
1896                 mi_out_put (uiout, raw_stdout);
1897                 mi_out_rewind (uiout);
1898                 mi_print_timing_maybe ();
1899                 fputs_unfiltered ("\n", raw_stdout);            
1900               }
1901             else
1902               mi_out_rewind (uiout);
1903           }
1904         break;
1905       }
1906
1907     }
1908
1909   do_cleanups (cleanup);
1910
1911   return;
1912 }
1913
1914 /* Print a gdb exception to the MI output stream.  */
1915
1916 static void
1917 mi_print_exception (const char *token, struct gdb_exception exception)
1918 {
1919   fputs_unfiltered (token, raw_stdout);
1920   fputs_unfiltered ("^error,msg=\"", raw_stdout);
1921   if (exception.message == NULL)
1922     fputs_unfiltered ("unknown error", raw_stdout);
1923   else
1924     fputstr_unfiltered (exception.message, '"', raw_stdout);
1925   fputs_unfiltered ("\"\n", raw_stdout);
1926 }
1927
1928 void
1929 mi_execute_command (char *cmd, int from_tty)
1930 {
1931   char *token;
1932   struct mi_parse *command = NULL;
1933   volatile struct gdb_exception exception;
1934
1935   /* This is to handle EOF (^D). We just quit gdb.  */
1936   /* FIXME: we should call some API function here.  */
1937   if (cmd == 0)
1938     quit_force (NULL, from_tty);
1939
1940   target_log_command (cmd);
1941
1942   TRY_CATCH (exception, RETURN_MASK_ALL)
1943     {
1944       command = mi_parse (cmd, &token);
1945     }
1946   if (exception.reason < 0)
1947     {
1948       mi_print_exception (token, exception);
1949       xfree (token);
1950     }
1951   else
1952     {
1953       struct gdb_exception result;
1954       ptid_t previous_ptid = inferior_ptid;
1955
1956       command->token = token;
1957
1958       if (do_timings)
1959         {
1960           command->cmd_start = (struct mi_timestamp *)
1961             xmalloc (sizeof (struct mi_timestamp));
1962           timestamp (command->cmd_start);
1963         }
1964
1965       result = catch_exception (uiout, captured_mi_execute_command, command,
1966                                 RETURN_MASK_ALL);
1967       if (result.reason < 0)
1968         {
1969           /* The command execution failed and error() was called
1970              somewhere.  */
1971           mi_print_exception (command->token, result);
1972           mi_out_rewind (uiout);
1973         }
1974
1975       bpstat_do_actions ();
1976
1977       if (/* The notifications are only output when the top-level
1978              interpreter (specified on the command line) is MI.  */      
1979           ui_out_is_mi_like_p (interp_ui_out (top_level_interpreter ()))
1980           /* Don't try report anything if there are no threads -- 
1981              the program is dead.  */
1982           && thread_count () != 0
1983           /* -thread-select explicitly changes thread. If frontend uses that
1984              internally, we don't want to emit =thread-selected, since
1985              =thread-selected is supposed to indicate user's intentions.  */
1986           && strcmp (command->command, "thread-select") != 0)
1987         {
1988           struct mi_interp *mi = top_level_interpreter_data ();
1989           int report_change = 0;
1990
1991           if (command->thread == -1)
1992             {
1993               report_change = (!ptid_equal (previous_ptid, null_ptid)
1994                                && !ptid_equal (inferior_ptid, previous_ptid)
1995                                && !ptid_equal (inferior_ptid, null_ptid));
1996             }
1997           else if (!ptid_equal (inferior_ptid, null_ptid))
1998             {
1999               struct thread_info *ti = inferior_thread ();
2000
2001               report_change = (ti->num != command->thread);
2002             }
2003
2004           if (report_change)
2005             {     
2006               struct thread_info *ti = inferior_thread ();
2007
2008               target_terminal_ours ();
2009               fprintf_unfiltered (mi->event_channel, 
2010                                   "thread-selected,id=\"%d\"",
2011                                   ti->num);
2012               gdb_flush (mi->event_channel);
2013             }
2014         }
2015
2016       mi_parse_free (command);
2017     }
2018
2019   fputs_unfiltered ("(gdb) \n", raw_stdout);
2020   gdb_flush (raw_stdout);
2021   /* Print any buffered hook code.  */
2022   /* ..... */
2023 }
2024
2025 static void
2026 mi_cmd_execute (struct mi_parse *parse)
2027 {
2028   struct cleanup *cleanup;
2029
2030   prepare_execute_command ();
2031
2032   cleanup = make_cleanup (null_cleanup, NULL);
2033
2034   if (parse->all && parse->thread_group != -1)
2035     error (_("Cannot specify --thread-group together with --all"));
2036
2037   if (parse->all && parse->thread != -1)
2038     error (_("Cannot specify --thread together with --all"));
2039
2040   if (parse->thread_group != -1 && parse->thread != -1)
2041     error (_("Cannot specify --thread together with --thread-group"));
2042
2043   if (parse->frame != -1 && parse->thread == -1)
2044     error (_("Cannot specify --frame without --thread"));
2045
2046   if (parse->thread_group != -1)
2047     {
2048       struct inferior *inf = find_inferior_id (parse->thread_group);
2049       struct thread_info *tp = 0;
2050
2051       if (!inf)
2052         error (_("Invalid thread group for the --thread-group option"));
2053
2054       set_current_inferior (inf);
2055       /* This behaviour means that if --thread-group option identifies
2056          an inferior with multiple threads, then a random one will be picked.
2057          This is not a problem -- frontend should always provide --thread if
2058          it wishes to operate on a specific thread.  */
2059       if (inf->pid != 0)
2060         tp = any_thread_of_process (inf->pid);
2061       switch_to_thread (tp ? tp->ptid : null_ptid);
2062       set_current_program_space (inf->pspace);
2063     }
2064
2065   if (parse->thread != -1)
2066     {
2067       struct thread_info *tp = find_thread_id (parse->thread);
2068
2069       if (!tp)
2070         error (_("Invalid thread id: %d"), parse->thread);
2071
2072       if (is_exited (tp->ptid))
2073         error (_("Thread id: %d has terminated"), parse->thread);
2074
2075       switch_to_thread (tp->ptid);
2076     }
2077
2078   if (parse->frame != -1)
2079     {
2080       struct frame_info *fid;
2081       int frame = parse->frame;
2082
2083       fid = find_relative_frame (get_current_frame (), &frame);
2084       if (frame == 0)
2085         /* find_relative_frame was successful */
2086         select_frame (fid);
2087       else
2088         error (_("Invalid frame id: %d"), frame);
2089     }
2090
2091   current_context = parse;
2092
2093   if (parse->cmd->argv_func != NULL)
2094     parse->cmd->argv_func (parse->command, parse->argv, parse->argc);
2095   else if (parse->cmd->cli.cmd != 0)
2096     {
2097       /* FIXME: DELETE THIS. */
2098       /* The operation is still implemented by a cli command.  */
2099       /* Must be a synchronous one.  */
2100       mi_execute_cli_command (parse->cmd->cli.cmd, parse->cmd->cli.args_p,
2101                               parse->args);
2102     }
2103   else
2104     {
2105       /* FIXME: DELETE THIS.  */
2106       struct ui_file *stb;
2107
2108       stb = mem_fileopen ();
2109
2110       fputs_unfiltered ("Undefined mi command: ", stb);
2111       fputstr_unfiltered (parse->command, '"', stb);
2112       fputs_unfiltered (" (missing implementation)", stb);
2113
2114       make_cleanup_ui_file_delete (stb);
2115       error_stream (stb);
2116     }
2117   do_cleanups (cleanup);
2118 }
2119
2120 /* FIXME: This is just a hack so we can get some extra commands going.
2121    We don't want to channel things through the CLI, but call libgdb directly.
2122    Use only for synchronous commands.  */
2123
2124 void
2125 mi_execute_cli_command (const char *cmd, int args_p, const char *args)
2126 {
2127   if (cmd != 0)
2128     {
2129       struct cleanup *old_cleanups;
2130       char *run;
2131
2132       if (args_p)
2133         run = xstrprintf ("%s %s", cmd, args);
2134       else
2135         run = xstrdup (cmd);
2136       if (mi_debug_p)
2137         /* FIXME: gdb_???? */
2138         fprintf_unfiltered (gdb_stdout, "cli=%s run=%s\n",
2139                             cmd, run);
2140       old_cleanups = make_cleanup (xfree, run);
2141       execute_command ( /*ui */ run, 0 /*from_tty */ );
2142       do_cleanups (old_cleanups);
2143       return;
2144     }
2145 }
2146
2147 void
2148 mi_execute_async_cli_command (char *cli_command, char **argv, int argc)
2149 {
2150   struct cleanup *old_cleanups;
2151   char *run;
2152
2153   if (target_can_async_p ())
2154     run = xstrprintf ("%s %s&", cli_command, argc ? *argv : "");
2155   else
2156     run = xstrprintf ("%s %s", cli_command, argc ? *argv : "");
2157   old_cleanups = make_cleanup (xfree, run);  
2158
2159   execute_command ( /*ui */ run, 0 /*from_tty */ );
2160
2161   if (target_can_async_p ())
2162     {
2163       /* If we're not executing, an exception should have been throw.  */
2164       gdb_assert (is_running (inferior_ptid));
2165       do_cleanups (old_cleanups);
2166     }
2167   else
2168     {
2169       /* Do this before doing any printing.  It would appear that some
2170          print code leaves garbage around in the buffer.  */
2171       do_cleanups (old_cleanups);
2172     }
2173 }
2174
2175 void
2176 mi_load_progress (const char *section_name,
2177                   unsigned long sent_so_far,
2178                   unsigned long total_section,
2179                   unsigned long total_sent,
2180                   unsigned long grand_total)
2181 {
2182   struct timeval time_now, delta, update_threshold;
2183   static struct timeval last_update;
2184   static char *previous_sect_name = NULL;
2185   int new_section;
2186   struct ui_out *saved_uiout;
2187
2188   /* This function is called through deprecated_show_load_progress
2189      which means uiout may not be correct.  Fix it for the duration
2190      of this function.  */
2191   saved_uiout = uiout;
2192
2193   if (current_interp_named_p (INTERP_MI)
2194       || current_interp_named_p (INTERP_MI2))
2195     uiout = mi_out_new (2);
2196   else if (current_interp_named_p (INTERP_MI1))
2197     uiout = mi_out_new (1);
2198   else if (current_interp_named_p (INTERP_MI3))
2199     uiout = mi_out_new (3);
2200   else
2201     return;
2202
2203   update_threshold.tv_sec = 0;
2204   update_threshold.tv_usec = 500000;
2205   gettimeofday (&time_now, NULL);
2206
2207   delta.tv_usec = time_now.tv_usec - last_update.tv_usec;
2208   delta.tv_sec = time_now.tv_sec - last_update.tv_sec;
2209
2210   if (delta.tv_usec < 0)
2211     {
2212       delta.tv_sec -= 1;
2213       delta.tv_usec += 1000000L;
2214     }
2215
2216   new_section = (previous_sect_name ?
2217                  strcmp (previous_sect_name, section_name) : 1);
2218   if (new_section)
2219     {
2220       struct cleanup *cleanup_tuple;
2221
2222       xfree (previous_sect_name);
2223       previous_sect_name = xstrdup (section_name);
2224
2225       if (current_token)
2226         fputs_unfiltered (current_token, raw_stdout);
2227       fputs_unfiltered ("+download", raw_stdout);
2228       cleanup_tuple = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
2229       ui_out_field_string (uiout, "section", section_name);
2230       ui_out_field_int (uiout, "section-size", total_section);
2231       ui_out_field_int (uiout, "total-size", grand_total);
2232       do_cleanups (cleanup_tuple);
2233       mi_out_put (uiout, raw_stdout);
2234       fputs_unfiltered ("\n", raw_stdout);
2235       gdb_flush (raw_stdout);
2236     }
2237
2238   if (delta.tv_sec >= update_threshold.tv_sec &&
2239       delta.tv_usec >= update_threshold.tv_usec)
2240     {
2241       struct cleanup *cleanup_tuple;
2242
2243       last_update.tv_sec = time_now.tv_sec;
2244       last_update.tv_usec = time_now.tv_usec;
2245       if (current_token)
2246         fputs_unfiltered (current_token, raw_stdout);
2247       fputs_unfiltered ("+download", raw_stdout);
2248       cleanup_tuple = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
2249       ui_out_field_string (uiout, "section", section_name);
2250       ui_out_field_int (uiout, "section-sent", sent_so_far);
2251       ui_out_field_int (uiout, "section-size", total_section);
2252       ui_out_field_int (uiout, "total-sent", total_sent);
2253       ui_out_field_int (uiout, "total-size", grand_total);
2254       do_cleanups (cleanup_tuple);
2255       mi_out_put (uiout, raw_stdout);
2256       fputs_unfiltered ("\n", raw_stdout);
2257       gdb_flush (raw_stdout);
2258     }
2259
2260   xfree (uiout);
2261   uiout = saved_uiout;
2262 }
2263
2264 static void 
2265 timestamp (struct mi_timestamp *tv)
2266   {
2267     gettimeofday (&tv->wallclock, NULL);
2268 #ifdef HAVE_GETRUSAGE
2269     getrusage (RUSAGE_SELF, &rusage);
2270     tv->utime.tv_sec = rusage.ru_utime.tv_sec;
2271     tv->utime.tv_usec = rusage.ru_utime.tv_usec;
2272     tv->stime.tv_sec = rusage.ru_stime.tv_sec;
2273     tv->stime.tv_usec = rusage.ru_stime.tv_usec;
2274 #else
2275     {
2276       long usec = get_run_time ();
2277
2278       tv->utime.tv_sec = usec/1000000L;
2279       tv->utime.tv_usec = usec - 1000000L*tv->utime.tv_sec;
2280       tv->stime.tv_sec = 0;
2281       tv->stime.tv_usec = 0;
2282     }
2283 #endif
2284   }
2285
2286 static void 
2287 print_diff_now (struct mi_timestamp *start)
2288   {
2289     struct mi_timestamp now;
2290
2291     timestamp (&now);
2292     print_diff (start, &now);
2293   }
2294
2295 void
2296 mi_print_timing_maybe (void)
2297 {
2298   /* If the command is -enable-timing then do_timings may be
2299      true whilst current_command_ts is not initialized.  */
2300   if (do_timings && current_command_ts)
2301     print_diff_now (current_command_ts);
2302 }
2303
2304 static long 
2305 timeval_diff (struct timeval start, struct timeval end)
2306   {
2307     return ((end.tv_sec - start.tv_sec) * 1000000L)
2308       + (end.tv_usec - start.tv_usec);
2309   }
2310
2311 static void 
2312 print_diff (struct mi_timestamp *start, struct mi_timestamp *end)
2313   {
2314     fprintf_unfiltered
2315       (raw_stdout,
2316        ",time={wallclock=\"%0.5f\",user=\"%0.5f\",system=\"%0.5f\"}", 
2317        timeval_diff (start->wallclock, end->wallclock) / 1000000.0, 
2318        timeval_diff (start->utime, end->utime) / 1000000.0, 
2319        timeval_diff (start->stime, end->stime) / 1000000.0);
2320   }
2321
2322 void
2323 mi_cmd_trace_define_variable (char *command, char **argv, int argc)
2324 {
2325   struct expression *expr;
2326   struct cleanup *back_to;
2327   LONGEST initval = 0;
2328   struct trace_state_variable *tsv;
2329   char *name = 0;
2330
2331   if (argc != 1 && argc != 2)
2332     error (_("Usage: -trace-define-variable VARIABLE [VALUE]"));
2333
2334   expr = parse_expression (argv[0]);
2335   back_to = make_cleanup (xfree, expr);
2336
2337   if (expr->nelts == 3 && expr->elts[0].opcode == OP_INTERNALVAR)
2338     {
2339       struct internalvar *intvar = expr->elts[1].internalvar;
2340
2341       if (intvar)
2342         name = internalvar_name (intvar);
2343     }
2344
2345   if (!name || *name == '\0')
2346     error (_("Invalid name of trace variable"));
2347
2348   tsv = find_trace_state_variable (name);
2349   if (!tsv)
2350     tsv = create_trace_state_variable (name);
2351
2352   if (argc == 2)
2353     initval = value_as_long (parse_and_eval (argv[1]));
2354
2355   tsv->initial_value = initval;
2356
2357   do_cleanups (back_to);
2358 }
2359
2360 void
2361 mi_cmd_trace_list_variables (char *command, char **argv, int argc)
2362 {
2363   if (argc != 0)
2364     error (_("-trace-list-variables: no arguments are allowed"));
2365
2366   tvariables_info_1 ();
2367 }
2368
2369 void
2370 mi_cmd_trace_find (char *command, char **argv, int argc)
2371 {
2372   char *mode;
2373
2374   if (argc == 0)
2375     error (_("trace selection mode is required"));
2376
2377   mode = argv[0];
2378
2379   if (strcmp (mode, "none") == 0)
2380     {
2381       tfind_1 (tfind_number, -1, 0, 0, 0);
2382       return;
2383     }
2384
2385   if (current_trace_status ()->running)
2386     error (_("May not look at trace frames while trace is running."));
2387
2388   if (strcmp (mode, "frame-number") == 0)
2389     {
2390       if (argc != 2)
2391         error (_("frame number is required"));
2392       tfind_1 (tfind_number, atoi (argv[1]), 0, 0, 0);
2393     }
2394   else if (strcmp (mode, "tracepoint-number") == 0)
2395     {
2396       if (argc != 2)
2397         error (_("tracepoint number is required"));
2398       tfind_1 (tfind_tp, atoi (argv[1]), 0, 0, 0);
2399     }
2400   else if (strcmp (mode, "pc") == 0)
2401     {
2402       if (argc != 2)
2403         error (_("PC is required"));
2404       tfind_1 (tfind_pc, 0, parse_and_eval_address (argv[1]), 0, 0);
2405     }
2406   else if (strcmp (mode, "pc-inside-range") == 0)
2407     {
2408       if (argc != 3)
2409         error (_("Start and end PC are required"));
2410       tfind_1 (tfind_range, 0, parse_and_eval_address (argv[1]),
2411                parse_and_eval_address (argv[2]), 0);
2412     }
2413   else if (strcmp (mode, "pc-outside-range") == 0)
2414     {
2415       if (argc != 3)
2416         error (_("Start and end PC are required"));
2417       tfind_1 (tfind_outside, 0, parse_and_eval_address (argv[1]),
2418                parse_and_eval_address (argv[2]), 0);
2419     }
2420   else if (strcmp (mode, "line") == 0)
2421     {
2422       struct symtabs_and_lines sals;
2423       struct symtab_and_line sal;
2424       static CORE_ADDR start_pc, end_pc;
2425       struct cleanup *back_to;
2426
2427       if (argc != 2)
2428         error (_("Line is required"));
2429
2430       sals = decode_line_spec (argv[1], 1);
2431       back_to = make_cleanup (xfree, sals.sals);
2432
2433       sal = sals.sals[0];
2434
2435       if (sal.symtab == 0)
2436         error (_("Could not find the specified line"));
2437
2438       if (sal.line > 0 && find_line_pc_range (sal, &start_pc, &end_pc))
2439         tfind_1 (tfind_range, 0, start_pc, end_pc - 1, 0);
2440       else
2441         error (_("Could not find the specified line"));
2442
2443       do_cleanups (back_to);
2444     }
2445   else
2446     error (_("Invalid mode '%s'"), mode);
2447
2448   if (has_stack_frames () || get_traceframe_number () >= 0)
2449     {
2450       print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC);
2451     }
2452 }
2453
2454 void
2455 mi_cmd_trace_save (char *command, char **argv, int argc)
2456 {
2457   int target_saves = 0;
2458   char *filename;
2459
2460   if (argc != 1 && argc != 2)
2461     error (_("Usage: -trace-save [-r] filename"));
2462
2463   if (argc == 2)
2464     {
2465       filename = argv[1];
2466       if (strcmp (argv[0], "-r") == 0)
2467         target_saves = 1;
2468       else
2469         error (_("Invalid option: %s"), argv[0]);
2470     }
2471   else
2472     {
2473       filename = argv[0];
2474     }
2475
2476   trace_save (filename, target_saves);
2477 }
2478
2479
2480 void
2481 mi_cmd_trace_start (char *command, char **argv, int argc)
2482 {
2483   start_tracing ();
2484 }
2485
2486 void
2487 mi_cmd_trace_status (char *command, char **argv, int argc)
2488 {
2489   trace_status_mi (0);
2490 }
2491
2492 void
2493 mi_cmd_trace_stop (char *command, char **argv, int argc)
2494 {
2495   stop_tracing ();
2496   trace_status_mi (1);
2497 }