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