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