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