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