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