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