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