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