Home | History | Annotate | Line # | Download | only in mi
mi-main.c revision 1.1
      1 /* MI Command Set.
      2 
      3    Copyright (C) 2000-2014 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 <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 "ctf.h"
     53 #include "ada-lang.h"
     54 #include "linespec.h"
     55 #ifdef HAVE_PYTHON
     56 #include "python/python-internal.h"
     57 #endif
     58 
     59 #include <ctype.h>
     60 #include <sys/time.h>
     61 
     62 #if defined HAVE_SYS_RESOURCE_H
     63 #include <sys/resource.h>
     64 #endif
     65 
     66 #ifdef HAVE_GETRUSAGE
     67 struct rusage rusage;
     68 #endif
     69 
     70 enum
     71   {
     72     FROM_TTY = 0
     73   };
     74 
     75 int mi_debug_p;
     76 
     77 struct ui_file *raw_stdout;
     78 
     79 /* This is used to pass the current command timestamp down to
     80    continuation routines.  */
     81 static struct mi_timestamp *current_command_ts;
     82 
     83 static int do_timings = 0;
     84 
     85 char *current_token;
     86 /* Few commands would like to know if options like --thread-group were
     87    explicitly specified.  This variable keeps the current parsed
     88    command including all option, and make it possible.  */
     89 static struct mi_parse *current_context;
     90 
     91 int running_result_record_printed = 1;
     92 
     93 /* Flag indicating that the target has proceeded since the last
     94    command was issued.  */
     95 int mi_proceeded;
     96 
     97 extern void _initialize_mi_main (void);
     98 static void mi_cmd_execute (struct mi_parse *parse);
     99 
    100 static void mi_execute_cli_command (const char *cmd, int args_p,
    101 				    const char *args);
    102 static void mi_execute_async_cli_command (char *cli_command,
    103 					  char **argv, int argc);
    104 static int register_changed_p (int regnum, struct regcache *,
    105 			       struct regcache *);
    106 static void output_register (struct frame_info *, int regnum, int format,
    107 			     int skip_unavailable);
    108 
    109 /* Command implementations.  FIXME: Is this libgdb?  No.  This is the MI
    110    layer that calls libgdb.  Any operation used in the below should be
    111    formalized.  */
    112 
    113 static void timestamp (struct mi_timestamp *tv);
    114 
    115 static void print_diff_now (struct mi_timestamp *start);
    116 static void print_diff (struct mi_timestamp *start, struct mi_timestamp *end);
    117 
    118 void
    119 mi_cmd_gdb_exit (char *command, char **argv, int argc)
    120 {
    121   /* We have to print everything right here because we never return.  */
    122   if (current_token)
    123     fputs_unfiltered (current_token, raw_stdout);
    124   fputs_unfiltered ("^exit\n", raw_stdout);
    125   mi_out_put (current_uiout, raw_stdout);
    126   gdb_flush (raw_stdout);
    127   /* FIXME: The function called is not yet a formal libgdb function.  */
    128   quit_force (NULL, FROM_TTY);
    129 }
    130 
    131 void
    132 mi_cmd_exec_next (char *command, char **argv, int argc)
    133 {
    134   /* FIXME: Should call a libgdb function, not a cli wrapper.  */
    135   if (argc > 0 && strcmp(argv[0], "--reverse") == 0)
    136     mi_execute_async_cli_command ("reverse-next", argv + 1, argc - 1);
    137   else
    138     mi_execute_async_cli_command ("next", argv, argc);
    139 }
    140 
    141 void
    142 mi_cmd_exec_next_instruction (char *command, char **argv, int argc)
    143 {
    144   /* FIXME: Should call a libgdb function, not a cli wrapper.  */
    145   if (argc > 0 && strcmp(argv[0], "--reverse") == 0)
    146     mi_execute_async_cli_command ("reverse-nexti", argv + 1, argc - 1);
    147   else
    148     mi_execute_async_cli_command ("nexti", argv, argc);
    149 }
    150 
    151 void
    152 mi_cmd_exec_step (char *command, char **argv, int argc)
    153 {
    154   /* FIXME: Should call a libgdb function, not a cli wrapper.  */
    155   if (argc > 0 && strcmp(argv[0], "--reverse") == 0)
    156     mi_execute_async_cli_command ("reverse-step", argv + 1, argc - 1);
    157   else
    158     mi_execute_async_cli_command ("step", argv, argc);
    159 }
    160 
    161 void
    162 mi_cmd_exec_step_instruction (char *command, char **argv, int argc)
    163 {
    164   /* FIXME: Should call a libgdb function, not a cli wrapper.  */
    165   if (argc > 0 && strcmp(argv[0], "--reverse") == 0)
    166     mi_execute_async_cli_command ("reverse-stepi", argv + 1, argc - 1);
    167   else
    168     mi_execute_async_cli_command ("stepi", argv, argc);
    169 }
    170 
    171 void
    172 mi_cmd_exec_finish (char *command, char **argv, int argc)
    173 {
    174   /* FIXME: Should call a libgdb function, not a cli wrapper.  */
    175   if (argc > 0 && strcmp(argv[0], "--reverse") == 0)
    176     mi_execute_async_cli_command ("reverse-finish", argv + 1, argc - 1);
    177   else
    178     mi_execute_async_cli_command ("finish", argv, argc);
    179 }
    180 
    181 void
    182 mi_cmd_exec_return (char *command, char **argv, int argc)
    183 {
    184   /* This command doesn't really execute the target, it just pops the
    185      specified number of frames.  */
    186   if (argc)
    187     /* Call return_command with from_tty argument equal to 0 so as to
    188        avoid being queried.  */
    189     return_command (*argv, 0);
    190   else
    191     /* Call return_command with from_tty argument equal to 0 so as to
    192        avoid being queried.  */
    193     return_command (NULL, 0);
    194 
    195   /* Because we have called return_command with from_tty = 0, we need
    196      to print the frame here.  */
    197   print_stack_frame (get_selected_frame (NULL), 1, LOC_AND_ADDRESS, 1);
    198 }
    199 
    200 void
    201 mi_cmd_exec_jump (char *args, char **argv, int argc)
    202 {
    203   /* FIXME: Should call a libgdb function, not a cli wrapper.  */
    204   mi_execute_async_cli_command ("jump", argv, argc);
    205 }
    206 
    207 static void
    208 proceed_thread (struct thread_info *thread, int pid)
    209 {
    210   if (!is_stopped (thread->ptid))
    211     return;
    212 
    213   if (pid != 0 && ptid_get_pid (thread->ptid) != pid)
    214     return;
    215 
    216   switch_to_thread (thread->ptid);
    217   clear_proceed_status ();
    218   proceed ((CORE_ADDR) -1, GDB_SIGNAL_DEFAULT, 0);
    219 }
    220 
    221 static int
    222 proceed_thread_callback (struct thread_info *thread, void *arg)
    223 {
    224   int pid = *(int *)arg;
    225 
    226   proceed_thread (thread, pid);
    227   return 0;
    228 }
    229 
    230 static void
    231 exec_continue (char **argv, int argc)
    232 {
    233   if (non_stop)
    234     {
    235       /* In non-stop mode, 'resume' always resumes a single thread.
    236 	 Therefore, to resume all threads of the current inferior, or
    237 	 all threads in all inferiors, we need to iterate over
    238 	 threads.
    239 
    240 	 See comment on infcmd.c:proceed_thread_callback for rationale.  */
    241       if (current_context->all || current_context->thread_group != -1)
    242 	{
    243 	  int pid = 0;
    244 	  struct cleanup *back_to = make_cleanup_restore_current_thread ();
    245 
    246 	  if (!current_context->all)
    247 	    {
    248 	      struct inferior *inf
    249 		= find_inferior_id (current_context->thread_group);
    250 
    251 	      pid = inf->pid;
    252 	    }
    253 	  iterate_over_threads (proceed_thread_callback, &pid);
    254 	  do_cleanups (back_to);
    255 	}
    256       else
    257 	{
    258 	  continue_1 (0);
    259 	}
    260     }
    261   else
    262     {
    263       struct cleanup *back_to = make_cleanup_restore_integer (&sched_multi);
    264 
    265       if (current_context->all)
    266 	{
    267 	  sched_multi = 1;
    268 	  continue_1 (0);
    269 	}
    270       else
    271 	{
    272 	  /* In all-stop mode, -exec-continue traditionally resumed
    273 	     either all threads, or one thread, depending on the
    274 	     'scheduler-locking' variable.  Let's continue to do the
    275 	     same.  */
    276 	  continue_1 (1);
    277 	}
    278       do_cleanups (back_to);
    279     }
    280 }
    281 
    282 static void
    283 exec_direction_forward (void *notused)
    284 {
    285   execution_direction = EXEC_FORWARD;
    286 }
    287 
    288 static void
    289 exec_reverse_continue (char **argv, int argc)
    290 {
    291   enum exec_direction_kind dir = execution_direction;
    292   struct cleanup *old_chain;
    293 
    294   if (dir == EXEC_REVERSE)
    295     error (_("Already in reverse mode."));
    296 
    297   if (!target_can_execute_reverse)
    298     error (_("Target %s does not support this command."), target_shortname);
    299 
    300   old_chain = make_cleanup (exec_direction_forward, NULL);
    301   execution_direction = EXEC_REVERSE;
    302   exec_continue (argv, argc);
    303   do_cleanups (old_chain);
    304 }
    305 
    306 void
    307 mi_cmd_exec_continue (char *command, char **argv, int argc)
    308 {
    309   if (argc > 0 && strcmp (argv[0], "--reverse") == 0)
    310     exec_reverse_continue (argv + 1, argc - 1);
    311   else
    312     exec_continue (argv, argc);
    313 }
    314 
    315 static int
    316 interrupt_thread_callback (struct thread_info *thread, void *arg)
    317 {
    318   int pid = *(int *)arg;
    319 
    320   if (!is_running (thread->ptid))
    321     return 0;
    322 
    323   if (ptid_get_pid (thread->ptid) != pid)
    324     return 0;
    325 
    326   target_stop (thread->ptid);
    327   return 0;
    328 }
    329 
    330 /* Interrupt the execution of the target.  Note how we must play
    331    around with the token variables, in order to display the current
    332    token in the result of the interrupt command, and the previous
    333    execution token when the target finally stops.  See comments in
    334    mi_cmd_execute.  */
    335 
    336 void
    337 mi_cmd_exec_interrupt (char *command, char **argv, int argc)
    338 {
    339   /* In all-stop mode, everything stops, so we don't need to try
    340      anything specific.  */
    341   if (!non_stop)
    342     {
    343       interrupt_target_1 (0);
    344       return;
    345     }
    346 
    347   if (current_context->all)
    348     {
    349       /* This will interrupt all threads in all inferiors.  */
    350       interrupt_target_1 (1);
    351     }
    352   else if (current_context->thread_group != -1)
    353     {
    354       struct inferior *inf = find_inferior_id (current_context->thread_group);
    355 
    356       iterate_over_threads (interrupt_thread_callback, &inf->pid);
    357     }
    358   else
    359     {
    360       /* Interrupt just the current thread -- either explicitly
    361 	 specified via --thread or whatever was current before
    362 	 MI command was sent.  */
    363       interrupt_target_1 (0);
    364     }
    365 }
    366 
    367 /* Callback for iterate_over_inferiors which starts the execution
    368    of the given inferior.
    369 
    370    ARG is a pointer to an integer whose value, if non-zero, indicates
    371    that the program should be stopped when reaching the main subprogram
    372    (similar to what the CLI "start" command does).  */
    373 
    374 static int
    375 run_one_inferior (struct inferior *inf, void *arg)
    376 {
    377   int start_p = *(int *) arg;
    378   const char *run_cmd = start_p ? "start" : "run";
    379 
    380   if (inf->pid != 0)
    381     {
    382       if (inf->pid != ptid_get_pid (inferior_ptid))
    383 	{
    384 	  struct thread_info *tp;
    385 
    386 	  tp = any_thread_of_process (inf->pid);
    387 	  if (!tp)
    388 	    error (_("Inferior has no threads."));
    389 
    390 	  switch_to_thread (tp->ptid);
    391 	}
    392     }
    393   else
    394     {
    395       set_current_inferior (inf);
    396       switch_to_thread (null_ptid);
    397       set_current_program_space (inf->pspace);
    398     }
    399   mi_execute_cli_command (run_cmd, target_can_async_p (),
    400 			  target_can_async_p () ? "&" : NULL);
    401   return 0;
    402 }
    403 
    404 void
    405 mi_cmd_exec_run (char *command, char **argv, int argc)
    406 {
    407   int i;
    408   int start_p = 0;
    409 
    410   /* Parse the command options.  */
    411   enum opt
    412     {
    413       START_OPT,
    414     };
    415   static const struct mi_opt opts[] =
    416     {
    417 	{"-start", START_OPT, 0},
    418 	{NULL, 0, 0},
    419     };
    420 
    421   int oind = 0;
    422   char *oarg;
    423 
    424   while (1)
    425     {
    426       int opt = mi_getopt ("-exec-run", argc, argv, opts, &oind, &oarg);
    427 
    428       if (opt < 0)
    429 	break;
    430       switch ((enum opt) opt)
    431 	{
    432 	case START_OPT:
    433 	  start_p = 1;
    434 	  break;
    435 	}
    436     }
    437 
    438   /* This command does not accept any argument.  Make sure the user
    439      did not provide any.  */
    440   if (oind != argc)
    441     error (_("Invalid argument: %s"), argv[oind]);
    442 
    443   if (current_context->all)
    444     {
    445       struct cleanup *back_to = save_current_space_and_thread ();
    446 
    447       iterate_over_inferiors (run_one_inferior, &start_p);
    448       do_cleanups (back_to);
    449     }
    450   else
    451     {
    452       const char *run_cmd = start_p ? "start" : "run";
    453 
    454       mi_execute_cli_command (run_cmd, target_can_async_p (),
    455 			      target_can_async_p () ? "&" : NULL);
    456     }
    457 }
    458 
    459 
    460 static int
    461 find_thread_of_process (struct thread_info *ti, void *p)
    462 {
    463   int pid = *(int *)p;
    464 
    465   if (ptid_get_pid (ti->ptid) == pid && !is_exited (ti->ptid))
    466     return 1;
    467 
    468   return 0;
    469 }
    470 
    471 void
    472 mi_cmd_target_detach (char *command, char **argv, int argc)
    473 {
    474   if (argc != 0 && argc != 1)
    475     error (_("Usage: -target-detach [pid | thread-group]"));
    476 
    477   if (argc == 1)
    478     {
    479       struct thread_info *tp;
    480       char *end = argv[0];
    481       int pid;
    482 
    483       /* First see if we are dealing with a thread-group id.  */
    484       if (*argv[0] == 'i')
    485 	{
    486 	  struct inferior *inf;
    487 	  int id = strtoul (argv[0] + 1, &end, 0);
    488 
    489 	  if (*end != '\0')
    490 	    error (_("Invalid syntax of thread-group id '%s'"), argv[0]);
    491 
    492 	  inf = find_inferior_id (id);
    493 	  if (!inf)
    494 	    error (_("Non-existent thread-group id '%d'"), id);
    495 
    496 	  pid = inf->pid;
    497 	}
    498       else
    499 	{
    500 	  /* We must be dealing with a pid.  */
    501 	  pid = strtol (argv[0], &end, 10);
    502 
    503 	  if (*end != '\0')
    504 	    error (_("Invalid identifier '%s'"), argv[0]);
    505 	}
    506 
    507       /* Pick any thread in the desired process.  Current
    508 	 target_detach detaches from the parent of inferior_ptid.  */
    509       tp = iterate_over_threads (find_thread_of_process, &pid);
    510       if (!tp)
    511 	error (_("Thread group is empty"));
    512 
    513       switch_to_thread (tp->ptid);
    514     }
    515 
    516   detach_command (NULL, 0);
    517 }
    518 
    519 void
    520 mi_cmd_thread_select (char *command, char **argv, int argc)
    521 {
    522   enum gdb_rc rc;
    523   char *mi_error_message;
    524 
    525   if (argc != 1)
    526     error (_("-thread-select: USAGE: threadnum."));
    527 
    528   rc = gdb_thread_select (current_uiout, argv[0], &mi_error_message);
    529 
    530   if (rc == GDB_RC_FAIL)
    531     {
    532       make_cleanup (xfree, mi_error_message);
    533       error ("%s", mi_error_message);
    534     }
    535 }
    536 
    537 void
    538 mi_cmd_thread_list_ids (char *command, char **argv, int argc)
    539 {
    540   enum gdb_rc rc;
    541   char *mi_error_message;
    542 
    543   if (argc != 0)
    544     error (_("-thread-list-ids: No arguments required."));
    545 
    546   rc = gdb_list_thread_ids (current_uiout, &mi_error_message);
    547 
    548   if (rc == GDB_RC_FAIL)
    549     {
    550       make_cleanup (xfree, mi_error_message);
    551       error ("%s", mi_error_message);
    552     }
    553 }
    554 
    555 void
    556 mi_cmd_thread_info (char *command, char **argv, int argc)
    557 {
    558   if (argc != 0 && argc != 1)
    559     error (_("Invalid MI command"));
    560 
    561   print_thread_info (current_uiout, argv[0], -1);
    562 }
    563 
    564 struct collect_cores_data
    565 {
    566   int pid;
    567 
    568   VEC (int) *cores;
    569 };
    570 
    571 static int
    572 collect_cores (struct thread_info *ti, void *xdata)
    573 {
    574   struct collect_cores_data *data = xdata;
    575 
    576   if (ptid_get_pid (ti->ptid) == data->pid)
    577     {
    578       int core = target_core_of_thread (ti->ptid);
    579 
    580       if (core != -1)
    581 	VEC_safe_push (int, data->cores, core);
    582     }
    583 
    584   return 0;
    585 }
    586 
    587 static int *
    588 unique (int *b, int *e)
    589 {
    590   int *d = b;
    591 
    592   while (++b != e)
    593     if (*d != *b)
    594       *++d = *b;
    595   return ++d;
    596 }
    597 
    598 struct print_one_inferior_data
    599 {
    600   int recurse;
    601   VEC (int) *inferiors;
    602 };
    603 
    604 static int
    605 print_one_inferior (struct inferior *inferior, void *xdata)
    606 {
    607   struct print_one_inferior_data *top_data = xdata;
    608   struct ui_out *uiout = current_uiout;
    609 
    610   if (VEC_empty (int, top_data->inferiors)
    611       || bsearch (&(inferior->pid), VEC_address (int, top_data->inferiors),
    612 		  VEC_length (int, top_data->inferiors), sizeof (int),
    613 		  compare_positive_ints))
    614     {
    615       struct collect_cores_data data;
    616       struct cleanup *back_to
    617 	= make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
    618 
    619       ui_out_field_fmt (uiout, "id", "i%d", inferior->num);
    620       ui_out_field_string (uiout, "type", "process");
    621       if (inferior->pid != 0)
    622 	ui_out_field_int (uiout, "pid", inferior->pid);
    623 
    624       if (inferior->pspace->pspace_exec_filename != NULL)
    625 	{
    626 	  ui_out_field_string (uiout, "executable",
    627 			       inferior->pspace->pspace_exec_filename);
    628 	}
    629 
    630       data.cores = 0;
    631       if (inferior->pid != 0)
    632 	{
    633 	  data.pid = inferior->pid;
    634 	  iterate_over_threads (collect_cores, &data);
    635 	}
    636 
    637       if (!VEC_empty (int, data.cores))
    638 	{
    639 	  int *b, *e;
    640 	  struct cleanup *back_to_2 =
    641 	    make_cleanup_ui_out_list_begin_end (uiout, "cores");
    642 
    643 	  qsort (VEC_address (int, data.cores),
    644 		 VEC_length (int, data.cores), sizeof (int),
    645 		 compare_positive_ints);
    646 
    647 	  b = VEC_address (int, data.cores);
    648 	  e = b + VEC_length (int, data.cores);
    649 	  e = unique (b, e);
    650 
    651 	  for (; b != e; ++b)
    652 	    ui_out_field_int (uiout, NULL, *b);
    653 
    654 	  do_cleanups (back_to_2);
    655 	}
    656 
    657       if (top_data->recurse)
    658 	print_thread_info (uiout, NULL, inferior->pid);
    659 
    660       do_cleanups (back_to);
    661     }
    662 
    663   return 0;
    664 }
    665 
    666 /* Output a field named 'cores' with a list as the value.  The
    667    elements of the list are obtained by splitting 'cores' on
    668    comma.  */
    669 
    670 static void
    671 output_cores (struct ui_out *uiout, const char *field_name, const char *xcores)
    672 {
    673   struct cleanup *back_to = make_cleanup_ui_out_list_begin_end (uiout,
    674 								field_name);
    675   char *cores = xstrdup (xcores);
    676   char *p = cores;
    677 
    678   make_cleanup (xfree, cores);
    679 
    680   for (p = strtok (p, ","); p;  p = strtok (NULL, ","))
    681     ui_out_field_string (uiout, NULL, p);
    682 
    683   do_cleanups (back_to);
    684 }
    685 
    686 static void
    687 free_vector_of_ints (void *xvector)
    688 {
    689   VEC (int) **vector = xvector;
    690 
    691   VEC_free (int, *vector);
    692 }
    693 
    694 static void
    695 do_nothing (splay_tree_key k)
    696 {
    697 }
    698 
    699 static void
    700 free_vector_of_osdata_items (splay_tree_value xvalue)
    701 {
    702   VEC (osdata_item_s) *value = (VEC (osdata_item_s) *) xvalue;
    703 
    704   /* We don't free the items itself, it will be done separately.  */
    705   VEC_free (osdata_item_s, value);
    706 }
    707 
    708 static int
    709 splay_tree_int_comparator (splay_tree_key xa, splay_tree_key xb)
    710 {
    711   int a = xa;
    712   int b = xb;
    713 
    714   return a - b;
    715 }
    716 
    717 static void
    718 free_splay_tree (void *xt)
    719 {
    720   splay_tree t = xt;
    721   splay_tree_delete (t);
    722 }
    723 
    724 static void
    725 list_available_thread_groups (VEC (int) *ids, int recurse)
    726 {
    727   struct osdata *data;
    728   struct osdata_item *item;
    729   int ix_items;
    730   struct ui_out *uiout = current_uiout;
    731   struct cleanup *cleanup;
    732 
    733   /* This keeps a map from integer (pid) to VEC (struct osdata_item *)*
    734      The vector contains information about all threads for the given pid.
    735      This is assigned an initial value to avoid "may be used uninitialized"
    736      warning from gcc.  */
    737   splay_tree tree = NULL;
    738 
    739   /* get_osdata will throw if it cannot return data.  */
    740   data = get_osdata ("processes");
    741   cleanup = make_cleanup_osdata_free (data);
    742 
    743   if (recurse)
    744     {
    745       struct osdata *threads = get_osdata ("threads");
    746 
    747       make_cleanup_osdata_free (threads);
    748       tree = splay_tree_new (splay_tree_int_comparator,
    749 			     do_nothing,
    750 			     free_vector_of_osdata_items);
    751       make_cleanup (free_splay_tree, tree);
    752 
    753       for (ix_items = 0;
    754 	   VEC_iterate (osdata_item_s, threads->items,
    755 			ix_items, item);
    756 	   ix_items++)
    757 	{
    758 	  const char *pid = get_osdata_column (item, "pid");
    759 	  int pid_i = strtoul (pid, NULL, 0);
    760 	  VEC (osdata_item_s) *vec = 0;
    761 
    762 	  splay_tree_node n = splay_tree_lookup (tree, pid_i);
    763 	  if (!n)
    764 	    {
    765 	      VEC_safe_push (osdata_item_s, vec, item);
    766 	      splay_tree_insert (tree, pid_i, (splay_tree_value)vec);
    767 	    }
    768 	  else
    769 	    {
    770 	      vec = (VEC (osdata_item_s) *) n->value;
    771 	      VEC_safe_push (osdata_item_s, vec, item);
    772 	      n->value = (splay_tree_value) vec;
    773 	    }
    774 	}
    775     }
    776 
    777   make_cleanup_ui_out_list_begin_end (uiout, "groups");
    778 
    779   for (ix_items = 0;
    780        VEC_iterate (osdata_item_s, data->items,
    781 		    ix_items, item);
    782        ix_items++)
    783     {
    784       struct cleanup *back_to;
    785 
    786       const char *pid = get_osdata_column (item, "pid");
    787       const char *cmd = get_osdata_column (item, "command");
    788       const char *user = get_osdata_column (item, "user");
    789       const char *cores = get_osdata_column (item, "cores");
    790 
    791       int pid_i = strtoul (pid, NULL, 0);
    792 
    793       /* At present, the target will return all available processes
    794 	 and if information about specific ones was required, we filter
    795 	 undesired processes here.  */
    796       if (ids && bsearch (&pid_i, VEC_address (int, ids),
    797 			  VEC_length (int, ids),
    798 			  sizeof (int), compare_positive_ints) == NULL)
    799 	continue;
    800 
    801 
    802       back_to = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
    803 
    804       ui_out_field_fmt (uiout, "id", "%s", pid);
    805       ui_out_field_string (uiout, "type", "process");
    806       if (cmd)
    807 	ui_out_field_string (uiout, "description", cmd);
    808       if (user)
    809 	ui_out_field_string (uiout, "user", user);
    810       if (cores)
    811 	output_cores (uiout, "cores", cores);
    812 
    813       if (recurse)
    814 	{
    815 	  splay_tree_node n = splay_tree_lookup (tree, pid_i);
    816 	  if (n)
    817 	    {
    818 	      VEC (osdata_item_s) *children = (VEC (osdata_item_s) *) n->value;
    819 	      struct osdata_item *child;
    820 	      int ix_child;
    821 
    822 	      make_cleanup_ui_out_list_begin_end (uiout, "threads");
    823 
    824 	      for (ix_child = 0;
    825 		   VEC_iterate (osdata_item_s, children, ix_child, child);
    826 		   ++ix_child)
    827 		{
    828 		  struct cleanup *back_to_2 =
    829 		    make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
    830 		  const char *tid = get_osdata_column (child, "tid");
    831 		  const char *tcore = get_osdata_column (child, "core");
    832 
    833 		  ui_out_field_string (uiout, "id", tid);
    834 		  if (tcore)
    835 		    ui_out_field_string (uiout, "core", tcore);
    836 
    837 		  do_cleanups (back_to_2);
    838 		}
    839 	    }
    840 	}
    841 
    842       do_cleanups (back_to);
    843     }
    844 
    845   do_cleanups (cleanup);
    846 }
    847 
    848 void
    849 mi_cmd_list_thread_groups (char *command, char **argv, int argc)
    850 {
    851   struct ui_out *uiout = current_uiout;
    852   struct cleanup *back_to;
    853   int available = 0;
    854   int recurse = 0;
    855   VEC (int) *ids = 0;
    856 
    857   enum opt
    858   {
    859     AVAILABLE_OPT, RECURSE_OPT
    860   };
    861   static const struct mi_opt opts[] =
    862     {
    863       {"-available", AVAILABLE_OPT, 0},
    864       {"-recurse", RECURSE_OPT, 1},
    865       { 0, 0, 0 }
    866     };
    867 
    868   int oind = 0;
    869   char *oarg;
    870 
    871   while (1)
    872     {
    873       int opt = mi_getopt ("-list-thread-groups", argc, argv, opts,
    874 			   &oind, &oarg);
    875 
    876       if (opt < 0)
    877 	break;
    878       switch ((enum opt) opt)
    879 	{
    880 	case AVAILABLE_OPT:
    881 	  available = 1;
    882 	  break;
    883 	case RECURSE_OPT:
    884 	  if (strcmp (oarg, "0") == 0)
    885 	    ;
    886 	  else if (strcmp (oarg, "1") == 0)
    887 	    recurse = 1;
    888 	  else
    889 	    error (_("only '0' and '1' are valid values "
    890 		     "for the '--recurse' option"));
    891 	  break;
    892 	}
    893     }
    894 
    895   for (; oind < argc; ++oind)
    896     {
    897       char *end;
    898       int inf;
    899 
    900       if (*(argv[oind]) != 'i')
    901 	error (_("invalid syntax of group id '%s'"), argv[oind]);
    902 
    903       inf = strtoul (argv[oind] + 1, &end, 0);
    904 
    905       if (*end != '\0')
    906 	error (_("invalid syntax of group id '%s'"), argv[oind]);
    907       VEC_safe_push (int, ids, inf);
    908     }
    909   if (VEC_length (int, ids) > 1)
    910     qsort (VEC_address (int, ids),
    911 	   VEC_length (int, ids),
    912 	   sizeof (int), compare_positive_ints);
    913 
    914   back_to = make_cleanup (free_vector_of_ints, &ids);
    915 
    916   if (available)
    917     {
    918       list_available_thread_groups (ids, recurse);
    919     }
    920   else if (VEC_length (int, ids) == 1)
    921     {
    922       /* Local thread groups, single id.  */
    923       int id = *VEC_address (int, ids);
    924       struct inferior *inf = find_inferior_id (id);
    925 
    926       if (!inf)
    927 	error (_("Non-existent thread group id '%d'"), id);
    928 
    929       print_thread_info (uiout, NULL, inf->pid);
    930     }
    931   else
    932     {
    933       struct print_one_inferior_data data;
    934 
    935       data.recurse = recurse;
    936       data.inferiors = ids;
    937 
    938       /* Local thread groups.  Either no explicit ids -- and we
    939 	 print everything, or several explicit ids.  In both cases,
    940 	 we print more than one group, and have to use 'groups'
    941 	 as the top-level element.  */
    942       make_cleanup_ui_out_list_begin_end (uiout, "groups");
    943       update_thread_list ();
    944       iterate_over_inferiors (print_one_inferior, &data);
    945     }
    946 
    947   do_cleanups (back_to);
    948 }
    949 
    950 void
    951 mi_cmd_data_list_register_names (char *command, char **argv, int argc)
    952 {
    953   struct gdbarch *gdbarch;
    954   struct ui_out *uiout = current_uiout;
    955   int regnum, numregs;
    956   int i;
    957   struct cleanup *cleanup;
    958 
    959   /* Note that the test for a valid register must include checking the
    960      gdbarch_register_name because gdbarch_num_regs may be allocated
    961      for the union of the register sets within a family of related
    962      processors.  In this case, some entries of gdbarch_register_name
    963      will change depending upon the particular processor being
    964      debugged.  */
    965 
    966   gdbarch = get_current_arch ();
    967   numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
    968 
    969   cleanup = make_cleanup_ui_out_list_begin_end (uiout, "register-names");
    970 
    971   if (argc == 0)		/* No args, just do all the regs.  */
    972     {
    973       for (regnum = 0;
    974 	   regnum < numregs;
    975 	   regnum++)
    976 	{
    977 	  if (gdbarch_register_name (gdbarch, regnum) == NULL
    978 	      || *(gdbarch_register_name (gdbarch, regnum)) == '\0')
    979 	    ui_out_field_string (uiout, NULL, "");
    980 	  else
    981 	    ui_out_field_string (uiout, NULL,
    982 				 gdbarch_register_name (gdbarch, regnum));
    983 	}
    984     }
    985 
    986   /* Else, list of register #s, just do listed regs.  */
    987   for (i = 0; i < argc; i++)
    988     {
    989       regnum = atoi (argv[i]);
    990       if (regnum < 0 || regnum >= numregs)
    991 	error (_("bad register number"));
    992 
    993       if (gdbarch_register_name (gdbarch, regnum) == NULL
    994 	  || *(gdbarch_register_name (gdbarch, regnum)) == '\0')
    995 	ui_out_field_string (uiout, NULL, "");
    996       else
    997 	ui_out_field_string (uiout, NULL,
    998 			     gdbarch_register_name (gdbarch, regnum));
    999     }
   1000   do_cleanups (cleanup);
   1001 }
   1002 
   1003 void
   1004 mi_cmd_data_list_changed_registers (char *command, char **argv, int argc)
   1005 {
   1006   static struct regcache *this_regs = NULL;
   1007   struct ui_out *uiout = current_uiout;
   1008   struct regcache *prev_regs;
   1009   struct gdbarch *gdbarch;
   1010   int regnum, numregs, changed;
   1011   int i;
   1012   struct cleanup *cleanup;
   1013 
   1014   /* The last time we visited this function, the current frame's
   1015      register contents were saved in THIS_REGS.  Move THIS_REGS over
   1016      to PREV_REGS, and refresh THIS_REGS with the now-current register
   1017      contents.  */
   1018 
   1019   prev_regs = this_regs;
   1020   this_regs = frame_save_as_regcache (get_selected_frame (NULL));
   1021   cleanup = make_cleanup_regcache_xfree (prev_regs);
   1022 
   1023   /* Note that the test for a valid register must include checking the
   1024      gdbarch_register_name because gdbarch_num_regs may be allocated
   1025      for the union of the register sets within a family of related
   1026      processors.  In this case, some entries of gdbarch_register_name
   1027      will change depending upon the particular processor being
   1028      debugged.  */
   1029 
   1030   gdbarch = get_regcache_arch (this_regs);
   1031   numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
   1032 
   1033   make_cleanup_ui_out_list_begin_end (uiout, "changed-registers");
   1034 
   1035   if (argc == 0)
   1036     {
   1037       /* No args, just do all the regs.  */
   1038       for (regnum = 0;
   1039 	   regnum < numregs;
   1040 	   regnum++)
   1041 	{
   1042 	  if (gdbarch_register_name (gdbarch, regnum) == NULL
   1043 	      || *(gdbarch_register_name (gdbarch, regnum)) == '\0')
   1044 	    continue;
   1045 	  changed = register_changed_p (regnum, prev_regs, this_regs);
   1046 	  if (changed < 0)
   1047 	    error (_("-data-list-changed-registers: "
   1048 		     "Unable to read register contents."));
   1049 	  else if (changed)
   1050 	    ui_out_field_int (uiout, NULL, regnum);
   1051 	}
   1052     }
   1053 
   1054   /* Else, list of register #s, just do listed regs.  */
   1055   for (i = 0; i < argc; i++)
   1056     {
   1057       regnum = atoi (argv[i]);
   1058 
   1059       if (regnum >= 0
   1060 	  && regnum < numregs
   1061 	  && gdbarch_register_name (gdbarch, regnum) != NULL
   1062 	  && *gdbarch_register_name (gdbarch, regnum) != '\000')
   1063 	{
   1064 	  changed = register_changed_p (regnum, prev_regs, this_regs);
   1065 	  if (changed < 0)
   1066 	    error (_("-data-list-changed-registers: "
   1067 		     "Unable to read register contents."));
   1068 	  else if (changed)
   1069 	    ui_out_field_int (uiout, NULL, regnum);
   1070 	}
   1071       else
   1072 	error (_("bad register number"));
   1073     }
   1074   do_cleanups (cleanup);
   1075 }
   1076 
   1077 static int
   1078 register_changed_p (int regnum, struct regcache *prev_regs,
   1079 		    struct regcache *this_regs)
   1080 {
   1081   struct gdbarch *gdbarch = get_regcache_arch (this_regs);
   1082   gdb_byte prev_buffer[MAX_REGISTER_SIZE];
   1083   gdb_byte this_buffer[MAX_REGISTER_SIZE];
   1084   enum register_status prev_status;
   1085   enum register_status this_status;
   1086 
   1087   /* First time through or after gdbarch change consider all registers
   1088      as changed.  */
   1089   if (!prev_regs || get_regcache_arch (prev_regs) != gdbarch)
   1090     return 1;
   1091 
   1092   /* Get register contents and compare.  */
   1093   prev_status = regcache_cooked_read (prev_regs, regnum, prev_buffer);
   1094   this_status = regcache_cooked_read (this_regs, regnum, this_buffer);
   1095 
   1096   if (this_status != prev_status)
   1097     return 1;
   1098   else if (this_status == REG_VALID)
   1099     return memcmp (prev_buffer, this_buffer,
   1100 		   register_size (gdbarch, regnum)) != 0;
   1101   else
   1102     return 0;
   1103 }
   1104 
   1105 /* Return a list of register number and value pairs.  The valid
   1106    arguments expected are: a letter indicating the format in which to
   1107    display the registers contents.  This can be one of: x
   1108    (hexadecimal), d (decimal), N (natural), t (binary), o (octal), r
   1109    (raw).  After the format argument there can be a sequence of
   1110    numbers, indicating which registers to fetch the content of.  If
   1111    the format is the only argument, a list of all the registers with
   1112    their values is returned.  */
   1113 
   1114 void
   1115 mi_cmd_data_list_register_values (char *command, char **argv, int argc)
   1116 {
   1117   struct ui_out *uiout = current_uiout;
   1118   struct frame_info *frame;
   1119   struct gdbarch *gdbarch;
   1120   int regnum, numregs, format;
   1121   int i;
   1122   struct cleanup *list_cleanup;
   1123   int skip_unavailable = 0;
   1124   int oind = 0;
   1125   enum opt
   1126   {
   1127     SKIP_UNAVAILABLE,
   1128   };
   1129   static const struct mi_opt opts[] =
   1130     {
   1131       {"-skip-unavailable", SKIP_UNAVAILABLE, 0},
   1132       { 0, 0, 0 }
   1133     };
   1134 
   1135   /* Note that the test for a valid register must include checking the
   1136      gdbarch_register_name because gdbarch_num_regs may be allocated
   1137      for the union of the register sets within a family of related
   1138      processors.  In this case, some entries of gdbarch_register_name
   1139      will change depending upon the particular processor being
   1140      debugged.  */
   1141 
   1142   while (1)
   1143     {
   1144       char *oarg;
   1145       int opt = mi_getopt ("-data-list-register-values", argc, argv,
   1146 			   opts, &oind, &oarg);
   1147 
   1148       if (opt < 0)
   1149 	break;
   1150       switch ((enum opt) opt)
   1151 	{
   1152 	case SKIP_UNAVAILABLE:
   1153 	  skip_unavailable = 1;
   1154 	  break;
   1155 	}
   1156     }
   1157 
   1158   if (argc - oind < 1)
   1159     error (_("-data-list-register-values: Usage: "
   1160 	     "-data-list-register-values [--skip-unavailable] <format>"
   1161 	     " [<regnum1>...<regnumN>]"));
   1162 
   1163   format = (int) argv[oind][0];
   1164 
   1165   frame = get_selected_frame (NULL);
   1166   gdbarch = get_frame_arch (frame);
   1167   numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
   1168 
   1169   list_cleanup = make_cleanup_ui_out_list_begin_end (uiout, "register-values");
   1170 
   1171   if (argc - oind == 1)
   1172     {
   1173       /* No args, beside the format: do all the regs.  */
   1174       for (regnum = 0;
   1175 	   regnum < numregs;
   1176 	   regnum++)
   1177 	{
   1178 	  if (gdbarch_register_name (gdbarch, regnum) == NULL
   1179 	      || *(gdbarch_register_name (gdbarch, regnum)) == '\0')
   1180 	    continue;
   1181 
   1182 	  output_register (frame, regnum, format, skip_unavailable);
   1183 	}
   1184     }
   1185 
   1186   /* Else, list of register #s, just do listed regs.  */
   1187   for (i = 1 + oind; i < argc; i++)
   1188     {
   1189       regnum = atoi (argv[i]);
   1190 
   1191       if (regnum >= 0
   1192 	  && regnum < numregs
   1193 	  && gdbarch_register_name (gdbarch, regnum) != NULL
   1194 	  && *gdbarch_register_name (gdbarch, regnum) != '\000')
   1195 	output_register (frame, regnum, format, skip_unavailable);
   1196       else
   1197 	error (_("bad register number"));
   1198     }
   1199   do_cleanups (list_cleanup);
   1200 }
   1201 
   1202 /* Output one register REGNUM's contents in the desired FORMAT.  If
   1203    SKIP_UNAVAILABLE is true, skip the register if it is
   1204    unavailable.  */
   1205 
   1206 static void
   1207 output_register (struct frame_info *frame, int regnum, int format,
   1208 		 int skip_unavailable)
   1209 {
   1210   struct gdbarch *gdbarch = get_frame_arch (frame);
   1211   struct ui_out *uiout = current_uiout;
   1212   struct value *val = value_of_register (regnum, frame);
   1213   struct cleanup *tuple_cleanup;
   1214   struct value_print_options opts;
   1215   struct ui_file *stb;
   1216 
   1217   if (skip_unavailable && !value_entirely_available (val))
   1218     return;
   1219 
   1220   tuple_cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
   1221   ui_out_field_int (uiout, "number", regnum);
   1222 
   1223   if (format == 'N')
   1224     format = 0;
   1225 
   1226   if (format == 'r')
   1227     format = 'z';
   1228 
   1229   stb = mem_fileopen ();
   1230   make_cleanup_ui_file_delete (stb);
   1231 
   1232   get_formatted_print_options (&opts, format);
   1233   opts.deref_ref = 1;
   1234   val_print (value_type (val),
   1235 	     value_contents_for_printing (val),
   1236 	     value_embedded_offset (val), 0,
   1237 	     stb, 0, val, &opts, current_language);
   1238   ui_out_field_stream (uiout, "value", stb);
   1239 
   1240   do_cleanups (tuple_cleanup);
   1241 }
   1242 
   1243 /* Write given values into registers. The registers and values are
   1244    given as pairs.  The corresponding MI command is
   1245    -data-write-register-values <format>
   1246                                [<regnum1> <value1>...<regnumN> <valueN>] */
   1247 void
   1248 mi_cmd_data_write_register_values (char *command, char **argv, int argc)
   1249 {
   1250   struct regcache *regcache;
   1251   struct gdbarch *gdbarch;
   1252   int numregs, i;
   1253 
   1254   /* Note that the test for a valid register must include checking the
   1255      gdbarch_register_name because gdbarch_num_regs may be allocated
   1256      for the union of the register sets within a family of related
   1257      processors.  In this case, some entries of gdbarch_register_name
   1258      will change depending upon the particular processor being
   1259      debugged.  */
   1260 
   1261   regcache = get_current_regcache ();
   1262   gdbarch = get_regcache_arch (regcache);
   1263   numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
   1264 
   1265   if (argc == 0)
   1266     error (_("-data-write-register-values: Usage: -data-write-register-"
   1267 	     "values <format> [<regnum1> <value1>...<regnumN> <valueN>]"));
   1268 
   1269   if (!target_has_registers)
   1270     error (_("-data-write-register-values: No registers."));
   1271 
   1272   if (!(argc - 1))
   1273     error (_("-data-write-register-values: No regs and values specified."));
   1274 
   1275   if ((argc - 1) % 2)
   1276     error (_("-data-write-register-values: "
   1277 	     "Regs and vals are not in pairs."));
   1278 
   1279   for (i = 1; i < argc; i = i + 2)
   1280     {
   1281       int regnum = atoi (argv[i]);
   1282 
   1283       if (regnum >= 0 && regnum < numregs
   1284 	  && gdbarch_register_name (gdbarch, regnum)
   1285 	  && *gdbarch_register_name (gdbarch, regnum))
   1286 	{
   1287 	  LONGEST value;
   1288 
   1289 	  /* Get the value as a number.  */
   1290 	  value = parse_and_eval_address (argv[i + 1]);
   1291 
   1292 	  /* Write it down.  */
   1293 	  regcache_cooked_write_signed (regcache, regnum, value);
   1294 	}
   1295       else
   1296 	error (_("bad register number"));
   1297     }
   1298 }
   1299 
   1300 /* Evaluate the value of the argument.  The argument is an
   1301    expression. If the expression contains spaces it needs to be
   1302    included in double quotes.  */
   1303 
   1304 void
   1305 mi_cmd_data_evaluate_expression (char *command, char **argv, int argc)
   1306 {
   1307   struct expression *expr;
   1308   struct cleanup *old_chain;
   1309   struct value *val;
   1310   struct ui_file *stb;
   1311   struct value_print_options opts;
   1312   struct ui_out *uiout = current_uiout;
   1313 
   1314   stb = mem_fileopen ();
   1315   old_chain = make_cleanup_ui_file_delete (stb);
   1316 
   1317   if (argc != 1)
   1318     error (_("-data-evaluate-expression: "
   1319 	     "Usage: -data-evaluate-expression expression"));
   1320 
   1321   expr = parse_expression (argv[0]);
   1322 
   1323   make_cleanup (free_current_contents, &expr);
   1324 
   1325   val = evaluate_expression (expr);
   1326 
   1327   /* Print the result of the expression evaluation.  */
   1328   get_user_print_options (&opts);
   1329   opts.deref_ref = 0;
   1330   common_val_print (val, stb, 0, &opts, current_language);
   1331 
   1332   ui_out_field_stream (uiout, "value", stb);
   1333 
   1334   do_cleanups (old_chain);
   1335 }
   1336 
   1337 /* This is the -data-read-memory command.
   1338 
   1339    ADDR: start address of data to be dumped.
   1340    WORD-FORMAT: a char indicating format for the ``word''.  See
   1341    the ``x'' command.
   1342    WORD-SIZE: size of each ``word''; 1,2,4, or 8 bytes.
   1343    NR_ROW: Number of rows.
   1344    NR_COL: The number of colums (words per row).
   1345    ASCHAR: (OPTIONAL) Append an ascii character dump to each row.  Use
   1346    ASCHAR for unprintable characters.
   1347 
   1348    Reads SIZE*NR_ROW*NR_COL bytes starting at ADDR from memory and
   1349    displayes them.  Returns:
   1350 
   1351    {addr="...",rowN={wordN="..." ,... [,ascii="..."]}, ...}
   1352 
   1353    Returns:
   1354    The number of bytes read is SIZE*ROW*COL.  */
   1355 
   1356 void
   1357 mi_cmd_data_read_memory (char *command, char **argv, int argc)
   1358 {
   1359   struct gdbarch *gdbarch = get_current_arch ();
   1360   struct ui_out *uiout = current_uiout;
   1361   struct cleanup *cleanups = make_cleanup (null_cleanup, NULL);
   1362   CORE_ADDR addr;
   1363   long total_bytes, nr_cols, nr_rows;
   1364   char word_format;
   1365   struct type *word_type;
   1366   long word_size;
   1367   char word_asize;
   1368   char aschar;
   1369   gdb_byte *mbuf;
   1370   int nr_bytes;
   1371   long offset = 0;
   1372   int oind = 0;
   1373   char *oarg;
   1374   enum opt
   1375   {
   1376     OFFSET_OPT
   1377   };
   1378   static const struct mi_opt opts[] =
   1379     {
   1380       {"o", OFFSET_OPT, 1},
   1381       { 0, 0, 0 }
   1382     };
   1383 
   1384   while (1)
   1385     {
   1386       int opt = mi_getopt ("-data-read-memory", argc, argv, opts,
   1387 			   &oind, &oarg);
   1388 
   1389       if (opt < 0)
   1390 	break;
   1391       switch ((enum opt) opt)
   1392 	{
   1393 	case OFFSET_OPT:
   1394 	  offset = atol (oarg);
   1395 	  break;
   1396 	}
   1397     }
   1398   argv += oind;
   1399   argc -= oind;
   1400 
   1401   if (argc < 5 || argc > 6)
   1402     error (_("-data-read-memory: Usage: "
   1403 	     "ADDR WORD-FORMAT WORD-SIZE NR-ROWS NR-COLS [ASCHAR]."));
   1404 
   1405   /* Extract all the arguments. */
   1406 
   1407   /* Start address of the memory dump.  */
   1408   addr = parse_and_eval_address (argv[0]) + offset;
   1409   /* The format character to use when displaying a memory word.  See
   1410      the ``x'' command.  */
   1411   word_format = argv[1][0];
   1412   /* The size of the memory word.  */
   1413   word_size = atol (argv[2]);
   1414   switch (word_size)
   1415     {
   1416     case 1:
   1417       word_type = builtin_type (gdbarch)->builtin_int8;
   1418       word_asize = 'b';
   1419       break;
   1420     case 2:
   1421       word_type = builtin_type (gdbarch)->builtin_int16;
   1422       word_asize = 'h';
   1423       break;
   1424     case 4:
   1425       word_type = builtin_type (gdbarch)->builtin_int32;
   1426       word_asize = 'w';
   1427       break;
   1428     case 8:
   1429       word_type = builtin_type (gdbarch)->builtin_int64;
   1430       word_asize = 'g';
   1431       break;
   1432     default:
   1433       word_type = builtin_type (gdbarch)->builtin_int8;
   1434       word_asize = 'b';
   1435     }
   1436   /* The number of rows.  */
   1437   nr_rows = atol (argv[3]);
   1438   if (nr_rows <= 0)
   1439     error (_("-data-read-memory: invalid number of rows."));
   1440 
   1441   /* Number of bytes per row.  */
   1442   nr_cols = atol (argv[4]);
   1443   if (nr_cols <= 0)
   1444     error (_("-data-read-memory: invalid number of columns."));
   1445 
   1446   /* The un-printable character when printing ascii.  */
   1447   if (argc == 6)
   1448     aschar = *argv[5];
   1449   else
   1450     aschar = 0;
   1451 
   1452   /* Create a buffer and read it in.  */
   1453   total_bytes = word_size * nr_rows * nr_cols;
   1454   mbuf = xcalloc (total_bytes, 1);
   1455   make_cleanup (xfree, mbuf);
   1456 
   1457   /* Dispatch memory reads to the topmost target, not the flattened
   1458      current_target.  */
   1459   nr_bytes = target_read (current_target.beneath,
   1460 			  TARGET_OBJECT_MEMORY, NULL, mbuf,
   1461 			  addr, total_bytes);
   1462   if (nr_bytes <= 0)
   1463     error (_("Unable to read memory."));
   1464 
   1465   /* Output the header information.  */
   1466   ui_out_field_core_addr (uiout, "addr", gdbarch, addr);
   1467   ui_out_field_int (uiout, "nr-bytes", nr_bytes);
   1468   ui_out_field_int (uiout, "total-bytes", total_bytes);
   1469   ui_out_field_core_addr (uiout, "next-row",
   1470 			  gdbarch, addr + word_size * nr_cols);
   1471   ui_out_field_core_addr (uiout, "prev-row",
   1472 			  gdbarch, addr - word_size * nr_cols);
   1473   ui_out_field_core_addr (uiout, "next-page", gdbarch, addr + total_bytes);
   1474   ui_out_field_core_addr (uiout, "prev-page", gdbarch, addr - total_bytes);
   1475 
   1476   /* Build the result as a two dimentional table.  */
   1477   {
   1478     struct ui_file *stream;
   1479     struct cleanup *cleanup_stream;
   1480     int row;
   1481     int row_byte;
   1482 
   1483     stream = mem_fileopen ();
   1484     cleanup_stream = make_cleanup_ui_file_delete (stream);
   1485 
   1486     make_cleanup_ui_out_list_begin_end (uiout, "memory");
   1487     for (row = 0, row_byte = 0;
   1488 	 row < nr_rows;
   1489 	 row++, row_byte += nr_cols * word_size)
   1490       {
   1491 	int col;
   1492 	int col_byte;
   1493 	struct cleanup *cleanup_tuple;
   1494 	struct cleanup *cleanup_list_data;
   1495 	struct value_print_options opts;
   1496 
   1497 	cleanup_tuple = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
   1498 	ui_out_field_core_addr (uiout, "addr", gdbarch, addr + row_byte);
   1499 	/* ui_out_field_core_addr_symbolic (uiout, "saddr", addr +
   1500 	   row_byte); */
   1501 	cleanup_list_data = make_cleanup_ui_out_list_begin_end (uiout, "data");
   1502 	get_formatted_print_options (&opts, word_format);
   1503 	for (col = 0, col_byte = row_byte;
   1504 	     col < nr_cols;
   1505 	     col++, col_byte += word_size)
   1506 	  {
   1507 	    if (col_byte + word_size > nr_bytes)
   1508 	      {
   1509 		ui_out_field_string (uiout, NULL, "N/A");
   1510 	      }
   1511 	    else
   1512 	      {
   1513 		ui_file_rewind (stream);
   1514 		print_scalar_formatted (mbuf + col_byte, word_type, &opts,
   1515 					word_asize, stream);
   1516 		ui_out_field_stream (uiout, NULL, stream);
   1517 	      }
   1518 	  }
   1519 	do_cleanups (cleanup_list_data);
   1520 	if (aschar)
   1521 	  {
   1522 	    int byte;
   1523 
   1524 	    ui_file_rewind (stream);
   1525 	    for (byte = row_byte;
   1526 		 byte < row_byte + word_size * nr_cols; byte++)
   1527 	      {
   1528 		if (byte >= nr_bytes)
   1529 		  fputc_unfiltered ('X', stream);
   1530 		else if (mbuf[byte] < 32 || mbuf[byte] > 126)
   1531 		  fputc_unfiltered (aschar, stream);
   1532 		else
   1533 		  fputc_unfiltered (mbuf[byte], stream);
   1534 	      }
   1535 	    ui_out_field_stream (uiout, "ascii", stream);
   1536 	  }
   1537 	do_cleanups (cleanup_tuple);
   1538       }
   1539     do_cleanups (cleanup_stream);
   1540   }
   1541   do_cleanups (cleanups);
   1542 }
   1543 
   1544 void
   1545 mi_cmd_data_read_memory_bytes (char *command, char **argv, int argc)
   1546 {
   1547   struct gdbarch *gdbarch = get_current_arch ();
   1548   struct ui_out *uiout = current_uiout;
   1549   struct cleanup *cleanups;
   1550   CORE_ADDR addr;
   1551   LONGEST length;
   1552   memory_read_result_s *read_result;
   1553   int ix;
   1554   VEC(memory_read_result_s) *result;
   1555   long offset = 0;
   1556   int oind = 0;
   1557   char *oarg;
   1558   enum opt
   1559   {
   1560     OFFSET_OPT
   1561   };
   1562   static const struct mi_opt opts[] =
   1563     {
   1564       {"o", OFFSET_OPT, 1},
   1565       { 0, 0, 0 }
   1566     };
   1567 
   1568   while (1)
   1569     {
   1570       int opt = mi_getopt ("-data-read-memory-bytes", argc, argv, opts,
   1571 			   &oind, &oarg);
   1572       if (opt < 0)
   1573 	break;
   1574       switch ((enum opt) opt)
   1575 	{
   1576 	case OFFSET_OPT:
   1577 	  offset = atol (oarg);
   1578 	  break;
   1579 	}
   1580     }
   1581   argv += oind;
   1582   argc -= oind;
   1583 
   1584   if (argc != 2)
   1585     error (_("Usage: [ -o OFFSET ] ADDR LENGTH."));
   1586 
   1587   addr = parse_and_eval_address (argv[0]) + offset;
   1588   length = atol (argv[1]);
   1589 
   1590   result = read_memory_robust (current_target.beneath, addr, length);
   1591 
   1592   cleanups = make_cleanup (free_memory_read_result_vector, result);
   1593 
   1594   if (VEC_length (memory_read_result_s, result) == 0)
   1595     error (_("Unable to read memory."));
   1596 
   1597   make_cleanup_ui_out_list_begin_end (uiout, "memory");
   1598   for (ix = 0;
   1599        VEC_iterate (memory_read_result_s, result, ix, read_result);
   1600        ++ix)
   1601     {
   1602       struct cleanup *t = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
   1603       char *data, *p;
   1604       int i;
   1605 
   1606       ui_out_field_core_addr (uiout, "begin", gdbarch, read_result->begin);
   1607       ui_out_field_core_addr (uiout, "offset", gdbarch, read_result->begin
   1608 			      - addr);
   1609       ui_out_field_core_addr (uiout, "end", gdbarch, read_result->end);
   1610 
   1611       data = xmalloc ((read_result->end - read_result->begin) * 2 + 1);
   1612 
   1613       for (i = 0, p = data;
   1614 	   i < (read_result->end - read_result->begin);
   1615 	   ++i, p += 2)
   1616 	{
   1617 	  sprintf (p, "%02x", read_result->data[i]);
   1618 	}
   1619       ui_out_field_string (uiout, "contents", data);
   1620       xfree (data);
   1621       do_cleanups (t);
   1622     }
   1623   do_cleanups (cleanups);
   1624 }
   1625 
   1626 /* Implementation of the -data-write_memory command.
   1627 
   1628    COLUMN_OFFSET: optional argument. Must be preceded by '-o'. The
   1629    offset from the beginning of the memory grid row where the cell to
   1630    be written is.
   1631    ADDR: start address of the row in the memory grid where the memory
   1632    cell is, if OFFSET_COLUMN is specified.  Otherwise, the address of
   1633    the location to write to.
   1634    FORMAT: a char indicating format for the ``word''.  See
   1635    the ``x'' command.
   1636    WORD_SIZE: size of each ``word''; 1,2,4, or 8 bytes
   1637    VALUE: value to be written into the memory address.
   1638 
   1639    Writes VALUE into ADDR + (COLUMN_OFFSET * WORD_SIZE).
   1640 
   1641    Prints nothing.  */
   1642 
   1643 void
   1644 mi_cmd_data_write_memory (char *command, char **argv, int argc)
   1645 {
   1646   struct gdbarch *gdbarch = get_current_arch ();
   1647   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   1648   CORE_ADDR addr;
   1649   long word_size;
   1650   /* FIXME: ezannoni 2000-02-17 LONGEST could possibly not be big
   1651      enough when using a compiler other than GCC.  */
   1652   LONGEST value;
   1653   void *buffer;
   1654   struct cleanup *old_chain;
   1655   long offset = 0;
   1656   int oind = 0;
   1657   char *oarg;
   1658   enum opt
   1659   {
   1660     OFFSET_OPT
   1661   };
   1662   static const struct mi_opt opts[] =
   1663     {
   1664       {"o", OFFSET_OPT, 1},
   1665       { 0, 0, 0 }
   1666     };
   1667 
   1668   while (1)
   1669     {
   1670       int opt = mi_getopt ("-data-write-memory", argc, argv, opts,
   1671 			   &oind, &oarg);
   1672 
   1673       if (opt < 0)
   1674 	break;
   1675       switch ((enum opt) opt)
   1676 	{
   1677 	case OFFSET_OPT:
   1678 	  offset = atol (oarg);
   1679 	  break;
   1680 	}
   1681     }
   1682   argv += oind;
   1683   argc -= oind;
   1684 
   1685   if (argc != 4)
   1686     error (_("-data-write-memory: Usage: "
   1687 	     "[-o COLUMN_OFFSET] ADDR FORMAT WORD-SIZE VALUE."));
   1688 
   1689   /* Extract all the arguments.  */
   1690   /* Start address of the memory dump.  */
   1691   addr = parse_and_eval_address (argv[0]);
   1692   /* The size of the memory word.  */
   1693   word_size = atol (argv[2]);
   1694 
   1695   /* Calculate the real address of the write destination.  */
   1696   addr += (offset * word_size);
   1697 
   1698   /* Get the value as a number.  */
   1699   value = parse_and_eval_address (argv[3]);
   1700   /* Get the value into an array.  */
   1701   buffer = xmalloc (word_size);
   1702   old_chain = make_cleanup (xfree, buffer);
   1703   store_signed_integer (buffer, word_size, byte_order, value);
   1704   /* Write it down to memory.  */
   1705   write_memory_with_notification (addr, buffer, word_size);
   1706   /* Free the buffer.  */
   1707   do_cleanups (old_chain);
   1708 }
   1709 
   1710 /* Implementation of the -data-write-memory-bytes command.
   1711 
   1712    ADDR: start address
   1713    DATA: string of bytes to write at that address
   1714    COUNT: number of bytes to be filled (decimal integer).  */
   1715 
   1716 void
   1717 mi_cmd_data_write_memory_bytes (char *command, char **argv, int argc)
   1718 {
   1719   CORE_ADDR addr;
   1720   char *cdata;
   1721   gdb_byte *data;
   1722   gdb_byte *databuf;
   1723   size_t len, i, steps, remainder;
   1724   long int count, j;
   1725   struct cleanup *back_to;
   1726 
   1727   if (argc != 2 && argc != 3)
   1728     error (_("Usage: ADDR DATA [COUNT]."));
   1729 
   1730   addr = parse_and_eval_address (argv[0]);
   1731   cdata = argv[1];
   1732   if (strlen (cdata) % 2)
   1733     error (_("Hex-encoded '%s' must have an even number of characters."),
   1734 	   cdata);
   1735 
   1736   len = strlen (cdata)/2;
   1737   if (argc == 3)
   1738     count = strtoul (argv[2], NULL, 10);
   1739   else
   1740     count = len;
   1741 
   1742   databuf = xmalloc (len * sizeof (gdb_byte));
   1743   back_to = make_cleanup (xfree, databuf);
   1744 
   1745   for (i = 0; i < len; ++i)
   1746     {
   1747       int x;
   1748       if (sscanf (cdata + i * 2, "%02x", &x) != 1)
   1749         error (_("Invalid argument"));
   1750       databuf[i] = (gdb_byte) x;
   1751     }
   1752 
   1753   if (len < count)
   1754     {
   1755       /* Pattern is made of less bytes than count:
   1756          repeat pattern to fill memory.  */
   1757       data = xmalloc (count);
   1758       make_cleanup (xfree, data);
   1759 
   1760       steps = count / len;
   1761       remainder = count % len;
   1762       for (j = 0; j < steps; j++)
   1763         memcpy (data + j * len, databuf, len);
   1764 
   1765       if (remainder > 0)
   1766         memcpy (data + steps * len, databuf, remainder);
   1767     }
   1768   else
   1769     {
   1770       /* Pattern is longer than or equal to count:
   1771          just copy len bytes.  */
   1772       data = databuf;
   1773     }
   1774 
   1775   write_memory_with_notification (addr, data, count);
   1776 
   1777   do_cleanups (back_to);
   1778 }
   1779 
   1780 void
   1781 mi_cmd_enable_timings (char *command, char **argv, int argc)
   1782 {
   1783   if (argc == 0)
   1784     do_timings = 1;
   1785   else if (argc == 1)
   1786     {
   1787       if (strcmp (argv[0], "yes") == 0)
   1788 	do_timings = 1;
   1789       else if (strcmp (argv[0], "no") == 0)
   1790 	do_timings = 0;
   1791       else
   1792 	goto usage_error;
   1793     }
   1794   else
   1795     goto usage_error;
   1796 
   1797   return;
   1798 
   1799  usage_error:
   1800   error (_("-enable-timings: Usage: %s {yes|no}"), command);
   1801 }
   1802 
   1803 void
   1804 mi_cmd_list_features (char *command, char **argv, int argc)
   1805 {
   1806   if (argc == 0)
   1807     {
   1808       struct cleanup *cleanup = NULL;
   1809       struct ui_out *uiout = current_uiout;
   1810 
   1811       cleanup = make_cleanup_ui_out_list_begin_end (uiout, "features");
   1812       ui_out_field_string (uiout, NULL, "frozen-varobjs");
   1813       ui_out_field_string (uiout, NULL, "pending-breakpoints");
   1814       ui_out_field_string (uiout, NULL, "thread-info");
   1815       ui_out_field_string (uiout, NULL, "data-read-memory-bytes");
   1816       ui_out_field_string (uiout, NULL, "breakpoint-notifications");
   1817       ui_out_field_string (uiout, NULL, "ada-task-info");
   1818       ui_out_field_string (uiout, NULL, "language-option");
   1819       ui_out_field_string (uiout, NULL, "info-gdb-mi-command");
   1820       ui_out_field_string (uiout, NULL, "undefined-command-error-code");
   1821       ui_out_field_string (uiout, NULL, "exec-run-start-option");
   1822 
   1823 #if HAVE_PYTHON
   1824       if (gdb_python_initialized)
   1825 	ui_out_field_string (uiout, NULL, "python");
   1826 #endif
   1827 
   1828       do_cleanups (cleanup);
   1829       return;
   1830     }
   1831 
   1832   error (_("-list-features should be passed no arguments"));
   1833 }
   1834 
   1835 void
   1836 mi_cmd_list_target_features (char *command, char **argv, int argc)
   1837 {
   1838   if (argc == 0)
   1839     {
   1840       struct cleanup *cleanup = NULL;
   1841       struct ui_out *uiout = current_uiout;
   1842 
   1843       cleanup = make_cleanup_ui_out_list_begin_end (uiout, "features");
   1844       if (target_can_async_p ())
   1845 	ui_out_field_string (uiout, NULL, "async");
   1846       if (target_can_execute_reverse)
   1847 	ui_out_field_string (uiout, NULL, "reverse");
   1848 
   1849       do_cleanups (cleanup);
   1850       return;
   1851     }
   1852 
   1853   error (_("-list-target-features should be passed no arguments"));
   1854 }
   1855 
   1856 void
   1857 mi_cmd_add_inferior (char *command, char **argv, int argc)
   1858 {
   1859   struct inferior *inf;
   1860 
   1861   if (argc != 0)
   1862     error (_("-add-inferior should be passed no arguments"));
   1863 
   1864   inf = add_inferior_with_spaces ();
   1865 
   1866   ui_out_field_fmt (current_uiout, "inferior", "i%d", inf->num);
   1867 }
   1868 
   1869 /* Callback used to find the first inferior other than the current
   1870    one.  */
   1871 
   1872 static int
   1873 get_other_inferior (struct inferior *inf, void *arg)
   1874 {
   1875   if (inf == current_inferior ())
   1876     return 0;
   1877 
   1878   return 1;
   1879 }
   1880 
   1881 void
   1882 mi_cmd_remove_inferior (char *command, char **argv, int argc)
   1883 {
   1884   int id;
   1885   struct inferior *inf;
   1886 
   1887   if (argc != 1)
   1888     error (_("-remove-inferior should be passed a single argument"));
   1889 
   1890   if (sscanf (argv[0], "i%d", &id) != 1)
   1891     error (_("the thread group id is syntactically invalid"));
   1892 
   1893   inf = find_inferior_id (id);
   1894   if (!inf)
   1895     error (_("the specified thread group does not exist"));
   1896 
   1897   if (inf->pid != 0)
   1898     error (_("cannot remove an active inferior"));
   1899 
   1900   if (inf == current_inferior ())
   1901     {
   1902       struct thread_info *tp = 0;
   1903       struct inferior *new_inferior
   1904 	= iterate_over_inferiors (get_other_inferior, NULL);
   1905 
   1906       if (new_inferior == NULL)
   1907 	error (_("Cannot remove last inferior"));
   1908 
   1909       set_current_inferior (new_inferior);
   1910       if (new_inferior->pid != 0)
   1911 	tp = any_thread_of_process (new_inferior->pid);
   1912       switch_to_thread (tp ? tp->ptid : null_ptid);
   1913       set_current_program_space (new_inferior->pspace);
   1914     }
   1915 
   1916   delete_inferior_1 (inf, 1 /* silent */);
   1917 }
   1918 
   1919 
   1920 
   1922 /* Execute a command within a safe environment.
   1923    Return <0 for error; >=0 for ok.
   1924 
   1925    args->action will tell mi_execute_command what action
   1926    to perfrom after the given command has executed (display/suppress
   1927    prompt, display error).  */
   1928 
   1929 static void
   1930 captured_mi_execute_command (struct ui_out *uiout, struct mi_parse *context)
   1931 {
   1932   struct cleanup *cleanup;
   1933 
   1934   if (do_timings)
   1935     current_command_ts = context->cmd_start;
   1936 
   1937   current_token = xstrdup (context->token);
   1938   cleanup = make_cleanup (free_current_contents, &current_token);
   1939 
   1940   running_result_record_printed = 0;
   1941   mi_proceeded = 0;
   1942   switch (context->op)
   1943     {
   1944     case MI_COMMAND:
   1945       /* A MI command was read from the input stream.  */
   1946       if (mi_debug_p)
   1947 	/* FIXME: gdb_???? */
   1948 	fprintf_unfiltered (raw_stdout, " token=`%s' command=`%s' args=`%s'\n",
   1949 			    context->token, context->command, context->args);
   1950 
   1951       mi_cmd_execute (context);
   1952 
   1953       /* Print the result if there were no errors.
   1954 
   1955 	 Remember that on the way out of executing a command, you have
   1956 	 to directly use the mi_interp's uiout, since the command
   1957 	 could have reset the interpreter, in which case the current
   1958 	 uiout will most likely crash in the mi_out_* routines.  */
   1959       if (!running_result_record_printed)
   1960 	{
   1961 	  fputs_unfiltered (context->token, raw_stdout);
   1962 	  /* There's no particularly good reason why target-connect results
   1963 	     in not ^done.  Should kill ^connected for MI3.  */
   1964 	  fputs_unfiltered (strcmp (context->command, "target-select") == 0
   1965 			    ? "^connected" : "^done", raw_stdout);
   1966 	  mi_out_put (uiout, raw_stdout);
   1967 	  mi_out_rewind (uiout);
   1968 	  mi_print_timing_maybe ();
   1969 	  fputs_unfiltered ("\n", raw_stdout);
   1970 	}
   1971       else
   1972 	/* The command does not want anything to be printed.  In that
   1973 	   case, the command probably should not have written anything
   1974 	   to uiout, but in case it has written something, discard it.  */
   1975 	mi_out_rewind (uiout);
   1976       break;
   1977 
   1978     case CLI_COMMAND:
   1979       {
   1980 	char *argv[2];
   1981 
   1982 	/* A CLI command was read from the input stream.  */
   1983 	/* This "feature" will be removed as soon as we have a
   1984 	   complete set of mi commands.  */
   1985 	/* Echo the command on the console.  */
   1986 	fprintf_unfiltered (gdb_stdlog, "%s\n", context->command);
   1987 	/* Call the "console" interpreter.  */
   1988 	argv[0] = "console";
   1989 	argv[1] = context->command;
   1990 	mi_cmd_interpreter_exec ("-interpreter-exec", argv, 2);
   1991 
   1992 	/* If we changed interpreters, DON'T print out anything.  */
   1993 	if (current_interp_named_p (INTERP_MI)
   1994 	    || current_interp_named_p (INTERP_MI1)
   1995 	    || current_interp_named_p (INTERP_MI2)
   1996 	    || current_interp_named_p (INTERP_MI3))
   1997 	  {
   1998 	    if (!running_result_record_printed)
   1999 	      {
   2000 		fputs_unfiltered (context->token, raw_stdout);
   2001 		fputs_unfiltered ("^done", raw_stdout);
   2002 		mi_out_put (uiout, raw_stdout);
   2003 		mi_out_rewind (uiout);
   2004 		mi_print_timing_maybe ();
   2005 		fputs_unfiltered ("\n", raw_stdout);
   2006 	      }
   2007 	    else
   2008 	      mi_out_rewind (uiout);
   2009 	  }
   2010 	break;
   2011       }
   2012     }
   2013 
   2014   do_cleanups (cleanup);
   2015 }
   2016 
   2017 /* Print a gdb exception to the MI output stream.  */
   2018 
   2019 static void
   2020 mi_print_exception (const char *token, struct gdb_exception exception)
   2021 {
   2022   fputs_unfiltered (token, raw_stdout);
   2023   fputs_unfiltered ("^error,msg=\"", raw_stdout);
   2024   if (exception.message == NULL)
   2025     fputs_unfiltered ("unknown error", raw_stdout);
   2026   else
   2027     fputstr_unfiltered (exception.message, '"', raw_stdout);
   2028   fputs_unfiltered ("\"", raw_stdout);
   2029 
   2030   switch (exception.error)
   2031     {
   2032       case UNDEFINED_COMMAND_ERROR:
   2033 	fputs_unfiltered (",code=\"undefined-command\"", raw_stdout);
   2034 	break;
   2035     }
   2036 
   2037   fputs_unfiltered ("\n", raw_stdout);
   2038 }
   2039 
   2040 void
   2041 mi_execute_command (const char *cmd, int from_tty)
   2042 {
   2043   char *token;
   2044   struct mi_parse *command = NULL;
   2045   volatile struct gdb_exception exception;
   2046 
   2047   /* This is to handle EOF (^D). We just quit gdb.  */
   2048   /* FIXME: we should call some API function here.  */
   2049   if (cmd == 0)
   2050     quit_force (NULL, from_tty);
   2051 
   2052   target_log_command (cmd);
   2053 
   2054   TRY_CATCH (exception, RETURN_MASK_ALL)
   2055     {
   2056       command = mi_parse (cmd, &token);
   2057     }
   2058   if (exception.reason < 0)
   2059     {
   2060       mi_print_exception (token, exception);
   2061       xfree (token);
   2062     }
   2063   else
   2064     {
   2065       volatile struct gdb_exception result;
   2066       ptid_t previous_ptid = inferior_ptid;
   2067 
   2068       command->token = token;
   2069 
   2070       if (do_timings)
   2071 	{
   2072 	  command->cmd_start = (struct mi_timestamp *)
   2073 	    xmalloc (sizeof (struct mi_timestamp));
   2074 	  timestamp (command->cmd_start);
   2075 	}
   2076 
   2077       TRY_CATCH (result, RETURN_MASK_ALL)
   2078 	{
   2079 	  captured_mi_execute_command (current_uiout, command);
   2080 	}
   2081       if (result.reason < 0)
   2082 	{
   2083 	  /* The command execution failed and error() was called
   2084 	     somewhere.  */
   2085 	  mi_print_exception (command->token, result);
   2086 	  mi_out_rewind (current_uiout);
   2087 	}
   2088 
   2089       bpstat_do_actions ();
   2090 
   2091       if (/* The notifications are only output when the top-level
   2092 	     interpreter (specified on the command line) is MI.  */
   2093 	  ui_out_is_mi_like_p (interp_ui_out (top_level_interpreter ()))
   2094 	  /* Don't try report anything if there are no threads --
   2095 	     the program is dead.  */
   2096 	  && thread_count () != 0
   2097 	  /* -thread-select explicitly changes thread. If frontend uses that
   2098 	     internally, we don't want to emit =thread-selected, since
   2099 	     =thread-selected is supposed to indicate user's intentions.  */
   2100 	  && strcmp (command->command, "thread-select") != 0)
   2101 	{
   2102 	  struct mi_interp *mi = top_level_interpreter_data ();
   2103 	  int report_change = 0;
   2104 
   2105 	  if (command->thread == -1)
   2106 	    {
   2107 	      report_change = (!ptid_equal (previous_ptid, null_ptid)
   2108 			       && !ptid_equal (inferior_ptid, previous_ptid)
   2109 			       && !ptid_equal (inferior_ptid, null_ptid));
   2110 	    }
   2111 	  else if (!ptid_equal (inferior_ptid, null_ptid))
   2112 	    {
   2113 	      struct thread_info *ti = inferior_thread ();
   2114 
   2115 	      report_change = (ti->num != command->thread);
   2116 	    }
   2117 
   2118 	  if (report_change)
   2119 	    {
   2120 	      struct thread_info *ti = inferior_thread ();
   2121 
   2122 	      target_terminal_ours ();
   2123 	      fprintf_unfiltered (mi->event_channel,
   2124 				  "thread-selected,id=\"%d\"",
   2125 				  ti->num);
   2126 	      gdb_flush (mi->event_channel);
   2127 	    }
   2128 	}
   2129 
   2130       mi_parse_free (command);
   2131     }
   2132 }
   2133 
   2134 static void
   2135 mi_cmd_execute (struct mi_parse *parse)
   2136 {
   2137   struct cleanup *cleanup;
   2138   enum language saved_language;
   2139 
   2140   cleanup = prepare_execute_command ();
   2141 
   2142   if (parse->all && parse->thread_group != -1)
   2143     error (_("Cannot specify --thread-group together with --all"));
   2144 
   2145   if (parse->all && parse->thread != -1)
   2146     error (_("Cannot specify --thread together with --all"));
   2147 
   2148   if (parse->thread_group != -1 && parse->thread != -1)
   2149     error (_("Cannot specify --thread together with --thread-group"));
   2150 
   2151   if (parse->frame != -1 && parse->thread == -1)
   2152     error (_("Cannot specify --frame without --thread"));
   2153 
   2154   if (parse->thread_group != -1)
   2155     {
   2156       struct inferior *inf = find_inferior_id (parse->thread_group);
   2157       struct thread_info *tp = 0;
   2158 
   2159       if (!inf)
   2160 	error (_("Invalid thread group for the --thread-group option"));
   2161 
   2162       set_current_inferior (inf);
   2163       /* This behaviour means that if --thread-group option identifies
   2164 	 an inferior with multiple threads, then a random one will be
   2165 	 picked.  This is not a problem -- frontend should always
   2166 	 provide --thread if it wishes to operate on a specific
   2167 	 thread.  */
   2168       if (inf->pid != 0)
   2169 	tp = any_live_thread_of_process (inf->pid);
   2170       switch_to_thread (tp ? tp->ptid : null_ptid);
   2171       set_current_program_space (inf->pspace);
   2172     }
   2173 
   2174   if (parse->thread != -1)
   2175     {
   2176       struct thread_info *tp = find_thread_id (parse->thread);
   2177 
   2178       if (!tp)
   2179 	error (_("Invalid thread id: %d"), parse->thread);
   2180 
   2181       if (is_exited (tp->ptid))
   2182 	error (_("Thread id: %d has terminated"), parse->thread);
   2183 
   2184       switch_to_thread (tp->ptid);
   2185     }
   2186 
   2187   if (parse->frame != -1)
   2188     {
   2189       struct frame_info *fid;
   2190       int frame = parse->frame;
   2191 
   2192       fid = find_relative_frame (get_current_frame (), &frame);
   2193       if (frame == 0)
   2194 	/* find_relative_frame was successful */
   2195 	select_frame (fid);
   2196       else
   2197 	error (_("Invalid frame id: %d"), frame);
   2198     }
   2199 
   2200   if (parse->language != language_unknown)
   2201     {
   2202       make_cleanup_restore_current_language ();
   2203       set_language (parse->language);
   2204     }
   2205 
   2206   current_context = parse;
   2207 
   2208   if (parse->cmd->suppress_notification != NULL)
   2209     {
   2210       make_cleanup_restore_integer (parse->cmd->suppress_notification);
   2211       *parse->cmd->suppress_notification = 1;
   2212     }
   2213 
   2214   if (parse->cmd->argv_func != NULL)
   2215     {
   2216       parse->cmd->argv_func (parse->command, parse->argv, parse->argc);
   2217     }
   2218   else if (parse->cmd->cli.cmd != 0)
   2219     {
   2220       /* FIXME: DELETE THIS. */
   2221       /* The operation is still implemented by a cli command.  */
   2222       /* Must be a synchronous one.  */
   2223       mi_execute_cli_command (parse->cmd->cli.cmd, parse->cmd->cli.args_p,
   2224 			      parse->args);
   2225     }
   2226   else
   2227     {
   2228       /* FIXME: DELETE THIS.  */
   2229       struct ui_file *stb;
   2230 
   2231       stb = mem_fileopen ();
   2232 
   2233       fputs_unfiltered ("Undefined mi command: ", stb);
   2234       fputstr_unfiltered (parse->command, '"', stb);
   2235       fputs_unfiltered (" (missing implementation)", stb);
   2236 
   2237       make_cleanup_ui_file_delete (stb);
   2238       error_stream (stb);
   2239     }
   2240   do_cleanups (cleanup);
   2241 }
   2242 
   2243 /* FIXME: This is just a hack so we can get some extra commands going.
   2244    We don't want to channel things through the CLI, but call libgdb directly.
   2245    Use only for synchronous commands.  */
   2246 
   2247 void
   2248 mi_execute_cli_command (const char *cmd, int args_p, const char *args)
   2249 {
   2250   if (cmd != 0)
   2251     {
   2252       struct cleanup *old_cleanups;
   2253       char *run;
   2254 
   2255       if (args_p)
   2256 	run = xstrprintf ("%s %s", cmd, args);
   2257       else
   2258 	run = xstrdup (cmd);
   2259       if (mi_debug_p)
   2260 	/* FIXME: gdb_???? */
   2261 	fprintf_unfiltered (gdb_stdout, "cli=%s run=%s\n",
   2262 			    cmd, run);
   2263       old_cleanups = make_cleanup (xfree, run);
   2264       execute_command (run, 0 /* from_tty */ );
   2265       do_cleanups (old_cleanups);
   2266       return;
   2267     }
   2268 }
   2269 
   2270 void
   2271 mi_execute_async_cli_command (char *cli_command, char **argv, int argc)
   2272 {
   2273   struct cleanup *old_cleanups;
   2274   char *run;
   2275 
   2276   if (target_can_async_p ())
   2277     run = xstrprintf ("%s %s&", cli_command, argc ? *argv : "");
   2278   else
   2279     run = xstrprintf ("%s %s", cli_command, argc ? *argv : "");
   2280   old_cleanups = make_cleanup (xfree, run);
   2281 
   2282   execute_command (run, 0 /* from_tty */ );
   2283 
   2284   /* Do this before doing any printing.  It would appear that some
   2285      print code leaves garbage around in the buffer.  */
   2286   do_cleanups (old_cleanups);
   2287 }
   2288 
   2289 void
   2290 mi_load_progress (const char *section_name,
   2291 		  unsigned long sent_so_far,
   2292 		  unsigned long total_section,
   2293 		  unsigned long total_sent,
   2294 		  unsigned long grand_total)
   2295 {
   2296   struct timeval time_now, delta, update_threshold;
   2297   static struct timeval last_update;
   2298   static char *previous_sect_name = NULL;
   2299   int new_section;
   2300   struct ui_out *saved_uiout;
   2301   struct ui_out *uiout;
   2302 
   2303   /* This function is called through deprecated_show_load_progress
   2304      which means uiout may not be correct.  Fix it for the duration
   2305      of this function.  */
   2306   saved_uiout = current_uiout;
   2307 
   2308   if (current_interp_named_p (INTERP_MI)
   2309       || current_interp_named_p (INTERP_MI2))
   2310     current_uiout = mi_out_new (2);
   2311   else if (current_interp_named_p (INTERP_MI1))
   2312     current_uiout = mi_out_new (1);
   2313   else if (current_interp_named_p (INTERP_MI3))
   2314     current_uiout = mi_out_new (3);
   2315   else
   2316     return;
   2317 
   2318   uiout = current_uiout;
   2319 
   2320   update_threshold.tv_sec = 0;
   2321   update_threshold.tv_usec = 500000;
   2322   gettimeofday (&time_now, NULL);
   2323 
   2324   delta.tv_usec = time_now.tv_usec - last_update.tv_usec;
   2325   delta.tv_sec = time_now.tv_sec - last_update.tv_sec;
   2326 
   2327   if (delta.tv_usec < 0)
   2328     {
   2329       delta.tv_sec -= 1;
   2330       delta.tv_usec += 1000000L;
   2331     }
   2332 
   2333   new_section = (previous_sect_name ?
   2334 		 strcmp (previous_sect_name, section_name) : 1);
   2335   if (new_section)
   2336     {
   2337       struct cleanup *cleanup_tuple;
   2338 
   2339       xfree (previous_sect_name);
   2340       previous_sect_name = xstrdup (section_name);
   2341 
   2342       if (current_token)
   2343 	fputs_unfiltered (current_token, raw_stdout);
   2344       fputs_unfiltered ("+download", raw_stdout);
   2345       cleanup_tuple = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
   2346       ui_out_field_string (uiout, "section", section_name);
   2347       ui_out_field_int (uiout, "section-size", total_section);
   2348       ui_out_field_int (uiout, "total-size", grand_total);
   2349       do_cleanups (cleanup_tuple);
   2350       mi_out_put (uiout, raw_stdout);
   2351       fputs_unfiltered ("\n", raw_stdout);
   2352       gdb_flush (raw_stdout);
   2353     }
   2354 
   2355   if (delta.tv_sec >= update_threshold.tv_sec &&
   2356       delta.tv_usec >= update_threshold.tv_usec)
   2357     {
   2358       struct cleanup *cleanup_tuple;
   2359 
   2360       last_update.tv_sec = time_now.tv_sec;
   2361       last_update.tv_usec = time_now.tv_usec;
   2362       if (current_token)
   2363 	fputs_unfiltered (current_token, raw_stdout);
   2364       fputs_unfiltered ("+download", raw_stdout);
   2365       cleanup_tuple = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
   2366       ui_out_field_string (uiout, "section", section_name);
   2367       ui_out_field_int (uiout, "section-sent", sent_so_far);
   2368       ui_out_field_int (uiout, "section-size", total_section);
   2369       ui_out_field_int (uiout, "total-sent", total_sent);
   2370       ui_out_field_int (uiout, "total-size", grand_total);
   2371       do_cleanups (cleanup_tuple);
   2372       mi_out_put (uiout, raw_stdout);
   2373       fputs_unfiltered ("\n", raw_stdout);
   2374       gdb_flush (raw_stdout);
   2375     }
   2376 
   2377   xfree (uiout);
   2378   current_uiout = saved_uiout;
   2379 }
   2380 
   2381 static void
   2382 timestamp (struct mi_timestamp *tv)
   2383 {
   2384   gettimeofday (&tv->wallclock, NULL);
   2385 #ifdef HAVE_GETRUSAGE
   2386   getrusage (RUSAGE_SELF, &rusage);
   2387   tv->utime.tv_sec = rusage.ru_utime.tv_sec;
   2388   tv->utime.tv_usec = rusage.ru_utime.tv_usec;
   2389   tv->stime.tv_sec = rusage.ru_stime.tv_sec;
   2390   tv->stime.tv_usec = rusage.ru_stime.tv_usec;
   2391 #else
   2392   {
   2393     long usec = get_run_time ();
   2394 
   2395     tv->utime.tv_sec = usec/1000000L;
   2396     tv->utime.tv_usec = usec - 1000000L*tv->utime.tv_sec;
   2397     tv->stime.tv_sec = 0;
   2398     tv->stime.tv_usec = 0;
   2399   }
   2400 #endif
   2401 }
   2402 
   2403 static void
   2404 print_diff_now (struct mi_timestamp *start)
   2405 {
   2406   struct mi_timestamp now;
   2407 
   2408   timestamp (&now);
   2409   print_diff (start, &now);
   2410 }
   2411 
   2412 void
   2413 mi_print_timing_maybe (void)
   2414 {
   2415   /* If the command is -enable-timing then do_timings may be true
   2416      whilst current_command_ts is not initialized.  */
   2417   if (do_timings && current_command_ts)
   2418     print_diff_now (current_command_ts);
   2419 }
   2420 
   2421 static long
   2422 timeval_diff (struct timeval start, struct timeval end)
   2423 {
   2424   return ((end.tv_sec - start.tv_sec) * 1000000L)
   2425     + (end.tv_usec - start.tv_usec);
   2426 }
   2427 
   2428 static void
   2429 print_diff (struct mi_timestamp *start, struct mi_timestamp *end)
   2430 {
   2431   fprintf_unfiltered
   2432     (raw_stdout,
   2433      ",time={wallclock=\"%0.5f\",user=\"%0.5f\",system=\"%0.5f\"}",
   2434      timeval_diff (start->wallclock, end->wallclock) / 1000000.0,
   2435      timeval_diff (start->utime, end->utime) / 1000000.0,
   2436      timeval_diff (start->stime, end->stime) / 1000000.0);
   2437 }
   2438 
   2439 void
   2440 mi_cmd_trace_define_variable (char *command, char **argv, int argc)
   2441 {
   2442   struct expression *expr;
   2443   LONGEST initval = 0;
   2444   struct trace_state_variable *tsv;
   2445   char *name = 0;
   2446 
   2447   if (argc != 1 && argc != 2)
   2448     error (_("Usage: -trace-define-variable VARIABLE [VALUE]"));
   2449 
   2450   name = argv[0];
   2451   if (*name++ != '$')
   2452     error (_("Name of trace variable should start with '$'"));
   2453 
   2454   validate_trace_state_variable_name (name);
   2455 
   2456   tsv = find_trace_state_variable (name);
   2457   if (!tsv)
   2458     tsv = create_trace_state_variable (name);
   2459 
   2460   if (argc == 2)
   2461     initval = value_as_long (parse_and_eval (argv[1]));
   2462 
   2463   tsv->initial_value = initval;
   2464 }
   2465 
   2466 void
   2467 mi_cmd_trace_list_variables (char *command, char **argv, int argc)
   2468 {
   2469   if (argc != 0)
   2470     error (_("-trace-list-variables: no arguments allowed"));
   2471 
   2472   tvariables_info_1 ();
   2473 }
   2474 
   2475 void
   2476 mi_cmd_trace_find (char *command, char **argv, int argc)
   2477 {
   2478   char *mode;
   2479 
   2480   if (argc == 0)
   2481     error (_("trace selection mode is required"));
   2482 
   2483   mode = argv[0];
   2484 
   2485   if (strcmp (mode, "none") == 0)
   2486     {
   2487       tfind_1 (tfind_number, -1, 0, 0, 0);
   2488       return;
   2489     }
   2490 
   2491   if (current_trace_status ()->running)
   2492     error (_("May not look at trace frames while trace is running."));
   2493 
   2494   if (strcmp (mode, "frame-number") == 0)
   2495     {
   2496       if (argc != 2)
   2497 	error (_("frame number is required"));
   2498       tfind_1 (tfind_number, atoi (argv[1]), 0, 0, 0);
   2499     }
   2500   else if (strcmp (mode, "tracepoint-number") == 0)
   2501     {
   2502       if (argc != 2)
   2503 	error (_("tracepoint number is required"));
   2504       tfind_1 (tfind_tp, atoi (argv[1]), 0, 0, 0);
   2505     }
   2506   else if (strcmp (mode, "pc") == 0)
   2507     {
   2508       if (argc != 2)
   2509 	error (_("PC is required"));
   2510       tfind_1 (tfind_pc, 0, parse_and_eval_address (argv[1]), 0, 0);
   2511     }
   2512   else if (strcmp (mode, "pc-inside-range") == 0)
   2513     {
   2514       if (argc != 3)
   2515 	error (_("Start and end PC are required"));
   2516       tfind_1 (tfind_range, 0, parse_and_eval_address (argv[1]),
   2517 	       parse_and_eval_address (argv[2]), 0);
   2518     }
   2519   else if (strcmp (mode, "pc-outside-range") == 0)
   2520     {
   2521       if (argc != 3)
   2522 	error (_("Start and end PC are required"));
   2523       tfind_1 (tfind_outside, 0, parse_and_eval_address (argv[1]),
   2524 	       parse_and_eval_address (argv[2]), 0);
   2525     }
   2526   else if (strcmp (mode, "line") == 0)
   2527     {
   2528       struct symtabs_and_lines sals;
   2529       struct symtab_and_line sal;
   2530       static CORE_ADDR start_pc, end_pc;
   2531       struct cleanup *back_to;
   2532 
   2533       if (argc != 2)
   2534 	error (_("Line is required"));
   2535 
   2536       sals = decode_line_with_current_source (argv[1],
   2537 					      DECODE_LINE_FUNFIRSTLINE);
   2538       back_to = make_cleanup (xfree, sals.sals);
   2539 
   2540       sal = sals.sals[0];
   2541 
   2542       if (sal.symtab == 0)
   2543 	error (_("Could not find the specified line"));
   2544 
   2545       if (sal.line > 0 && find_line_pc_range (sal, &start_pc, &end_pc))
   2546 	tfind_1 (tfind_range, 0, start_pc, end_pc - 1, 0);
   2547       else
   2548 	error (_("Could not find the specified line"));
   2549 
   2550       do_cleanups (back_to);
   2551     }
   2552   else
   2553     error (_("Invalid mode '%s'"), mode);
   2554 
   2555   if (has_stack_frames () || get_traceframe_number () >= 0)
   2556     print_stack_frame (get_selected_frame (NULL), 1, LOC_AND_ADDRESS, 1);
   2557 }
   2558 
   2559 void
   2560 mi_cmd_trace_save (char *command, char **argv, int argc)
   2561 {
   2562   int target_saves = 0;
   2563   int generate_ctf = 0;
   2564   char *filename;
   2565   int oind = 0;
   2566   char *oarg;
   2567 
   2568   enum opt
   2569   {
   2570     TARGET_SAVE_OPT, CTF_OPT
   2571   };
   2572   static const struct mi_opt opts[] =
   2573     {
   2574       {"r", TARGET_SAVE_OPT, 0},
   2575       {"ctf", CTF_OPT, 0},
   2576       { 0, 0, 0 }
   2577     };
   2578 
   2579   while (1)
   2580     {
   2581       int opt = mi_getopt ("-trace-save", argc, argv, opts,
   2582 			   &oind, &oarg);
   2583 
   2584       if (opt < 0)
   2585 	break;
   2586       switch ((enum opt) opt)
   2587 	{
   2588 	case TARGET_SAVE_OPT:
   2589 	  target_saves = 1;
   2590 	  break;
   2591 	case CTF_OPT:
   2592 	  generate_ctf = 1;
   2593 	  break;
   2594 	}
   2595     }
   2596   filename = argv[oind];
   2597 
   2598   if (generate_ctf)
   2599     trace_save_ctf (filename, target_saves);
   2600   else
   2601     trace_save_tfile (filename, target_saves);
   2602 }
   2603 
   2604 void
   2605 mi_cmd_trace_start (char *command, char **argv, int argc)
   2606 {
   2607   start_tracing (NULL);
   2608 }
   2609 
   2610 void
   2611 mi_cmd_trace_status (char *command, char **argv, int argc)
   2612 {
   2613   trace_status_mi (0);
   2614 }
   2615 
   2616 void
   2617 mi_cmd_trace_stop (char *command, char **argv, int argc)
   2618 {
   2619   stop_tracing (NULL);
   2620   trace_status_mi (1);
   2621 }
   2622 
   2623 /* Implement the "-ada-task-info" command.  */
   2624 
   2625 void
   2626 mi_cmd_ada_task_info (char *command, char **argv, int argc)
   2627 {
   2628   if (argc != 0 && argc != 1)
   2629     error (_("Invalid MI command"));
   2630 
   2631   print_ada_task_info (current_uiout, argv[0], current_inferior ());
   2632 }
   2633 
   2634 /* Print EXPRESSION according to VALUES.  */
   2635 
   2636 static void
   2637 print_variable_or_computed (char *expression, enum print_values values)
   2638 {
   2639   struct expression *expr;
   2640   struct cleanup *old_chain;
   2641   struct value *val;
   2642   struct ui_file *stb;
   2643   struct value_print_options opts;
   2644   struct type *type;
   2645   struct ui_out *uiout = current_uiout;
   2646 
   2647   stb = mem_fileopen ();
   2648   old_chain = make_cleanup_ui_file_delete (stb);
   2649 
   2650   expr = parse_expression (expression);
   2651 
   2652   make_cleanup (free_current_contents, &expr);
   2653 
   2654   if (values == PRINT_SIMPLE_VALUES)
   2655     val = evaluate_type (expr);
   2656   else
   2657     val = evaluate_expression (expr);
   2658 
   2659   if (values != PRINT_NO_VALUES)
   2660     make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
   2661   ui_out_field_string (uiout, "name", expression);
   2662 
   2663   switch (values)
   2664     {
   2665     case PRINT_SIMPLE_VALUES:
   2666       type = check_typedef (value_type (val));
   2667       type_print (value_type (val), "", stb, -1);
   2668       ui_out_field_stream (uiout, "type", stb);
   2669       if (TYPE_CODE (type) != TYPE_CODE_ARRAY
   2670 	  && TYPE_CODE (type) != TYPE_CODE_STRUCT
   2671 	  && TYPE_CODE (type) != TYPE_CODE_UNION)
   2672 	{
   2673 	  struct value_print_options opts;
   2674 
   2675 	  get_no_prettyformat_print_options (&opts);
   2676 	  opts.deref_ref = 1;
   2677 	  common_val_print (val, stb, 0, &opts, current_language);
   2678 	  ui_out_field_stream (uiout, "value", stb);
   2679 	}
   2680       break;
   2681     case PRINT_ALL_VALUES:
   2682       {
   2683 	struct value_print_options opts;
   2684 
   2685 	get_no_prettyformat_print_options (&opts);
   2686 	opts.deref_ref = 1;
   2687 	common_val_print (val, stb, 0, &opts, current_language);
   2688 	ui_out_field_stream (uiout, "value", stb);
   2689       }
   2690       break;
   2691     }
   2692 
   2693   do_cleanups (old_chain);
   2694 }
   2695 
   2696 /* Implement the "-trace-frame-collected" command.  */
   2697 
   2698 void
   2699 mi_cmd_trace_frame_collected (char *command, char **argv, int argc)
   2700 {
   2701   struct cleanup *old_chain;
   2702   struct bp_location *tloc;
   2703   int stepping_frame;
   2704   struct collection_list *clist;
   2705   struct collection_list tracepoint_list, stepping_list;
   2706   struct traceframe_info *tinfo;
   2707   int oind = 0;
   2708   int var_print_values = PRINT_ALL_VALUES;
   2709   int comp_print_values = PRINT_ALL_VALUES;
   2710   int registers_format = 'x';
   2711   int memory_contents = 0;
   2712   struct ui_out *uiout = current_uiout;
   2713   enum opt
   2714   {
   2715     VAR_PRINT_VALUES,
   2716     COMP_PRINT_VALUES,
   2717     REGISTERS_FORMAT,
   2718     MEMORY_CONTENTS,
   2719   };
   2720   static const struct mi_opt opts[] =
   2721     {
   2722       {"-var-print-values", VAR_PRINT_VALUES, 1},
   2723       {"-comp-print-values", COMP_PRINT_VALUES, 1},
   2724       {"-registers-format", REGISTERS_FORMAT, 1},
   2725       {"-memory-contents", MEMORY_CONTENTS, 0},
   2726       { 0, 0, 0 }
   2727     };
   2728 
   2729   while (1)
   2730     {
   2731       char *oarg;
   2732       int opt = mi_getopt ("-trace-frame-collected", argc, argv, opts,
   2733 			   &oind, &oarg);
   2734       if (opt < 0)
   2735 	break;
   2736       switch ((enum opt) opt)
   2737 	{
   2738 	case VAR_PRINT_VALUES:
   2739 	  var_print_values = mi_parse_print_values (oarg);
   2740 	  break;
   2741 	case COMP_PRINT_VALUES:
   2742 	  comp_print_values = mi_parse_print_values (oarg);
   2743 	  break;
   2744 	case REGISTERS_FORMAT:
   2745 	  registers_format = oarg[0];
   2746 	case MEMORY_CONTENTS:
   2747 	  memory_contents = 1;
   2748 	  break;
   2749 	}
   2750     }
   2751 
   2752   if (oind != argc)
   2753     error (_("Usage: -trace-frame-collected "
   2754 	     "[--var-print-values PRINT_VALUES] "
   2755 	     "[--comp-print-values PRINT_VALUES] "
   2756 	     "[--registers-format FORMAT]"
   2757 	     "[--memory-contents]"));
   2758 
   2759   /* This throws an error is not inspecting a trace frame.  */
   2760   tloc = get_traceframe_location (&stepping_frame);
   2761 
   2762   /* This command only makes sense for the current frame, not the
   2763      selected frame.  */
   2764   old_chain = make_cleanup_restore_current_thread ();
   2765   select_frame (get_current_frame ());
   2766 
   2767   encode_actions_and_make_cleanup (tloc, &tracepoint_list,
   2768 				   &stepping_list);
   2769 
   2770   if (stepping_frame)
   2771     clist = &stepping_list;
   2772   else
   2773     clist = &tracepoint_list;
   2774 
   2775   tinfo = get_traceframe_info ();
   2776 
   2777   /* Explicitly wholly collected variables.  */
   2778   {
   2779     struct cleanup *list_cleanup;
   2780     char *p;
   2781     int i;
   2782 
   2783     list_cleanup = make_cleanup_ui_out_list_begin_end (uiout,
   2784 						       "explicit-variables");
   2785     for (i = 0; VEC_iterate (char_ptr, clist->wholly_collected, i, p); i++)
   2786       print_variable_or_computed (p, var_print_values);
   2787     do_cleanups (list_cleanup);
   2788   }
   2789 
   2790   /* Computed expressions.  */
   2791   {
   2792     struct cleanup *list_cleanup;
   2793     char *p;
   2794     int i;
   2795 
   2796     list_cleanup
   2797       = make_cleanup_ui_out_list_begin_end (uiout,
   2798 					    "computed-expressions");
   2799     for (i = 0; VEC_iterate (char_ptr, clist->computed, i, p); i++)
   2800       print_variable_or_computed (p, comp_print_values);
   2801     do_cleanups (list_cleanup);
   2802   }
   2803 
   2804   /* Registers.  Given pseudo-registers, and that some architectures
   2805      (like MIPS) actually hide the raw registers, we don't go through
   2806      the trace frame info, but instead consult the register cache for
   2807      register availability.  */
   2808   {
   2809     struct cleanup *list_cleanup;
   2810     struct frame_info *frame;
   2811     struct gdbarch *gdbarch;
   2812     int regnum;
   2813     int numregs;
   2814 
   2815     list_cleanup = make_cleanup_ui_out_list_begin_end (uiout, "registers");
   2816 
   2817     frame = get_selected_frame (NULL);
   2818     gdbarch = get_frame_arch (frame);
   2819     numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
   2820 
   2821     for (regnum = 0; regnum < numregs; regnum++)
   2822       {
   2823 	if (gdbarch_register_name (gdbarch, regnum) == NULL
   2824 	    || *(gdbarch_register_name (gdbarch, regnum)) == '\0')
   2825 	  continue;
   2826 
   2827 	output_register (frame, regnum, registers_format, 1);
   2828       }
   2829 
   2830     do_cleanups (list_cleanup);
   2831   }
   2832 
   2833   /* Trace state variables.  */
   2834   {
   2835     struct cleanup *list_cleanup;
   2836     int tvar;
   2837     char *tsvname;
   2838     int i;
   2839 
   2840     list_cleanup = make_cleanup_ui_out_list_begin_end (uiout, "tvars");
   2841 
   2842     tsvname = NULL;
   2843     make_cleanup (free_current_contents, &tsvname);
   2844 
   2845     for (i = 0; VEC_iterate (int, tinfo->tvars, i, tvar); i++)
   2846       {
   2847 	struct cleanup *cleanup_child;
   2848 	struct trace_state_variable *tsv;
   2849 
   2850 	tsv = find_trace_state_variable_by_number (tvar);
   2851 
   2852 	cleanup_child = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
   2853 
   2854 	if (tsv != NULL)
   2855 	  {
   2856 	    tsvname = xrealloc (tsvname, strlen (tsv->name) + 2);
   2857 	    tsvname[0] = '$';
   2858 	    strcpy (tsvname + 1, tsv->name);
   2859 	    ui_out_field_string (uiout, "name", tsvname);
   2860 
   2861 	    tsv->value_known = target_get_trace_state_variable_value (tsv->number,
   2862 								      &tsv->value);
   2863 	    ui_out_field_int (uiout, "current", tsv->value);
   2864 	  }
   2865 	else
   2866 	  {
   2867 	    ui_out_field_skip (uiout, "name");
   2868 	    ui_out_field_skip (uiout, "current");
   2869 	  }
   2870 
   2871 	do_cleanups (cleanup_child);
   2872       }
   2873 
   2874     do_cleanups (list_cleanup);
   2875   }
   2876 
   2877   /* Memory.  */
   2878   {
   2879     struct cleanup *list_cleanup;
   2880     VEC(mem_range_s) *available_memory = NULL;
   2881     struct mem_range *r;
   2882     int i;
   2883 
   2884     traceframe_available_memory (&available_memory, 0, ULONGEST_MAX);
   2885     make_cleanup (VEC_cleanup(mem_range_s), &available_memory);
   2886 
   2887     list_cleanup = make_cleanup_ui_out_list_begin_end (uiout, "memory");
   2888 
   2889     for (i = 0; VEC_iterate (mem_range_s, available_memory, i, r); i++)
   2890       {
   2891 	struct cleanup *cleanup_child;
   2892 	gdb_byte *data;
   2893 	struct gdbarch *gdbarch = target_gdbarch ();
   2894 
   2895 	cleanup_child = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
   2896 
   2897 	ui_out_field_core_addr (uiout, "address", gdbarch, r->start);
   2898 	ui_out_field_int (uiout, "length", r->length);
   2899 
   2900 	data = xmalloc (r->length);
   2901 	make_cleanup (xfree, data);
   2902 
   2903 	if (memory_contents)
   2904 	  {
   2905 	    if (target_read_memory (r->start, data, r->length) == 0)
   2906 	      {
   2907 		int m;
   2908 		char *data_str, *p;
   2909 
   2910 		data_str = xmalloc (r->length * 2 + 1);
   2911 		make_cleanup (xfree, data_str);
   2912 
   2913 		for (m = 0, p = data_str; m < r->length; ++m, p += 2)
   2914 		  sprintf (p, "%02x", data[m]);
   2915 		ui_out_field_string (uiout, "contents", data_str);
   2916 	      }
   2917 	    else
   2918 	      ui_out_field_skip (uiout, "contents");
   2919 	  }
   2920 	do_cleanups (cleanup_child);
   2921       }
   2922 
   2923     do_cleanups (list_cleanup);
   2924   }
   2925 
   2926   do_cleanups (old_chain);
   2927 }
   2928