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