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