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