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