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