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