daily update
[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;
b9635925 684 struct cleanup *cleanup;
102040f0 685
dc146f7c 686 /* This keeps a map from integer (pid) to VEC (struct osdata_item *)*
8eee9c5a
DE
687 The vector contains information about all threads for the given pid.
688 This is assigned an initial value to avoid "may be used uninitialized"
689 warning from gcc. */
690 splay_tree tree = NULL;
dc146f7c
VP
691
692 /* get_osdata will throw if it cannot return data. */
693 data = get_osdata ("processes");
b9635925 694 cleanup = make_cleanup_osdata_free (data);
dc146f7c
VP
695
696 if (recurse)
697 {
698 struct osdata *threads = get_osdata ("threads");
dc146f7c 699
102040f0 700 make_cleanup_osdata_free (threads);
dc146f7c
VP
701 tree = splay_tree_new (splay_tree_int_comparator,
702 do_nothing,
703 free_vector_of_osdata_items);
704 make_cleanup (free_splay_tree, tree);
e0665bc8 705
07e059b5 706 for (ix_items = 0;
dc146f7c 707 VEC_iterate (osdata_item_s, threads->items,
e0665bc8 708 ix_items, item);
07e059b5
VP
709 ix_items++)
710 {
07e059b5 711 const char *pid = get_osdata_column (item, "pid");
dc146f7c
VP
712 int pid_i = strtoul (pid, NULL, 0);
713 VEC (osdata_item_s) *vec = 0;
714
715 splay_tree_node n = splay_tree_lookup (tree, pid_i);
716 if (!n)
717 {
718 VEC_safe_push (osdata_item_s, vec, item);
719 splay_tree_insert (tree, pid_i, (splay_tree_value)vec);
720 }
721 else
722 {
723 vec = (VEC (osdata_item_s) *) n->value;
724 VEC_safe_push (osdata_item_s, vec, item);
725 n->value = (splay_tree_value) vec;
726 }
727 }
728 }
729
730 make_cleanup_ui_out_list_begin_end (uiout, "groups");
07e059b5 731
dc146f7c
VP
732 for (ix_items = 0;
733 VEC_iterate (osdata_item_s, data->items,
734 ix_items, item);
735 ix_items++)
736 {
737 struct cleanup *back_to;
e0665bc8 738
dc146f7c
VP
739 const char *pid = get_osdata_column (item, "pid");
740 const char *cmd = get_osdata_column (item, "command");
741 const char *user = get_osdata_column (item, "user");
742 const char *cores = get_osdata_column (item, "cores");
743
744 int pid_i = strtoul (pid, NULL, 0);
745
746 /* At present, the target will return all available processes
747 and if information about specific ones was required, we filter
748 undesired processes here. */
749 if (ids && bsearch (&pid_i, VEC_address (int, ids),
750 VEC_length (int, ids),
751 sizeof (int), compare_positive_ints) == NULL)
752 continue;
753
754
755 back_to = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
756
757 ui_out_field_fmt (uiout, "id", "%s", pid);
758 ui_out_field_string (uiout, "type", "process");
759 if (cmd)
760 ui_out_field_string (uiout, "description", cmd);
761 if (user)
762 ui_out_field_string (uiout, "user", user);
763 if (cores)
764 output_cores (uiout, "cores", cores);
765
766 if (recurse)
767 {
768 splay_tree_node n = splay_tree_lookup (tree, pid_i);
769 if (n)
770 {
771 VEC (osdata_item_s) *children = (VEC (osdata_item_s) *) n->value;
772 struct osdata_item *child;
773 int ix_child;
774
775 make_cleanup_ui_out_list_begin_end (uiout, "threads");
776
777 for (ix_child = 0;
778 VEC_iterate (osdata_item_s, children, ix_child, child);
779 ++ix_child)
780 {
781 struct cleanup *back_to_2 =
782 make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
dc146f7c
VP
783 const char *tid = get_osdata_column (child, "tid");
784 const char *tcore = get_osdata_column (child, "core");
102040f0 785
dc146f7c
VP
786 ui_out_field_string (uiout, "id", tid);
787 if (tcore)
788 ui_out_field_string (uiout, "core", tcore);
789
790 do_cleanups (back_to_2);
791 }
792 }
07e059b5 793 }
dc146f7c
VP
794
795 do_cleanups (back_to);
07e059b5 796 }
b9635925
TT
797
798 do_cleanups (cleanup);
dc146f7c
VP
799}
800
801void
802mi_cmd_list_thread_groups (char *command, char **argv, int argc)
803{
79a45e25 804 struct ui_out *uiout = current_uiout;
dc146f7c
VP
805 struct cleanup *back_to;
806 int available = 0;
807 int recurse = 0;
808 VEC (int) *ids = 0;
809
810 enum opt
dc146f7c 811 {
2b03b41d 812 AVAILABLE_OPT, RECURSE_OPT
dc146f7c 813 };
2b03b41d
SS
814 static const struct mi_opt opts[] =
815 {
816 {"-available", AVAILABLE_OPT, 0},
817 {"-recurse", RECURSE_OPT, 1},
818 { 0, 0, 0 }
819 };
dc146f7c 820
56934ab1
AS
821 int oind = 0;
822 char *oarg;
dc146f7c
VP
823
824 while (1)
825 {
826 int opt = mi_getopt ("-list-thread-groups", argc, argv, opts,
56934ab1 827 &oind, &oarg);
102040f0 828
dc146f7c
VP
829 if (opt < 0)
830 break;
831 switch ((enum opt) opt)
832 {
833 case AVAILABLE_OPT:
834 available = 1;
835 break;
836 case RECURSE_OPT:
56934ab1 837 if (strcmp (oarg, "0") == 0)
dc146f7c 838 ;
56934ab1 839 else if (strcmp (oarg, "1") == 0)
dc146f7c
VP
840 recurse = 1;
841 else
7ea6d463
PM
842 error (_("only '0' and '1' are valid values "
843 "for the '--recurse' option"));
dc146f7c
VP
844 break;
845 }
846 }
847
56934ab1 848 for (; oind < argc; ++oind)
dc146f7c
VP
849 {
850 char *end;
2f296114
VP
851 int inf;
852
56934ab1
AS
853 if (*(argv[oind]) != 'i')
854 error (_("invalid syntax of group id '%s'"), argv[oind]);
2f296114 855
56934ab1 856 inf = strtoul (argv[oind] + 1, &end, 0);
102040f0 857
dc146f7c 858 if (*end != '\0')
56934ab1 859 error (_("invalid syntax of group id '%s'"), argv[oind]);
dc146f7c
VP
860 VEC_safe_push (int, ids, inf);
861 }
862 if (VEC_length (int, ids) > 1)
863 qsort (VEC_address (int, ids),
864 VEC_length (int, ids),
865 sizeof (int), compare_positive_ints);
866
867 back_to = make_cleanup (free_vector_of_ints, &ids);
868
869 if (available)
870 {
871 list_available_thread_groups (ids, recurse);
872 }
873 else if (VEC_length (int, ids) == 1)
3ee1c036 874 {
2b03b41d 875 /* Local thread groups, single id. */
2f296114
VP
876 int id = *VEC_address (int, ids);
877 struct inferior *inf = find_inferior_id (id);
102040f0 878
2f296114 879 if (!inf)
7ea6d463 880 error (_("Non-existent thread group id '%d'"), id);
2f296114 881
aea5b279 882 print_thread_info (uiout, NULL, inf->pid);
3ee1c036
VP
883 }
884 else
885 {
dc146f7c 886 struct print_one_inferior_data data;
102040f0 887
dc146f7c
VP
888 data.recurse = recurse;
889 data.inferiors = ids;
890
891 /* Local thread groups. Either no explicit ids -- and we
892 print everything, or several explicit ids. In both cases,
893 we print more than one group, and have to use 'groups'
894 as the top-level element. */
3ee1c036 895 make_cleanup_ui_out_list_begin_end (uiout, "groups");
dc146f7c
VP
896 update_thread_list ();
897 iterate_over_inferiors (print_one_inferior, &data);
3ee1c036 898 }
dc146f7c 899
3ee1c036 900 do_cleanups (back_to);
8e8901c5
VP
901}
902
ce8f13f8 903void
fb40c209
AC
904mi_cmd_data_list_register_names (char *command, char **argv, int argc)
905{
7ccb0be9 906 struct gdbarch *gdbarch;
79a45e25 907 struct ui_out *uiout = current_uiout;
fb40c209
AC
908 int regnum, numregs;
909 int i;
4060713b 910 struct cleanup *cleanup;
fb40c209
AC
911
912 /* Note that the test for a valid register must include checking the
2b03b41d
SS
913 gdbarch_register_name because gdbarch_num_regs may be allocated
914 for the union of the register sets within a family of related
915 processors. In this case, some entries of gdbarch_register_name
916 will change depending upon the particular processor being
917 debugged. */
fb40c209 918
441b986a 919 gdbarch = get_current_arch ();
7ccb0be9 920 numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
fb40c209 921
4060713b 922 cleanup = make_cleanup_ui_out_list_begin_end (uiout, "register-names");
fb40c209 923
41296c92 924 if (argc == 0) /* No args, just do all the regs. */
fb40c209
AC
925 {
926 for (regnum = 0;
927 regnum < numregs;
928 regnum++)
929 {
7ccb0be9
UW
930 if (gdbarch_register_name (gdbarch, regnum) == NULL
931 || *(gdbarch_register_name (gdbarch, regnum)) == '\0')
173d6894
AC
932 ui_out_field_string (uiout, NULL, "");
933 else
c9f4d572 934 ui_out_field_string (uiout, NULL,
7ccb0be9 935 gdbarch_register_name (gdbarch, regnum));
fb40c209
AC
936 }
937 }
938
41296c92 939 /* Else, list of register #s, just do listed regs. */
fb40c209
AC
940 for (i = 0; i < argc; i++)
941 {
942 regnum = atoi (argv[i]);
173d6894 943 if (regnum < 0 || regnum >= numregs)
7ea6d463 944 error (_("bad register number"));
a13e061a 945
7ccb0be9
UW
946 if (gdbarch_register_name (gdbarch, regnum) == NULL
947 || *(gdbarch_register_name (gdbarch, regnum)) == '\0')
173d6894
AC
948 ui_out_field_string (uiout, NULL, "");
949 else
c9f4d572 950 ui_out_field_string (uiout, NULL,
7ccb0be9 951 gdbarch_register_name (gdbarch, regnum));
fb40c209 952 }
4060713b 953 do_cleanups (cleanup);
fb40c209
AC
954}
955
ce8f13f8 956void
fb40c209
AC
957mi_cmd_data_list_changed_registers (char *command, char **argv, int argc)
958{
6ed7ea50 959 static struct regcache *this_regs = NULL;
79a45e25 960 struct ui_out *uiout = current_uiout;
6ed7ea50 961 struct regcache *prev_regs;
7ccb0be9 962 struct gdbarch *gdbarch;
fb40c209
AC
963 int regnum, numregs, changed;
964 int i;
4060713b 965 struct cleanup *cleanup;
fb40c209 966
2b03b41d
SS
967 /* The last time we visited this function, the current frame's
968 register contents were saved in THIS_REGS. Move THIS_REGS over
969 to PREV_REGS, and refresh THIS_REGS with the now-current register
970 contents. */
6ed7ea50
UW
971
972 prev_regs = this_regs;
973 this_regs = frame_save_as_regcache (get_selected_frame (NULL));
974 cleanup = make_cleanup_regcache_xfree (prev_regs);
975
fb40c209 976 /* Note that the test for a valid register must include checking the
2b03b41d
SS
977 gdbarch_register_name because gdbarch_num_regs may be allocated
978 for the union of the register sets within a family of related
979 processors. In this case, some entries of gdbarch_register_name
980 will change depending upon the particular processor being
981 debugged. */
fb40c209 982
7ccb0be9
UW
983 gdbarch = get_regcache_arch (this_regs);
984 numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
fb40c209 985
6ed7ea50 986 make_cleanup_ui_out_list_begin_end (uiout, "changed-registers");
fb40c209 987
2b03b41d 988 if (argc == 0)
fb40c209 989 {
2b03b41d 990 /* No args, just do all the regs. */
fb40c209
AC
991 for (regnum = 0;
992 regnum < numregs;
993 regnum++)
994 {
7ccb0be9
UW
995 if (gdbarch_register_name (gdbarch, regnum) == NULL
996 || *(gdbarch_register_name (gdbarch, regnum)) == '\0')
fb40c209 997 continue;
6ed7ea50 998 changed = register_changed_p (regnum, prev_regs, this_regs);
fb40c209 999 if (changed < 0)
7ea6d463
PM
1000 error (_("-data-list-changed-registers: "
1001 "Unable to read register contents."));
fb40c209
AC
1002 else if (changed)
1003 ui_out_field_int (uiout, NULL, regnum);
1004 }
1005 }
1006
41296c92 1007 /* Else, list of register #s, just do listed regs. */
fb40c209
AC
1008 for (i = 0; i < argc; i++)
1009 {
1010 regnum = atoi (argv[i]);
1011
1012 if (regnum >= 0
1013 && regnum < numregs
7ccb0be9
UW
1014 && gdbarch_register_name (gdbarch, regnum) != NULL
1015 && *gdbarch_register_name (gdbarch, regnum) != '\000')
fb40c209 1016 {
6ed7ea50 1017 changed = register_changed_p (regnum, prev_regs, this_regs);
fb40c209 1018 if (changed < 0)
7ea6d463
PM
1019 error (_("-data-list-changed-registers: "
1020 "Unable to read register contents."));
fb40c209
AC
1021 else if (changed)
1022 ui_out_field_int (uiout, NULL, regnum);
1023 }
1024 else
7ea6d463 1025 error (_("bad register number"));
fb40c209 1026 }
4060713b 1027 do_cleanups (cleanup);
fb40c209
AC
1028}
1029
1030static int
6ed7ea50
UW
1031register_changed_p (int regnum, struct regcache *prev_regs,
1032 struct regcache *this_regs)
fb40c209 1033{
6ed7ea50
UW
1034 struct gdbarch *gdbarch = get_regcache_arch (this_regs);
1035 gdb_byte prev_buffer[MAX_REGISTER_SIZE];
1036 gdb_byte this_buffer[MAX_REGISTER_SIZE];
e69aa73e
PA
1037 enum register_status prev_status;
1038 enum register_status this_status;
fb40c209 1039
e69aa73e
PA
1040 /* First time through or after gdbarch change consider all registers
1041 as changed. */
1042 if (!prev_regs || get_regcache_arch (prev_regs) != gdbarch)
6ed7ea50 1043 return 1;
fb40c209 1044
6ed7ea50 1045 /* Get register contents and compare. */
e69aa73e
PA
1046 prev_status = regcache_cooked_read (prev_regs, regnum, prev_buffer);
1047 this_status = regcache_cooked_read (this_regs, regnum, this_buffer);
fb40c209 1048
e69aa73e
PA
1049 if (this_status != prev_status)
1050 return 1;
1051 else if (this_status == REG_VALID)
1052 return memcmp (prev_buffer, this_buffer,
1053 register_size (gdbarch, regnum)) != 0;
1054 else
1055 return 0;
fb40c209
AC
1056}
1057
41296c92 1058/* Return a list of register number and value pairs. The valid
fb40c209 1059 arguments expected are: a letter indicating the format in which to
2b03b41d
SS
1060 display the registers contents. This can be one of: x
1061 (hexadecimal), d (decimal), N (natural), t (binary), o (octal), r
1062 (raw). After the format argument there can be a sequence of
1063 numbers, indicating which registers to fetch the content of. If
1064 the format is the only argument, a list of all the registers with
1065 their values is returned. */
1066
ce8f13f8 1067void
fb40c209
AC
1068mi_cmd_data_list_register_values (char *command, char **argv, int argc)
1069{
79a45e25 1070 struct ui_out *uiout = current_uiout;
7ccb0be9
UW
1071 struct frame_info *frame;
1072 struct gdbarch *gdbarch;
a13e061a 1073 int regnum, numregs, format;
fb40c209 1074 int i;
4060713b 1075 struct cleanup *list_cleanup, *tuple_cleanup;
fb40c209
AC
1076
1077 /* Note that the test for a valid register must include checking the
2b03b41d
SS
1078 gdbarch_register_name because gdbarch_num_regs may be allocated
1079 for the union of the register sets within a family of related
1080 processors. In this case, some entries of gdbarch_register_name
1081 will change depending upon the particular processor being
1082 debugged. */
fb40c209 1083
fb40c209 1084 if (argc == 0)
7ea6d463
PM
1085 error (_("-data-list-register-values: Usage: "
1086 "-data-list-register-values <format> [<regnum1>...<regnumN>]"));
fb40c209
AC
1087
1088 format = (int) argv[0][0];
1089
7ccb0be9
UW
1090 frame = get_selected_frame (NULL);
1091 gdbarch = get_frame_arch (frame);
1092 numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
1093
4060713b 1094 list_cleanup = make_cleanup_ui_out_list_begin_end (uiout, "register-values");
fb40c209 1095
2b03b41d 1096 if (argc == 1)
fb40c209 1097 {
2b03b41d 1098 /* No args, beside the format: do all the regs. */
fb40c209
AC
1099 for (regnum = 0;
1100 regnum < numregs;
1101 regnum++)
1102 {
7ccb0be9
UW
1103 if (gdbarch_register_name (gdbarch, regnum) == NULL
1104 || *(gdbarch_register_name (gdbarch, regnum)) == '\0')
fb40c209 1105 continue;
4060713b 1106 tuple_cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
fb40c209 1107 ui_out_field_int (uiout, "number", regnum);
7ccb0be9 1108 get_register (frame, regnum, format);
4060713b 1109 do_cleanups (tuple_cleanup);
fb40c209
AC
1110 }
1111 }
1112
41296c92 1113 /* Else, list of register #s, just do listed regs. */
fb40c209
AC
1114 for (i = 1; i < argc; i++)
1115 {
1116 regnum = atoi (argv[i]);
1117
1118 if (regnum >= 0
1119 && regnum < numregs
7ccb0be9
UW
1120 && gdbarch_register_name (gdbarch, regnum) != NULL
1121 && *gdbarch_register_name (gdbarch, regnum) != '\000')
fb40c209 1122 {
4060713b 1123 tuple_cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
fb40c209 1124 ui_out_field_int (uiout, "number", regnum);
7ccb0be9 1125 get_register (frame, regnum, format);
4060713b 1126 do_cleanups (tuple_cleanup);
fb40c209
AC
1127 }
1128 else
7ea6d463 1129 error (_("bad register number"));
fb40c209 1130 }
4060713b 1131 do_cleanups (list_cleanup);
fb40c209
AC
1132}
1133
41296c92 1134/* Output one register's contents in the desired format. */
2b03b41d 1135
a13e061a 1136static void
7ccb0be9 1137get_register (struct frame_info *frame, int regnum, int format)
fb40c209 1138{
7ccb0be9 1139 struct gdbarch *gdbarch = get_frame_arch (frame);
79a45e25 1140 struct ui_out *uiout = current_uiout;
20622269 1141 struct value *val;
fb40c209 1142
fb40c209
AC
1143 if (format == 'N')
1144 format = 0;
1145
20622269 1146 val = get_frame_register_value (frame, regnum);
ac2adee5 1147
20622269 1148 if (value_optimized_out (val))
7ea6d463 1149 error (_("Optimized out"));
fb40c209 1150
fb40c209
AC
1151 if (format == 'r')
1152 {
1153 int j;
1154 char *ptr, buf[1024];
20622269 1155 const gdb_byte *valaddr = value_contents_for_printing (val);
fb40c209
AC
1156
1157 strcpy (buf, "0x");
1158 ptr = buf + 2;
7ccb0be9 1159 for (j = 0; j < register_size (gdbarch, regnum); j++)
fb40c209 1160 {
7ccb0be9
UW
1161 int idx = gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG ?
1162 j : register_size (gdbarch, regnum) - 1 - j;
102040f0 1163
20622269 1164 sprintf (ptr, "%02x", (unsigned char) valaddr[idx]);
fb40c209
AC
1165 ptr += 2;
1166 }
1167 ui_out_field_string (uiout, "value", buf);
fb40c209
AC
1168 }
1169 else
1170 {
79a45b7d 1171 struct value_print_options opts;
f99d8bf4
PA
1172 struct ui_file *stb;
1173 struct cleanup *old_chain;
1174
1175 stb = mem_fileopen ();
1176 old_chain = make_cleanup_ui_file_delete (stb);
102040f0 1177
59669435 1178 get_formatted_print_options (&opts, format);
79a45b7d 1179 opts.deref_ref = 1;
20622269
PA
1180 val_print (value_type (val),
1181 value_contents_for_printing (val),
1182 value_embedded_offset (val), 0,
f99d8bf4 1183 stb, 0, val, &opts, current_language);
fb40c209 1184 ui_out_field_stream (uiout, "value", stb);
f99d8bf4 1185 do_cleanups (old_chain);
fb40c209 1186 }
fb40c209
AC
1187}
1188
24e8cecf 1189/* Write given values into registers. The registers and values are
41296c92 1190 given as pairs. The corresponding MI command is
9a2b4c1b
MS
1191 -data-write-register-values <format>
1192 [<regnum1> <value1>...<regnumN> <valueN>] */
ce8f13f8 1193void
24e8cecf
EZ
1194mi_cmd_data_write_register_values (char *command, char **argv, int argc)
1195{
7ccb0be9
UW
1196 struct regcache *regcache;
1197 struct gdbarch *gdbarch;
9f3a1602 1198 int numregs, i;
24e8cecf
EZ
1199
1200 /* Note that the test for a valid register must include checking the
2b03b41d
SS
1201 gdbarch_register_name because gdbarch_num_regs may be allocated
1202 for the union of the register sets within a family of related
1203 processors. In this case, some entries of gdbarch_register_name
1204 will change depending upon the particular processor being
1205 debugged. */
24e8cecf 1206
7ccb0be9
UW
1207 regcache = get_current_regcache ();
1208 gdbarch = get_regcache_arch (regcache);
1209 numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
24e8cecf
EZ
1210
1211 if (argc == 0)
7ea6d463
PM
1212 error (_("-data-write-register-values: Usage: -data-write-register-"
1213 "values <format> [<regnum1> <value1>...<regnumN> <valueN>]"));
24e8cecf 1214
24e8cecf 1215 if (!target_has_registers)
7ea6d463 1216 error (_("-data-write-register-values: No registers."));
24e8cecf
EZ
1217
1218 if (!(argc - 1))
7ea6d463 1219 error (_("-data-write-register-values: No regs and values specified."));
24e8cecf
EZ
1220
1221 if ((argc - 1) % 2)
7ea6d463
PM
1222 error (_("-data-write-register-values: "
1223 "Regs and vals are not in pairs."));
24e8cecf
EZ
1224
1225 for (i = 1; i < argc; i = i + 2)
1226 {
9f3a1602 1227 int regnum = atoi (argv[i]);
24e8cecf 1228
9f3a1602 1229 if (regnum >= 0 && regnum < numregs
7ccb0be9
UW
1230 && gdbarch_register_name (gdbarch, regnum)
1231 && *gdbarch_register_name (gdbarch, regnum))
24e8cecf 1232 {
9f3a1602 1233 LONGEST value;
d8bf3afa 1234
9f3a1602 1235 /* Get the value as a number. */
24e8cecf 1236 value = parse_and_eval_address (argv[i + 1]);
9f3a1602 1237
41296c92 1238 /* Write it down. */
7ccb0be9 1239 regcache_cooked_write_signed (regcache, regnum, value);
24e8cecf
EZ
1240 }
1241 else
7ea6d463 1242 error (_("bad register number"));
24e8cecf 1243 }
24e8cecf
EZ
1244}
1245
41296c92 1246/* Evaluate the value of the argument. The argument is an
fb40c209 1247 expression. If the expression contains spaces it needs to be
41296c92 1248 included in double quotes. */
2b03b41d 1249
ce8f13f8 1250void
fb40c209
AC
1251mi_cmd_data_evaluate_expression (char *command, char **argv, int argc)
1252{
1253 struct expression *expr;
f99d8bf4 1254 struct cleanup *old_chain;
96052a95 1255 struct value *val;
f99d8bf4 1256 struct ui_file *stb;
79a45b7d 1257 struct value_print_options opts;
79a45e25 1258 struct ui_out *uiout = current_uiout;
fb40c209 1259
f99d8bf4
PA
1260 stb = mem_fileopen ();
1261 old_chain = make_cleanup_ui_file_delete (stb);
fb40c209
AC
1262
1263 if (argc != 1)
f99d8bf4
PA
1264 error (_("-data-evaluate-expression: "
1265 "Usage: -data-evaluate-expression expression"));
fb40c209
AC
1266
1267 expr = parse_expression (argv[0]);
1268
f99d8bf4 1269 make_cleanup (free_current_contents, &expr);
fb40c209
AC
1270
1271 val = evaluate_expression (expr);
1272
41296c92 1273 /* Print the result of the expression evaluation. */
79a45b7d
TT
1274 get_user_print_options (&opts);
1275 opts.deref_ref = 0;
f99d8bf4 1276 common_val_print (val, stb, 0, &opts, current_language);
fb40c209
AC
1277
1278 ui_out_field_stream (uiout, "value", stb);
fb40c209
AC
1279
1280 do_cleanups (old_chain);
fb40c209
AC
1281}
1282
2b03b41d 1283/* This is the -data-read-memory command.
fb40c209
AC
1284
1285 ADDR: start address of data to be dumped.
41296c92 1286 WORD-FORMAT: a char indicating format for the ``word''. See
fb40c209 1287 the ``x'' command.
41296c92 1288 WORD-SIZE: size of each ``word''; 1,2,4, or 8 bytes.
fb40c209
AC
1289 NR_ROW: Number of rows.
1290 NR_COL: The number of colums (words per row).
1291 ASCHAR: (OPTIONAL) Append an ascii character dump to each row. Use
1292 ASCHAR for unprintable characters.
1293
1294 Reads SIZE*NR_ROW*NR_COL bytes starting at ADDR from memory and
1295 displayes them. Returns:
1296
1297 {addr="...",rowN={wordN="..." ,... [,ascii="..."]}, ...}
1298
1299 Returns:
2b03b41d 1300 The number of bytes read is SIZE*ROW*COL. */
fb40c209 1301
ce8f13f8 1302void
fb40c209
AC
1303mi_cmd_data_read_memory (char *command, char **argv, int argc)
1304{
e17c207e 1305 struct gdbarch *gdbarch = get_current_arch ();
79a45e25 1306 struct ui_out *uiout = current_uiout;
fb40c209
AC
1307 struct cleanup *cleanups = make_cleanup (null_cleanup, NULL);
1308 CORE_ADDR addr;
2b03b41d 1309 long total_bytes, nr_cols, nr_rows;
fb40c209
AC
1310 char word_format;
1311 struct type *word_type;
1312 long word_size;
1313 char word_asize;
1314 char aschar;
508416a1 1315 gdb_byte *mbuf;
fb40c209
AC
1316 int nr_bytes;
1317 long offset = 0;
56934ab1
AS
1318 int oind = 0;
1319 char *oarg;
fb40c209 1320 enum opt
fb40c209 1321 {
2b03b41d 1322 OFFSET_OPT
fb40c209 1323 };
2b03b41d
SS
1324 static const struct mi_opt opts[] =
1325 {
1326 {"o", OFFSET_OPT, 1},
1327 { 0, 0, 0 }
1328 };
fb40c209
AC
1329
1330 while (1)
1331 {
1b05df00 1332 int opt = mi_getopt ("-data-read-memory", argc, argv, opts,
56934ab1 1333 &oind, &oarg);
102040f0 1334
fb40c209
AC
1335 if (opt < 0)
1336 break;
1337 switch ((enum opt) opt)
1338 {
1339 case OFFSET_OPT:
56934ab1 1340 offset = atol (oarg);
fb40c209
AC
1341 break;
1342 }
1343 }
56934ab1
AS
1344 argv += oind;
1345 argc -= oind;
fb40c209
AC
1346
1347 if (argc < 5 || argc > 6)
7ea6d463
PM
1348 error (_("-data-read-memory: Usage: "
1349 "ADDR WORD-FORMAT WORD-SIZE NR-ROWS NR-COLS [ASCHAR]."));
fb40c209
AC
1350
1351 /* Extract all the arguments. */
1352
41296c92 1353 /* Start address of the memory dump. */
fb40c209 1354 addr = parse_and_eval_address (argv[0]) + offset;
41296c92 1355 /* The format character to use when displaying a memory word. See
2b03b41d 1356 the ``x'' command. */
fb40c209 1357 word_format = argv[1][0];
41296c92 1358 /* The size of the memory word. */
fb40c209
AC
1359 word_size = atol (argv[2]);
1360 switch (word_size)
1361 {
1362 case 1:
df4df182 1363 word_type = builtin_type (gdbarch)->builtin_int8;
fb40c209
AC
1364 word_asize = 'b';
1365 break;
1366 case 2:
df4df182 1367 word_type = builtin_type (gdbarch)->builtin_int16;
fb40c209
AC
1368 word_asize = 'h';
1369 break;
1370 case 4:
df4df182 1371 word_type = builtin_type (gdbarch)->builtin_int32;
fb40c209
AC
1372 word_asize = 'w';
1373 break;
1374 case 8:
df4df182 1375 word_type = builtin_type (gdbarch)->builtin_int64;
fb40c209
AC
1376 word_asize = 'g';
1377 break;
1378 default:
df4df182 1379 word_type = builtin_type (gdbarch)->builtin_int8;
fb40c209
AC
1380 word_asize = 'b';
1381 }
41296c92 1382 /* The number of rows. */
fb40c209
AC
1383 nr_rows = atol (argv[3]);
1384 if (nr_rows <= 0)
7ea6d463 1385 error (_("-data-read-memory: invalid number of rows."));
a13e061a 1386
41296c92 1387 /* Number of bytes per row. */
fb40c209
AC
1388 nr_cols = atol (argv[4]);
1389 if (nr_cols <= 0)
7ea6d463 1390 error (_("-data-read-memory: invalid number of columns."));
a13e061a 1391
41296c92 1392 /* The un-printable character when printing ascii. */
fb40c209
AC
1393 if (argc == 6)
1394 aschar = *argv[5];
1395 else
1396 aschar = 0;
1397
41296c92 1398 /* Create a buffer and read it in. */
fb40c209 1399 total_bytes = word_size * nr_rows * nr_cols;
2e94c453 1400 mbuf = xcalloc (total_bytes, 1);
b8c9b27d 1401 make_cleanup (xfree, mbuf);
cf7a04e8 1402
a4261689
PA
1403 /* Dispatch memory reads to the topmost target, not the flattened
1404 current_target. */
8dedea02
VP
1405 nr_bytes = target_read (current_target.beneath,
1406 TARGET_OBJECT_MEMORY, NULL, mbuf,
1407 addr, total_bytes);
cf7a04e8 1408 if (nr_bytes <= 0)
7ea6d463 1409 error (_("Unable to read memory."));
fb40c209 1410
41296c92 1411 /* Output the header information. */
5af949e3 1412 ui_out_field_core_addr (uiout, "addr", gdbarch, addr);
fb40c209
AC
1413 ui_out_field_int (uiout, "nr-bytes", nr_bytes);
1414 ui_out_field_int (uiout, "total-bytes", total_bytes);
5af949e3
UW
1415 ui_out_field_core_addr (uiout, "next-row",
1416 gdbarch, addr + word_size * nr_cols);
1417 ui_out_field_core_addr (uiout, "prev-row",
1418 gdbarch, addr - word_size * nr_cols);
1419 ui_out_field_core_addr (uiout, "next-page", gdbarch, addr + total_bytes);
1420 ui_out_field_core_addr (uiout, "prev-page", gdbarch, addr - total_bytes);
fb40c209 1421
41296c92 1422 /* Build the result as a two dimentional table. */
fb40c209 1423 {
f99d8bf4
PA
1424 struct ui_file *stream;
1425 struct cleanup *cleanup_stream;
fb40c209
AC
1426 int row;
1427 int row_byte;
102040f0 1428
f99d8bf4
PA
1429 stream = mem_fileopen ();
1430 cleanup_stream = make_cleanup_ui_file_delete (stream);
1431
1432 make_cleanup_ui_out_list_begin_end (uiout, "memory");
fb40c209
AC
1433 for (row = 0, row_byte = 0;
1434 row < nr_rows;
1435 row++, row_byte += nr_cols * word_size)
1436 {
1437 int col;
1438 int col_byte;
6ad4a2cf
JJ
1439 struct cleanup *cleanup_tuple;
1440 struct cleanup *cleanup_list_data;
79a45b7d
TT
1441 struct value_print_options opts;
1442
6ad4a2cf 1443 cleanup_tuple = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
5af949e3 1444 ui_out_field_core_addr (uiout, "addr", gdbarch, addr + row_byte);
9a2b4c1b
MS
1445 /* ui_out_field_core_addr_symbolic (uiout, "saddr", addr +
1446 row_byte); */
6ad4a2cf 1447 cleanup_list_data = make_cleanup_ui_out_list_begin_end (uiout, "data");
79a45b7d 1448 get_formatted_print_options (&opts, word_format);
fb40c209
AC
1449 for (col = 0, col_byte = row_byte;
1450 col < nr_cols;
1451 col++, col_byte += word_size)
1452 {
1453 if (col_byte + word_size > nr_bytes)
1454 {
1455 ui_out_field_string (uiout, NULL, "N/A");
1456 }
1457 else
1458 {
f99d8bf4 1459 ui_file_rewind (stream);
79a45b7d 1460 print_scalar_formatted (mbuf + col_byte, word_type, &opts,
f99d8bf4 1461 word_asize, stream);
fb40c209
AC
1462 ui_out_field_stream (uiout, NULL, stream);
1463 }
1464 }
6ad4a2cf 1465 do_cleanups (cleanup_list_data);
fb40c209
AC
1466 if (aschar)
1467 {
1468 int byte;
102040f0 1469
f99d8bf4 1470 ui_file_rewind (stream);
9a2b4c1b
MS
1471 for (byte = row_byte;
1472 byte < row_byte + word_size * nr_cols; byte++)
fb40c209
AC
1473 {
1474 if (byte >= nr_bytes)
f99d8bf4 1475 fputc_unfiltered ('X', stream);
fb40c209 1476 else if (mbuf[byte] < 32 || mbuf[byte] > 126)
f99d8bf4 1477 fputc_unfiltered (aschar, stream);
fb40c209 1478 else
f99d8bf4 1479 fputc_unfiltered (mbuf[byte], stream);
fb40c209
AC
1480 }
1481 ui_out_field_stream (uiout, "ascii", stream);
1482 }
6ad4a2cf 1483 do_cleanups (cleanup_tuple);
fb40c209 1484 }
f99d8bf4 1485 do_cleanups (cleanup_stream);
fb40c209
AC
1486 }
1487 do_cleanups (cleanups);
fb40c209
AC
1488}
1489
8dedea02
VP
1490void
1491mi_cmd_data_read_memory_bytes (char *command, char **argv, int argc)
1492{
1493 struct gdbarch *gdbarch = get_current_arch ();
79a45e25 1494 struct ui_out *uiout = current_uiout;
8dedea02
VP
1495 struct cleanup *cleanups;
1496 CORE_ADDR addr;
1497 LONGEST length;
1498 memory_read_result_s *read_result;
1499 int ix;
1500 VEC(memory_read_result_s) *result;
1501 long offset = 0;
56934ab1
AS
1502 int oind = 0;
1503 char *oarg;
8dedea02 1504 enum opt
8dedea02 1505 {
2b03b41d 1506 OFFSET_OPT
8dedea02 1507 };
2b03b41d
SS
1508 static const struct mi_opt opts[] =
1509 {
1510 {"o", OFFSET_OPT, 1},
1511 { 0, 0, 0 }
1512 };
8dedea02
VP
1513
1514 while (1)
1515 {
1b05df00 1516 int opt = mi_getopt ("-data-read-memory-bytes", argc, argv, opts,
56934ab1 1517 &oind, &oarg);
8dedea02
VP
1518 if (opt < 0)
1519 break;
1520 switch ((enum opt) opt)
1521 {
1522 case OFFSET_OPT:
56934ab1 1523 offset = atol (oarg);
8dedea02
VP
1524 break;
1525 }
1526 }
56934ab1
AS
1527 argv += oind;
1528 argc -= oind;
8dedea02
VP
1529
1530 if (argc != 2)
7ea6d463 1531 error (_("Usage: [ -o OFFSET ] ADDR LENGTH."));
8dedea02
VP
1532
1533 addr = parse_and_eval_address (argv[0]) + offset;
1534 length = atol (argv[1]);
1535
1536 result = read_memory_robust (current_target.beneath, addr, length);
1537
1538 cleanups = make_cleanup (free_memory_read_result_vector, result);
1539
1540 if (VEC_length (memory_read_result_s, result) == 0)
7ea6d463 1541 error (_("Unable to read memory."));
8dedea02
VP
1542
1543 make_cleanup_ui_out_list_begin_end (uiout, "memory");
1544 for (ix = 0;
1545 VEC_iterate (memory_read_result_s, result, ix, read_result);
1546 ++ix)
1547 {
1548 struct cleanup *t = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
1549 char *data, *p;
1550 int i;
1551
1552 ui_out_field_core_addr (uiout, "begin", gdbarch, read_result->begin);
1553 ui_out_field_core_addr (uiout, "offset", gdbarch, read_result->begin
1554 - addr);
1555 ui_out_field_core_addr (uiout, "end", gdbarch, read_result->end);
1556
1557 data = xmalloc ((read_result->end - read_result->begin) * 2 + 1);
1558
1559 for (i = 0, p = data;
1560 i < (read_result->end - read_result->begin);
1561 ++i, p += 2)
1562 {
1563 sprintf (p, "%02x", read_result->data[i]);
1564 }
1565 ui_out_field_string (uiout, "contents", data);
1566 xfree (data);
1567 do_cleanups (t);
1568 }
1569 do_cleanups (cleanups);
1570}
1571
2b03b41d 1572/* Implementation of the -data-write_memory command.
fb40c209 1573
177b42fe 1574 COLUMN_OFFSET: optional argument. Must be preceded by '-o'. The
fb40c209
AC
1575 offset from the beginning of the memory grid row where the cell to
1576 be written is.
1577 ADDR: start address of the row in the memory grid where the memory
41296c92 1578 cell is, if OFFSET_COLUMN is specified. Otherwise, the address of
fb40c209 1579 the location to write to.
41296c92 1580 FORMAT: a char indicating format for the ``word''. See
fb40c209
AC
1581 the ``x'' command.
1582 WORD_SIZE: size of each ``word''; 1,2,4, or 8 bytes
1583 VALUE: value to be written into the memory address.
1584
1585 Writes VALUE into ADDR + (COLUMN_OFFSET * WORD_SIZE).
1586
41296c92 1587 Prints nothing. */
2b03b41d 1588
ce8f13f8 1589void
fb40c209
AC
1590mi_cmd_data_write_memory (char *command, char **argv, int argc)
1591{
e17a4113
UW
1592 struct gdbarch *gdbarch = get_current_arch ();
1593 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
fb40c209 1594 CORE_ADDR addr;
fb40c209
AC
1595 long word_size;
1596 /* FIXME: ezannoni 2000-02-17 LONGEST could possibly not be big
41296c92 1597 enough when using a compiler other than GCC. */
fb40c209 1598 LONGEST value;
d8bf3afa
KB
1599 void *buffer;
1600 struct cleanup *old_chain;
fb40c209 1601 long offset = 0;
56934ab1
AS
1602 int oind = 0;
1603 char *oarg;
fb40c209 1604 enum opt
fb40c209 1605 {
2b03b41d 1606 OFFSET_OPT
fb40c209 1607 };
2b03b41d
SS
1608 static const struct mi_opt opts[] =
1609 {
1610 {"o", OFFSET_OPT, 1},
1611 { 0, 0, 0 }
1612 };
fb40c209
AC
1613
1614 while (1)
1615 {
1b05df00 1616 int opt = mi_getopt ("-data-write-memory", argc, argv, opts,
56934ab1 1617 &oind, &oarg);
102040f0 1618
fb40c209
AC
1619 if (opt < 0)
1620 break;
1621 switch ((enum opt) opt)
1622 {
1623 case OFFSET_OPT:
56934ab1 1624 offset = atol (oarg);
fb40c209
AC
1625 break;
1626 }
1627 }
56934ab1
AS
1628 argv += oind;
1629 argc -= oind;
fb40c209
AC
1630
1631 if (argc != 4)
7ea6d463
PM
1632 error (_("-data-write-memory: Usage: "
1633 "[-o COLUMN_OFFSET] ADDR FORMAT WORD-SIZE VALUE."));
fb40c209 1634
41296c92
NR
1635 /* Extract all the arguments. */
1636 /* Start address of the memory dump. */
fb40c209 1637 addr = parse_and_eval_address (argv[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 1668 gdb_byte *databuf;
5799c0b9 1669 size_t len, i, steps, remainder;
62747a60 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 1765#if HAVE_PYTHON
0646da15
TT
1766 if (gdb_python_initialized)
1767 ui_out_field_string (uiout, NULL, "python");
b6313243
TT
1768#endif
1769
084344da 1770 do_cleanups (cleanup);
ce8f13f8 1771 return;
084344da
VP
1772 }
1773
7ea6d463 1774 error (_("-list-features should be passed no arguments"));
084344da 1775}
c6ebd6cf
VP
1776
1777void
1778mi_cmd_list_target_features (char *command, char **argv, int argc)
1779{
1780 if (argc == 0)
1781 {
1782 struct cleanup *cleanup = NULL;
79a45e25 1783 struct ui_out *uiout = current_uiout;
c6ebd6cf 1784
102040f0 1785 cleanup = make_cleanup_ui_out_list_begin_end (uiout, "features");
c6ebd6cf
VP
1786 if (target_can_async_p ())
1787 ui_out_field_string (uiout, NULL, "async");
f75d858b
MK
1788 if (target_can_execute_reverse)
1789 ui_out_field_string (uiout, NULL, "reverse");
c6ebd6cf
VP
1790
1791 do_cleanups (cleanup);
1792 return;
1793 }
1794
7ea6d463 1795 error (_("-list-target-features should be passed no arguments"));
c6ebd6cf
VP
1796}
1797
a79b8f6e
VP
1798void
1799mi_cmd_add_inferior (char *command, char **argv, int argc)
1800{
1801 struct inferior *inf;
1802
1803 if (argc != 0)
1804 error (_("-add-inferior should be passed no arguments"));
1805
1806 inf = add_inferior_with_spaces ();
1807
79a45e25 1808 ui_out_field_fmt (current_uiout, "inferior", "i%d", inf->num);
a79b8f6e
VP
1809}
1810
2b03b41d
SS
1811/* Callback used to find the first inferior other than the current
1812 one. */
57bf2d7e
MK
1813
1814static int
1815get_other_inferior (struct inferior *inf, void *arg)
1816{
1817 if (inf == current_inferior ())
1818 return 0;
1819
1820 return 1;
1821}
1822
a79b8f6e
VP
1823void
1824mi_cmd_remove_inferior (char *command, char **argv, int argc)
1825{
1826 int id;
1827 struct inferior *inf;
1828
1829 if (argc != 1)
7ea6d463 1830 error (_("-remove-inferior should be passed a single argument"));
a79b8f6e 1831
e2b4a699 1832 if (sscanf (argv[0], "i%d", &id) != 1)
7ea6d463 1833 error (_("the thread group id is syntactically invalid"));
a79b8f6e
VP
1834
1835 inf = find_inferior_id (id);
1836 if (!inf)
7ea6d463 1837 error (_("the specified thread group does not exist"));
a79b8f6e 1838
8fa067af 1839 if (inf->pid != 0)
81ec3cce 1840 error (_("cannot remove an active inferior"));
8fa067af 1841
57bf2d7e
MK
1842 if (inf == current_inferior ())
1843 {
1844 struct thread_info *tp = 0;
1845 struct inferior *new_inferior
1846 = iterate_over_inferiors (get_other_inferior, NULL);
1847
1848 if (new_inferior == NULL)
1849 error (_("Cannot remove last inferior"));
1850
1851 set_current_inferior (new_inferior);
1852 if (new_inferior->pid != 0)
1853 tp = any_thread_of_process (new_inferior->pid);
1854 switch_to_thread (tp ? tp->ptid : null_ptid);
1855 set_current_program_space (new_inferior->pspace);
1856 }
1857
a79b8f6e
VP
1858 delete_inferior_1 (inf, 1 /* silent */);
1859}
1860
1861\f
1862
8d34ea23
KS
1863/* Execute a command within a safe environment.
1864 Return <0 for error; >=0 for ok.
1865
1866 args->action will tell mi_execute_command what action
42972f50 1867 to perfrom after the given command has executed (display/suppress
2b03b41d 1868 prompt, display error). */
fb40c209 1869
f30f06b8 1870static void
04bd08de 1871captured_mi_execute_command (struct ui_out *uiout, struct mi_parse *context)
fb40c209 1872{
1f31650a 1873 struct cleanup *cleanup;
fb40c209 1874
4333ada3
VP
1875 if (do_timings)
1876 current_command_ts = context->cmd_start;
d8c83789 1877
1f31650a
VP
1878 current_token = xstrdup (context->token);
1879 cleanup = make_cleanup (free_current_contents, &current_token);
1880
a2840c35 1881 running_result_record_printed = 0;
f3b1572e 1882 mi_proceeded = 0;
fb40c209
AC
1883 switch (context->op)
1884 {
fb40c209 1885 case MI_COMMAND:
41296c92 1886 /* A MI command was read from the input stream. */
fb40c209
AC
1887 if (mi_debug_p)
1888 /* FIXME: gdb_???? */
1889 fprintf_unfiltered (raw_stdout, " token=`%s' command=`%s' args=`%s'\n",
1890 context->token, context->command, context->args);
d8c83789 1891
ce8f13f8 1892 mi_cmd_execute (context);
8d34ea23 1893
a2840c35 1894 /* Print the result if there were no errors.
4389a95a 1895
a2840c35 1896 Remember that on the way out of executing a command, you have
2b03b41d
SS
1897 to directly use the mi_interp's uiout, since the command
1898 could have reset the interpreter, in which case the current
1899 uiout will most likely crash in the mi_out_* routines. */
ce8f13f8 1900 if (!running_result_record_printed)
a2840c35
VP
1901 {
1902 fputs_unfiltered (context->token, raw_stdout);
ce8f13f8
VP
1903 /* There's no particularly good reason why target-connect results
1904 in not ^done. Should kill ^connected for MI3. */
1905 fputs_unfiltered (strcmp (context->command, "target-select") == 0
1906 ? "^connected" : "^done", raw_stdout);
a2840c35
VP
1907 mi_out_put (uiout, raw_stdout);
1908 mi_out_rewind (uiout);
4333ada3 1909 mi_print_timing_maybe ();
a2840c35
VP
1910 fputs_unfiltered ("\n", raw_stdout);
1911 }
1912 else
2b03b41d
SS
1913 /* The command does not want anything to be printed. In that
1914 case, the command probably should not have written anything
1915 to uiout, but in case it has written something, discard it. */
a2840c35 1916 mi_out_rewind (uiout);
fb40c209
AC
1917 break;
1918
1919 case CLI_COMMAND:
78f5381d
AC
1920 {
1921 char *argv[2];
102040f0 1922
78f5381d
AC
1923 /* A CLI command was read from the input stream. */
1924 /* This "feature" will be removed as soon as we have a
1925 complete set of mi commands. */
1926 /* Echo the command on the console. */
1927 fprintf_unfiltered (gdb_stdlog, "%s\n", context->command);
1928 /* Call the "console" interpreter. */
1929 argv[0] = "console";
1930 argv[1] = context->command;
ce8f13f8 1931 mi_cmd_interpreter_exec ("-interpreter-exec", argv, 2);
78f5381d 1932
eec01795 1933 /* If we changed interpreters, DON'T print out anything. */
78f5381d
AC
1934 if (current_interp_named_p (INTERP_MI)
1935 || current_interp_named_p (INTERP_MI1)
1936 || current_interp_named_p (INTERP_MI2)
1937 || current_interp_named_p (INTERP_MI3))
1938 {
ce8f13f8 1939 if (!running_result_record_printed)
eec01795
DJ
1940 {
1941 fputs_unfiltered (context->token, raw_stdout);
1942 fputs_unfiltered ("^done", raw_stdout);
1943 mi_out_put (uiout, raw_stdout);
1944 mi_out_rewind (uiout);
4333ada3
VP
1945 mi_print_timing_maybe ();
1946 fputs_unfiltered ("\n", raw_stdout);
eec01795 1947 }
eec01795
DJ
1948 else
1949 mi_out_rewind (uiout);
78f5381d
AC
1950 }
1951 break;
1952 }
fb40c209 1953 }
8d34ea23 1954
1f31650a 1955 do_cleanups (cleanup);
fb40c209
AC
1956}
1957
305aeedc
TT
1958/* Print a gdb exception to the MI output stream. */
1959
1960static void
1961mi_print_exception (const char *token, struct gdb_exception exception)
1962{
1963 fputs_unfiltered (token, raw_stdout);
1964 fputs_unfiltered ("^error,msg=\"", raw_stdout);
1965 if (exception.message == NULL)
1966 fputs_unfiltered ("unknown error", raw_stdout);
1967 else
1968 fputstr_unfiltered (exception.message, '"', raw_stdout);
1969 fputs_unfiltered ("\"\n", raw_stdout);
1970}
fb40c209
AC
1971
1972void
ee047554 1973mi_execute_command (const char *cmd, int from_tty)
fb40c209 1974{
305aeedc
TT
1975 char *token;
1976 struct mi_parse *command = NULL;
1977 volatile struct gdb_exception exception;
fb40c209 1978
41296c92
NR
1979 /* This is to handle EOF (^D). We just quit gdb. */
1980 /* FIXME: we should call some API function here. */
fb40c209
AC
1981 if (cmd == 0)
1982 quit_force (NULL, from_tty);
1983
11334b82
VP
1984 target_log_command (cmd);
1985
305aeedc
TT
1986 TRY_CATCH (exception, RETURN_MASK_ALL)
1987 {
1988 command = mi_parse (cmd, &token);
1989 }
1990 if (exception.reason < 0)
1991 {
1992 mi_print_exception (token, exception);
1993 xfree (token);
1994 }
1995 else
fb40c209 1996 {
04bd08de 1997 volatile struct gdb_exception result;
66bb093b 1998 ptid_t previous_ptid = inferior_ptid;
d8c83789 1999
305aeedc
TT
2000 command->token = token;
2001
d8c83789
NR
2002 if (do_timings)
2003 {
2004 command->cmd_start = (struct mi_timestamp *)
2005 xmalloc (sizeof (struct mi_timestamp));
2006 timestamp (command->cmd_start);
2007 }
2008
04bd08de
TT
2009 TRY_CATCH (result, RETURN_MASK_ALL)
2010 {
79a45e25 2011 captured_mi_execute_command (current_uiout, command);
04bd08de 2012 }
ce43223b 2013 if (result.reason < 0)
fb40c209 2014 {
fb40c209 2015 /* The command execution failed and error() was called
589e074d 2016 somewhere. */
305aeedc 2017 mi_print_exception (command->token, result);
79a45e25 2018 mi_out_rewind (current_uiout);
fb40c209 2019 }
a13e061a 2020
5d4e2b76
VP
2021 bpstat_do_actions ();
2022
66bb093b
VP
2023 if (/* The notifications are only output when the top-level
2024 interpreter (specified on the command line) is MI. */
2025 ui_out_is_mi_like_p (interp_ui_out (top_level_interpreter ()))
2026 /* Don't try report anything if there are no threads --
2027 the program is dead. */
2028 && thread_count () != 0
2029 /* -thread-select explicitly changes thread. If frontend uses that
2030 internally, we don't want to emit =thread-selected, since
2031 =thread-selected is supposed to indicate user's intentions. */
2032 && strcmp (command->command, "thread-select") != 0)
2033 {
2034 struct mi_interp *mi = top_level_interpreter_data ();
d729566a 2035 int report_change = 0;
66bb093b
VP
2036
2037 if (command->thread == -1)
2038 {
d729566a
PA
2039 report_change = (!ptid_equal (previous_ptid, null_ptid)
2040 && !ptid_equal (inferior_ptid, previous_ptid)
2041 && !ptid_equal (inferior_ptid, null_ptid));
66bb093b 2042 }
d729566a 2043 else if (!ptid_equal (inferior_ptid, null_ptid))
66bb093b 2044 {
d729566a 2045 struct thread_info *ti = inferior_thread ();
102040f0 2046
66bb093b
VP
2047 report_change = (ti->num != command->thread);
2048 }
2049
2050 if (report_change)
2051 {
d729566a 2052 struct thread_info *ti = inferior_thread ();
102040f0 2053
66bb093b
VP
2054 target_terminal_ours ();
2055 fprintf_unfiltered (mi->event_channel,
2056 "thread-selected,id=\"%d\"",
2057 ti->num);
2058 gdb_flush (mi->event_channel);
2059 }
2060 }
2061
fb40c209
AC
2062 mi_parse_free (command);
2063 }
fb40c209
AC
2064}
2065
ce8f13f8 2066static void
fb40c209
AC
2067mi_cmd_execute (struct mi_parse *parse)
2068{
f107f563 2069 struct cleanup *cleanup;
e23110bb 2070
028d0ed5 2071 cleanup = prepare_execute_command ();
1b98914a 2072
a79b8f6e
VP
2073 if (parse->all && parse->thread_group != -1)
2074 error (_("Cannot specify --thread-group together with --all"));
2075
2076 if (parse->all && parse->thread != -1)
2077 error (_("Cannot specify --thread together with --all"));
2078
2079 if (parse->thread_group != -1 && parse->thread != -1)
2080 error (_("Cannot specify --thread together with --thread-group"));
2081
1e92afda
VP
2082 if (parse->frame != -1 && parse->thread == -1)
2083 error (_("Cannot specify --frame without --thread"));
dcf4fbde 2084
a79b8f6e
VP
2085 if (parse->thread_group != -1)
2086 {
2087 struct inferior *inf = find_inferior_id (parse->thread_group);
2088 struct thread_info *tp = 0;
2089
2090 if (!inf)
46ef47e5 2091 error (_("Invalid thread group for the --thread-group option"));
a79b8f6e
VP
2092
2093 set_current_inferior (inf);
2094 /* This behaviour means that if --thread-group option identifies
2b03b41d
SS
2095 an inferior with multiple threads, then a random one will be
2096 picked. This is not a problem -- frontend should always
2097 provide --thread if it wishes to operate on a specific
2098 thread. */
a79b8f6e 2099 if (inf->pid != 0)
4734f50e 2100 tp = any_live_thread_of_process (inf->pid);
a79b8f6e
VP
2101 switch_to_thread (tp ? tp->ptid : null_ptid);
2102 set_current_program_space (inf->pspace);
2103 }
2104
1e92afda
VP
2105 if (parse->thread != -1)
2106 {
2107 struct thread_info *tp = find_thread_id (parse->thread);
102040f0 2108
1e92afda
VP
2109 if (!tp)
2110 error (_("Invalid thread id: %d"), parse->thread);
dcf4fbde
PA
2111
2112 if (is_exited (tp->ptid))
2113 error (_("Thread id: %d has terminated"), parse->thread);
2114
2115 switch_to_thread (tp->ptid);
1e92afda 2116 }
dcf4fbde 2117
1e92afda
VP
2118 if (parse->frame != -1)
2119 {
2120 struct frame_info *fid;
2121 int frame = parse->frame;
102040f0 2122
1e92afda
VP
2123 fid = find_relative_frame (get_current_frame (), &frame);
2124 if (frame == 0)
2125 /* find_relative_frame was successful */
2126 select_frame (fid);
2127 else
ea069267 2128 error (_("Invalid frame id: %d"), frame);
1e92afda 2129 }
dcf4fbde 2130
a79b8f6e
VP
2131 current_context = parse;
2132
648beb2b 2133 if (parse->cmd->suppress_notification != NULL)
8d3788bd 2134 {
648beb2b
YQ
2135 make_cleanup_restore_integer (parse->cmd->suppress_notification);
2136 *parse->cmd->suppress_notification = 1;
8d3788bd
VP
2137 }
2138
9e22b03a 2139 if (parse->cmd->argv_func != NULL)
8d3788bd
VP
2140 {
2141 parse->cmd->argv_func (parse->command, parse->argv, parse->argc);
2142 }
b2af646b 2143 else if (parse->cmd->cli.cmd != 0)
fb40c209
AC
2144 {
2145 /* FIXME: DELETE THIS. */
41296c92
NR
2146 /* The operation is still implemented by a cli command. */
2147 /* Must be a synchronous one. */
b2af646b
AC
2148 mi_execute_cli_command (parse->cmd->cli.cmd, parse->cmd->cli.args_p,
2149 parse->args);
fb40c209
AC
2150 }
2151 else
2152 {
41296c92 2153 /* FIXME: DELETE THIS. */
a13e061a
PA
2154 struct ui_file *stb;
2155
2156 stb = mem_fileopen ();
2157
2158 fputs_unfiltered ("Undefined mi command: ", stb);
2159 fputstr_unfiltered (parse->command, '"', stb);
2160 fputs_unfiltered (" (missing implementation)", stb);
2161
2162 make_cleanup_ui_file_delete (stb);
2163 error_stream (stb);
fb40c209 2164 }
1b98914a 2165 do_cleanups (cleanup);
fb40c209
AC
2166}
2167
fb40c209 2168/* FIXME: This is just a hack so we can get some extra commands going.
41296c92
NR
2169 We don't want to channel things through the CLI, but call libgdb directly.
2170 Use only for synchronous commands. */
fb40c209
AC
2171
2172void
b2af646b 2173mi_execute_cli_command (const char *cmd, int args_p, const char *args)
fb40c209 2174{
b2af646b 2175 if (cmd != 0)
fb40c209
AC
2176 {
2177 struct cleanup *old_cleanups;
2178 char *run;
102040f0 2179
b2af646b 2180 if (args_p)
c6902d46 2181 run = xstrprintf ("%s %s", cmd, args);
b2af646b
AC
2182 else
2183 run = xstrdup (cmd);
fb40c209
AC
2184 if (mi_debug_p)
2185 /* FIXME: gdb_???? */
2186 fprintf_unfiltered (gdb_stdout, "cli=%s run=%s\n",
b2af646b 2187 cmd, run);
b8c9b27d 2188 old_cleanups = make_cleanup (xfree, run);
2b03b41d 2189 execute_command (run, 0 /* from_tty */ );
fb40c209
AC
2190 do_cleanups (old_cleanups);
2191 return;
2192 }
2193}
2194
ce8f13f8 2195void
9e22b03a 2196mi_execute_async_cli_command (char *cli_command, char **argv, int argc)
fb40c209
AC
2197{
2198 struct cleanup *old_cleanups;
2199 char *run;
fb40c209
AC
2200
2201 if (target_can_async_p ())
9e22b03a 2202 run = xstrprintf ("%s %s&", cli_command, argc ? *argv : "");
fb40c209 2203 else
9e22b03a 2204 run = xstrprintf ("%s %s", cli_command, argc ? *argv : "");
f107f563 2205 old_cleanups = make_cleanup (xfree, run);
fb40c209 2206
2b03b41d 2207 execute_command (run, 0 /* from_tty */ );
fb40c209 2208
09cee04b
PA
2209 /* Do this before doing any printing. It would appear that some
2210 print code leaves garbage around in the buffer. */
2211 do_cleanups (old_cleanups);
fb40c209
AC
2212}
2213
2214void
fb40c209
AC
2215mi_load_progress (const char *section_name,
2216 unsigned long sent_so_far,
2217 unsigned long total_section,
2218 unsigned long total_sent,
2219 unsigned long grand_total)
2220{
2221 struct timeval time_now, delta, update_threshold;
2222 static struct timeval last_update;
2223 static char *previous_sect_name = NULL;
2224 int new_section;
0be75e02 2225 struct ui_out *saved_uiout;
79a45e25 2226 struct ui_out *uiout;
fb40c209 2227
0be75e02
AS
2228 /* This function is called through deprecated_show_load_progress
2229 which means uiout may not be correct. Fix it for the duration
2230 of this function. */
79a45e25 2231 saved_uiout = current_uiout;
0be75e02 2232
edff0c0a
DJ
2233 if (current_interp_named_p (INTERP_MI)
2234 || current_interp_named_p (INTERP_MI2))
79a45e25 2235 current_uiout = mi_out_new (2);
0be75e02 2236 else if (current_interp_named_p (INTERP_MI1))
79a45e25 2237 current_uiout = mi_out_new (1);
edff0c0a 2238 else if (current_interp_named_p (INTERP_MI3))
79a45e25 2239 current_uiout = mi_out_new (3);
0be75e02 2240 else
fb40c209
AC
2241 return;
2242
79a45e25
PA
2243 uiout = current_uiout;
2244
fb40c209
AC
2245 update_threshold.tv_sec = 0;
2246 update_threshold.tv_usec = 500000;
2247 gettimeofday (&time_now, NULL);
2248
2249 delta.tv_usec = time_now.tv_usec - last_update.tv_usec;
2250 delta.tv_sec = time_now.tv_sec - last_update.tv_sec;
2251
2252 if (delta.tv_usec < 0)
2253 {
2254 delta.tv_sec -= 1;
f2395593 2255 delta.tv_usec += 1000000L;
fb40c209
AC
2256 }
2257
2258 new_section = (previous_sect_name ?
2259 strcmp (previous_sect_name, section_name) : 1);
2260 if (new_section)
2261 {
6ad4a2cf 2262 struct cleanup *cleanup_tuple;
102040f0 2263
b8c9b27d 2264 xfree (previous_sect_name);
fb40c209
AC
2265 previous_sect_name = xstrdup (section_name);
2266
721c02de
VP
2267 if (current_token)
2268 fputs_unfiltered (current_token, raw_stdout);
fb40c209 2269 fputs_unfiltered ("+download", raw_stdout);
6ad4a2cf 2270 cleanup_tuple = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
fb40c209
AC
2271 ui_out_field_string (uiout, "section", section_name);
2272 ui_out_field_int (uiout, "section-size", total_section);
2273 ui_out_field_int (uiout, "total-size", grand_total);
6ad4a2cf 2274 do_cleanups (cleanup_tuple);
fb40c209
AC
2275 mi_out_put (uiout, raw_stdout);
2276 fputs_unfiltered ("\n", raw_stdout);
2277 gdb_flush (raw_stdout);
2278 }
2279
2280 if (delta.tv_sec >= update_threshold.tv_sec &&
2281 delta.tv_usec >= update_threshold.tv_usec)
2282 {
6ad4a2cf 2283 struct cleanup *cleanup_tuple;
102040f0 2284
fb40c209
AC
2285 last_update.tv_sec = time_now.tv_sec;
2286 last_update.tv_usec = time_now.tv_usec;
721c02de
VP
2287 if (current_token)
2288 fputs_unfiltered (current_token, raw_stdout);
fb40c209 2289 fputs_unfiltered ("+download", raw_stdout);
6ad4a2cf 2290 cleanup_tuple = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
fb40c209
AC
2291 ui_out_field_string (uiout, "section", section_name);
2292 ui_out_field_int (uiout, "section-sent", sent_so_far);
2293 ui_out_field_int (uiout, "section-size", total_section);
2294 ui_out_field_int (uiout, "total-sent", total_sent);
2295 ui_out_field_int (uiout, "total-size", grand_total);
6ad4a2cf 2296 do_cleanups (cleanup_tuple);
fb40c209
AC
2297 mi_out_put (uiout, raw_stdout);
2298 fputs_unfiltered ("\n", raw_stdout);
2299 gdb_flush (raw_stdout);
2300 }
0be75e02
AS
2301
2302 xfree (uiout);
67ba4e42 2303 current_uiout = saved_uiout;
fb40c209
AC
2304}
2305
d8c83789
NR
2306static void
2307timestamp (struct mi_timestamp *tv)
2b03b41d
SS
2308{
2309 gettimeofday (&tv->wallclock, NULL);
d8c83789 2310#ifdef HAVE_GETRUSAGE
2b03b41d
SS
2311 getrusage (RUSAGE_SELF, &rusage);
2312 tv->utime.tv_sec = rusage.ru_utime.tv_sec;
2313 tv->utime.tv_usec = rusage.ru_utime.tv_usec;
2314 tv->stime.tv_sec = rusage.ru_stime.tv_sec;
2315 tv->stime.tv_usec = rusage.ru_stime.tv_usec;
d8c83789 2316#else
2b03b41d
SS
2317 {
2318 long usec = get_run_time ();
a1b7d198 2319
2b03b41d
SS
2320 tv->utime.tv_sec = usec/1000000L;
2321 tv->utime.tv_usec = usec - 1000000L*tv->utime.tv_sec;
2322 tv->stime.tv_sec = 0;
2323 tv->stime.tv_usec = 0;
d8c83789 2324 }
2b03b41d
SS
2325#endif
2326}
d8c83789
NR
2327
2328static void
2329print_diff_now (struct mi_timestamp *start)
2b03b41d
SS
2330{
2331 struct mi_timestamp now;
102040f0 2332
2b03b41d
SS
2333 timestamp (&now);
2334 print_diff (start, &now);
2335}
d8c83789 2336
4333ada3
VP
2337void
2338mi_print_timing_maybe (void)
2339{
2b03b41d
SS
2340 /* If the command is -enable-timing then do_timings may be true
2341 whilst current_command_ts is not initialized. */
4333ada3
VP
2342 if (do_timings && current_command_ts)
2343 print_diff_now (current_command_ts);
2344}
2345
d8c83789
NR
2346static long
2347timeval_diff (struct timeval start, struct timeval end)
2b03b41d
SS
2348{
2349 return ((end.tv_sec - start.tv_sec) * 1000000L)
2350 + (end.tv_usec - start.tv_usec);
2351}
d8c83789
NR
2352
2353static void
2354print_diff (struct mi_timestamp *start, struct mi_timestamp *end)
2b03b41d
SS
2355{
2356 fprintf_unfiltered
2357 (raw_stdout,
2358 ",time={wallclock=\"%0.5f\",user=\"%0.5f\",system=\"%0.5f\"}",
2359 timeval_diff (start->wallclock, end->wallclock) / 1000000.0,
2360 timeval_diff (start->utime, end->utime) / 1000000.0,
2361 timeval_diff (start->stime, end->stime) / 1000000.0);
2362}
f224b49d 2363
40e1c229
VP
2364void
2365mi_cmd_trace_define_variable (char *command, char **argv, int argc)
2366{
2367 struct expression *expr;
40e1c229
VP
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
1773c82c
HAQ
2375 name = argv[0];
2376 if (*name++ != '$')
2377 error (_("Name of trace variable should start with '$'"));
40e1c229 2378
1773c82c 2379 validate_trace_state_variable_name (name);
40e1c229
VP
2380
2381 tsv = find_trace_state_variable (name);
2382 if (!tsv)
2383 tsv = create_trace_state_variable (name);
2384
2385 if (argc == 2)
2386 initval = value_as_long (parse_and_eval (argv[1]));
2387
2388 tsv->initial_value = initval;
40e1c229
VP
2389}
2390
2391void
2392mi_cmd_trace_list_variables (char *command, char **argv, int argc)
2393{
2394 if (argc != 0)
2b03b41d 2395 error (_("-trace-list-variables: no arguments allowed"));
40e1c229
VP
2396
2397 tvariables_info_1 ();
2398}
2399
f197e0f1
VP
2400void
2401mi_cmd_trace_find (char *command, char **argv, int argc)
2402{
2403 char *mode;
2404
2405 if (argc == 0)
2406 error (_("trace selection mode is required"));
2407
2408 mode = argv[0];
2409
2410 if (strcmp (mode, "none") == 0)
2411 {
2412 tfind_1 (tfind_number, -1, 0, 0, 0);
2413 return;
2414 }
2415
2416 if (current_trace_status ()->running)
2417 error (_("May not look at trace frames while trace is running."));
2418
2419 if (strcmp (mode, "frame-number") == 0)
2420 {
2421 if (argc != 2)
2422 error (_("frame number is required"));
2423 tfind_1 (tfind_number, atoi (argv[1]), 0, 0, 0);
2424 }
2425 else if (strcmp (mode, "tracepoint-number") == 0)
2426 {
2427 if (argc != 2)
2428 error (_("tracepoint number is required"));
2429 tfind_1 (tfind_tp, atoi (argv[1]), 0, 0, 0);
2430 }
2431 else if (strcmp (mode, "pc") == 0)
2432 {
2433 if (argc != 2)
2434 error (_("PC is required"));
2435 tfind_1 (tfind_pc, 0, parse_and_eval_address (argv[1]), 0, 0);
2436 }
2437 else if (strcmp (mode, "pc-inside-range") == 0)
2438 {
2439 if (argc != 3)
2440 error (_("Start and end PC are required"));
2441 tfind_1 (tfind_range, 0, parse_and_eval_address (argv[1]),
2442 parse_and_eval_address (argv[2]), 0);
2443 }
2444 else if (strcmp (mode, "pc-outside-range") == 0)
2445 {
2446 if (argc != 3)
2447 error (_("Start and end PC are required"));
2448 tfind_1 (tfind_outside, 0, parse_and_eval_address (argv[1]),
2449 parse_and_eval_address (argv[2]), 0);
2450 }
2451 else if (strcmp (mode, "line") == 0)
2452 {
2453 struct symtabs_and_lines sals;
2454 struct symtab_and_line sal;
2455 static CORE_ADDR start_pc, end_pc;
2456 struct cleanup *back_to;
2457
2458 if (argc != 2)
2459 error (_("Line is required"));
2460
39cf75f7
DE
2461 sals = decode_line_with_current_source (argv[1],
2462 DECODE_LINE_FUNFIRSTLINE);
f197e0f1
VP
2463 back_to = make_cleanup (xfree, sals.sals);
2464
2465 sal = sals.sals[0];
2466
2467 if (sal.symtab == 0)
2468 error (_("Could not find the specified line"));
2469
2470 if (sal.line > 0 && find_line_pc_range (sal, &start_pc, &end_pc))
2471 tfind_1 (tfind_range, 0, start_pc, end_pc - 1, 0);
2472 else
2473 error (_("Could not find the specified line"));
2474
2475 do_cleanups (back_to);
2476 }
2477 else
2478 error (_("Invalid mode '%s'"), mode);
2479
2480 if (has_stack_frames () || get_traceframe_number () >= 0)
2b03b41d 2481 print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC);
f197e0f1
VP
2482}
2483
011aacb0
VP
2484void
2485mi_cmd_trace_save (char *command, char **argv, int argc)
2486{
2487 int target_saves = 0;
d0353e76 2488 int generate_ctf = 0;
011aacb0 2489 char *filename;
d0353e76
YQ
2490 int oind = 0;
2491 char *oarg;
011aacb0 2492
d0353e76
YQ
2493 enum opt
2494 {
2495 TARGET_SAVE_OPT, CTF_OPT
2496 };
2497 static const struct mi_opt opts[] =
011aacb0 2498 {
d0353e76
YQ
2499 {"r", TARGET_SAVE_OPT, 0},
2500 {"ctf", CTF_OPT, 0},
2501 { 0, 0, 0 }
2502 };
2503
2504 while (1)
011aacb0 2505 {
d0353e76
YQ
2506 int opt = mi_getopt ("-trace-save", argc, argv, opts,
2507 &oind, &oarg);
2508
2509 if (opt < 0)
2510 break;
2511 switch ((enum opt) opt)
2512 {
2513 case TARGET_SAVE_OPT:
2514 target_saves = 1;
2515 break;
2516 case CTF_OPT:
2517 generate_ctf = 1;
2518 break;
2519 }
011aacb0 2520 }
d0353e76 2521 filename = argv[oind];
011aacb0 2522
d0353e76
YQ
2523 if (generate_ctf)
2524 trace_save_ctf (filename, target_saves);
2525 else
2526 trace_save_tfile (filename, target_saves);
011aacb0
VP
2527}
2528
f224b49d
VP
2529void
2530mi_cmd_trace_start (char *command, char **argv, int argc)
2531{
f196051f 2532 start_tracing (NULL);
f224b49d
VP
2533}
2534
2535void
2536mi_cmd_trace_status (char *command, char **argv, int argc)
2537{
2538 trace_status_mi (0);
2539}
2540
2541void
2542mi_cmd_trace_stop (char *command, char **argv, int argc)
2543{
f196051f 2544 stop_tracing (NULL);
f224b49d
VP
2545 trace_status_mi (1);
2546}
75082e8c 2547
2b03b41d 2548/* Implement the "-ada-task-info" command. */
75082e8c
JB
2549
2550void
2551mi_cmd_ada_task_info (char *command, char **argv, int argc)
2552{
2553 if (argc != 0 && argc != 1)
2554 error (_("Invalid MI command"));
2555
2556 print_ada_task_info (current_uiout, argv[0], current_inferior ());
2557}
This page took 1.322352 seconds and 4 git commands to generate.