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