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