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