* mi/mi-cmd-target.c (mi_cmd_target_file_get): Rename `optind' and
[deliverable/binutils-gdb.git] / gdb / mi / mi-main.c
CommitLineData
fb40c209 1/* MI Command Set.
cd0bfa36 2
7b6bb8da
JB
3 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010,
4 2011 Free Software Foundation, Inc.
cd0bfa36 5
ab91fdd5 6 Contributed by Cygnus Solutions (a Red Hat company).
fb40c209
AC
7
8 This file is part of GDB.
9
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
a9762ec7 12 the Free Software Foundation; either version 3 of the License, or
fb40c209
AC
13 (at your option) any later version.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
a9762ec7 21 along with this program. If not, see <http://www.gnu.org/licenses/>. */
fb40c209 22
41296c92 23/* Work in progress. */
fb40c209
AC
24
25#include "defs.h"
e17c207e 26#include "arch-utils.h"
fb40c209
AC
27#include "target.h"
28#include "inferior.h"
29#include "gdb_string.h"
60250e8b 30#include "exceptions.h"
fb40c209
AC
31#include "top.h"
32#include "gdbthread.h"
33#include "mi-cmds.h"
34#include "mi-parse.h"
35#include "mi-getopt.h"
36#include "mi-console.h"
37#include "ui-out.h"
38#include "mi-out.h"
4389a95a 39#include "interps.h"
fb40c209
AC
40#include "event-loop.h"
41#include "event-top.h"
41296c92 42#include "gdbcore.h" /* For write_memory(). */
56178203 43#include "value.h"
4e052eda 44#include "regcache.h"
5b7f31a4 45#include "gdb.h"
36dc181b 46#include "frame.h"
b9362cc7 47#include "mi-main.h"
66bb093b 48#include "mi-common.h"
d8ca156b 49#include "language.h"
79a45b7d 50#include "valprint.h"
3ee1c036 51#include "inferior.h"
07e059b5 52#include "osdata.h"
dc146f7c 53#include "splay-tree.h"
f224b49d 54#include "tracepoint.h"
75082e8c 55#include "ada-lang.h"
f8eba3c6 56#include "linespec.h"
36dc181b 57
fb40c209
AC
58#include <ctype.h>
59#include <sys/time.h>
60
d8c83789
NR
61#if defined HAVE_SYS_RESOURCE_H
62#include <sys/resource.h>
63#endif
64
65#ifdef HAVE_GETRUSAGE
66struct rusage rusage;
67#endif
68
fb40c209
AC
69enum
70 {
71 FROM_TTY = 0
72 };
73
fb40c209
AC
74int mi_debug_p;
75struct ui_file *raw_stdout;
76
d8c83789
NR
77/* This is used to pass the current command timestamp
78 down to continuation routines. */
79static struct mi_timestamp *current_command_ts;
80
81static int do_timings = 0;
82
a2840c35 83char *current_token;
a79b8f6e
VP
84/* Few commands would like to know if options like --thread-group
85 were explicitly specified. This variable keeps the current
86 parsed command including all option, and make it possible. */
87static struct mi_parse *current_context;
88
a2840c35 89int running_result_record_printed = 1;
fb40c209 90
f3b1572e
PA
91/* Flag indicating that the target has proceeded since the last
92 command was issued. */
93int mi_proceeded;
94
fb40c209 95extern void _initialize_mi_main (void);
ce8f13f8 96static void mi_cmd_execute (struct mi_parse *parse);
fb40c209 97
b2af646b
AC
98static void mi_execute_cli_command (const char *cmd, int args_p,
99 const char *args);
ce8f13f8 100static void mi_execute_async_cli_command (char *cli_command,
9a2b4c1b 101 char **argv, int argc);
6ed7ea50
UW
102static int register_changed_p (int regnum, struct regcache *,
103 struct regcache *);
7ccb0be9 104static void get_register (struct frame_info *, int regnum, int format);
4389a95a 105
41296c92 106/* Command implementations. FIXME: Is this libgdb? No. This is the MI
fb40c209 107 layer that calls libgdb. Any operation used in the below should be
41296c92 108 formalized. */
fb40c209 109
d8c83789
NR
110static void timestamp (struct mi_timestamp *tv);
111
112static void print_diff_now (struct mi_timestamp *start);
113static void print_diff (struct mi_timestamp *start, struct mi_timestamp *end);
114
ce8f13f8 115void
fb40c209
AC
116mi_cmd_gdb_exit (char *command, char **argv, int argc)
117{
41296c92 118 /* We have to print everything right here because we never return. */
721c02de
VP
119 if (current_token)
120 fputs_unfiltered (current_token, raw_stdout);
fb40c209 121 fputs_unfiltered ("^exit\n", raw_stdout);
79a45e25 122 mi_out_put (current_uiout, raw_stdout);
a6b29f87 123 gdb_flush (raw_stdout);
41296c92 124 /* FIXME: The function called is not yet a formal libgdb function. */
fb40c209 125 quit_force (NULL, FROM_TTY);
fb40c209
AC
126}
127
ce8f13f8 128void
9e22b03a 129mi_cmd_exec_next (char *command, char **argv, int argc)
fb40c209 130{
41296c92 131 /* FIXME: Should call a libgdb function, not a cli wrapper. */
e5829bee
MS
132 if (argc > 0 && strcmp(argv[0], "--reverse") == 0)
133 mi_execute_async_cli_command ("reverse-next", argv + 1, argc - 1);
134 else
135 mi_execute_async_cli_command ("next", argv, argc);
fb40c209
AC
136}
137
ce8f13f8 138void
9e22b03a 139mi_cmd_exec_next_instruction (char *command, char **argv, int argc)
fb40c209 140{
41296c92 141 /* FIXME: Should call a libgdb function, not a cli wrapper. */
e5829bee
MS
142 if (argc > 0 && strcmp(argv[0], "--reverse") == 0)
143 mi_execute_async_cli_command ("reverse-nexti", argv + 1, argc - 1);
144 else
145 mi_execute_async_cli_command ("nexti", argv, argc);
fb40c209
AC
146}
147
ce8f13f8 148void
9e22b03a 149mi_cmd_exec_step (char *command, char **argv, int argc)
fb40c209 150{
41296c92 151 /* FIXME: Should call a libgdb function, not a cli wrapper. */
e5829bee
MS
152 if (argc > 0 && strcmp(argv[0], "--reverse") == 0)
153 mi_execute_async_cli_command ("reverse-step", argv + 1, argc - 1);
154 else
155 mi_execute_async_cli_command ("step", argv, argc);
fb40c209
AC
156}
157
ce8f13f8 158void
9e22b03a 159mi_cmd_exec_step_instruction (char *command, char **argv, int argc)
fb40c209 160{
41296c92 161 /* FIXME: Should call a libgdb function, not a cli wrapper. */
e5829bee
MS
162 if (argc > 0 && strcmp(argv[0], "--reverse") == 0)
163 mi_execute_async_cli_command ("reverse-stepi", argv + 1, argc - 1);
164 else
165 mi_execute_async_cli_command ("stepi", argv, argc);
fb40c209
AC
166}
167
ce8f13f8 168void
9e22b03a 169mi_cmd_exec_finish (char *command, char **argv, int argc)
fb40c209 170{
41296c92 171 /* FIXME: Should call a libgdb function, not a cli wrapper. */
e5829bee
MS
172 if (argc > 0 && strcmp(argv[0], "--reverse") == 0)
173 mi_execute_async_cli_command ("reverse-finish", argv + 1, argc - 1);
174 else
175 mi_execute_async_cli_command ("finish", argv, argc);
fb40c209
AC
176}
177
ce8f13f8 178void
9e22b03a 179mi_cmd_exec_return (char *command, char **argv, int argc)
fb40c209 180{
fb40c209
AC
181 /* This command doesn't really execute the target, it just pops the
182 specified number of frames. */
9e22b03a 183 if (argc)
fb40c209 184 /* Call return_command with from_tty argument equal to 0 so as to
41296c92 185 avoid being queried. */
9e22b03a 186 return_command (*argv, 0);
fb40c209
AC
187 else
188 /* Call return_command with from_tty argument equal to 0 so as to
41296c92 189 avoid being queried. */
36dc181b 190 return_command (NULL, 0);
fb40c209
AC
191
192 /* Because we have called return_command with from_tty = 0, we need
41296c92 193 to print the frame here. */
b04f3ab4 194 print_stack_frame (get_selected_frame (NULL), 1, LOC_AND_ADDRESS);
fb40c209
AC
195}
196
143260c9
VP
197void
198mi_cmd_exec_jump (char *args, char **argv, int argc)
199{
200 /* FIXME: Should call a libgdb function, not a cli wrapper. */
202b96c1 201 mi_execute_async_cli_command ("jump", argv, argc);
143260c9
VP
202}
203
a79b8f6e
VP
204static void
205proceed_thread (struct thread_info *thread, int pid)
8dd4f202 206{
8dd4f202 207 if (!is_stopped (thread->ptid))
a79b8f6e 208 return;
8dd4f202 209
a79b8f6e
VP
210 if (pid != 0 && PIDGET (thread->ptid) != pid)
211 return;
8dd4f202
VP
212
213 switch_to_thread (thread->ptid);
214 clear_proceed_status ();
215 proceed ((CORE_ADDR) -1, TARGET_SIGNAL_DEFAULT, 0);
a79b8f6e
VP
216}
217
218
219static int
220proceed_thread_callback (struct thread_info *thread, void *arg)
221{
222 int pid = *(int *)arg;
102040f0 223
a79b8f6e 224 proceed_thread (thread, pid);
8dd4f202
VP
225 return 0;
226}
227
e5829bee
MS
228static void
229exec_continue (char **argv, int argc)
fb40c209 230{
a79b8f6e 231 if (non_stop)
8dd4f202 232 {
a79b8f6e
VP
233 /* In non-stop mode, 'resume' always resumes a single thread. Therefore,
234 to resume all threads of the current inferior, or all threads in all
235 inferiors, we need to iterate over threads.
236
237 See comment on infcmd.c:proceed_thread_callback for rationale. */
238 if (current_context->all || current_context->thread_group != -1)
239 {
240 int pid = 0;
241 struct cleanup *back_to = make_cleanup_restore_current_thread ();
8dd4f202 242
a79b8f6e
VP
243 if (!current_context->all)
244 {
9a2b4c1b
MS
245 struct inferior *inf
246 = find_inferior_id (current_context->thread_group);
247
a79b8f6e
VP
248 pid = inf->pid;
249 }
250 iterate_over_threads (proceed_thread_callback, &pid);
251 do_cleanups (back_to);
252 }
253 else
254 {
255 continue_1 (0);
256 }
8dd4f202 257 }
77ebaa5a 258 else
a79b8f6e
VP
259 {
260 struct cleanup *back_to = make_cleanup_restore_integer (&sched_multi);
102040f0 261
a79b8f6e
VP
262 if (current_context->all)
263 {
264 sched_multi = 1;
265 continue_1 (0);
266 }
267 else
268 {
269 /* In all-stop mode, -exec-continue traditionally resumed either
270 all threads, or one thread, depending on the 'scheduler-locking'
271 variable. Let's continue to do the same. */
272 continue_1 (1);
273 }
274 do_cleanups (back_to);
275 }
e5829bee
MS
276}
277
e5829bee 278static void
a79b8f6e 279exec_direction_forward (void *notused)
e5829bee 280{
e5829bee
MS
281 execution_direction = EXEC_FORWARD;
282}
283
284static void
285exec_reverse_continue (char **argv, int argc)
286{
287 enum exec_direction_kind dir = execution_direction;
288 struct cleanup *old_chain;
289
e5829bee
MS
290 if (dir == EXEC_REVERSE)
291 error (_("Already in reverse mode."));
292
293 if (!target_can_execute_reverse)
294 error (_("Target %s does not support this command."), target_shortname);
295
a79b8f6e 296 old_chain = make_cleanup (exec_direction_forward, NULL);
e5829bee
MS
297 execution_direction = EXEC_REVERSE;
298 exec_continue (argv, argc);
299 do_cleanups (old_chain);
300}
301
302void
303mi_cmd_exec_continue (char *command, char **argv, int argc)
304{
a79b8f6e 305 if (argc > 0 && strcmp (argv[0], "--reverse") == 0)
e5829bee
MS
306 exec_reverse_continue (argv + 1, argc - 1);
307 else
308 exec_continue (argv, argc);
8dd4f202
VP
309}
310
311static int
312interrupt_thread_callback (struct thread_info *thread, void *arg)
313{
314 int pid = *(int *)arg;
315
316 if (!is_running (thread->ptid))
317 return 0;
318
319 if (PIDGET (thread->ptid) != pid)
320 return 0;
321
322 target_stop (thread->ptid);
323 return 0;
fb40c209
AC
324}
325
41296c92 326/* Interrupt the execution of the target. Note how we must play around
d8c83789 327 with the token variables, in order to display the current token in
fb40c209 328 the result of the interrupt command, and the previous execution
41296c92
NR
329 token when the target finally stops. See comments in
330 mi_cmd_execute. */
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
dc146f7c
VP
613/* Output a field named 'cores' with a list as the value. The elements of
614 the list are obtained by splitting 'cores' on comma. */
615
616static void
617output_cores (struct ui_out *uiout, const char *field_name, const char *xcores)
3ee1c036 618{
dc146f7c
VP
619 struct cleanup *back_to = make_cleanup_ui_out_list_begin_end (uiout,
620 field_name);
621 char *cores = xstrdup (xcores);
622 char *p = cores;
3ee1c036 623
dc146f7c 624 make_cleanup (xfree, cores);
3ee1c036 625
dc146f7c
VP
626 for (p = strtok (p, ","); p; p = strtok (NULL, ","))
627 ui_out_field_string (uiout, NULL, p);
3ee1c036 628
dc146f7c
VP
629 do_cleanups (back_to);
630}
3ee1c036 631
dc146f7c
VP
632static void
633free_vector_of_ints (void *xvector)
634{
635 VEC (int) **vector = xvector;
102040f0 636
dc146f7c
VP
637 VEC_free (int, *vector);
638}
639
640static void
641do_nothing (splay_tree_key k)
642{
643}
07e059b5 644
dc146f7c
VP
645static void
646free_vector_of_osdata_items (splay_tree_value xvalue)
647{
648 VEC (osdata_item_s) *value = (VEC (osdata_item_s) *) xvalue;
102040f0 649
dc146f7c
VP
650 /* We don't free the items itself, it will be done separately. */
651 VEC_free (osdata_item_s, value);
652}
e0665bc8 653
dc146f7c
VP
654static int
655splay_tree_int_comparator (splay_tree_key xa, splay_tree_key xb)
656{
657 int a = xa;
658 int b = xb;
102040f0 659
dc146f7c
VP
660 return a - b;
661}
662
663static void
664free_splay_tree (void *xt)
665{
666 splay_tree t = xt;
667 splay_tree_delete (t);
668}
669
670static void
671list_available_thread_groups (VEC (int) *ids, int recurse)
672{
673 struct osdata *data;
674 struct osdata_item *item;
675 int ix_items;
79a45e25 676 struct ui_out *uiout = current_uiout;
102040f0 677
dc146f7c 678 /* This keeps a map from integer (pid) to VEC (struct osdata_item *)*
8eee9c5a
DE
679 The vector contains information about all threads for the given pid.
680 This is assigned an initial value to avoid "may be used uninitialized"
681 warning from gcc. */
682 splay_tree tree = NULL;
dc146f7c
VP
683
684 /* get_osdata will throw if it cannot return data. */
685 data = get_osdata ("processes");
686 make_cleanup_osdata_free (data);
687
688 if (recurse)
689 {
690 struct osdata *threads = get_osdata ("threads");
dc146f7c 691
102040f0 692 make_cleanup_osdata_free (threads);
dc146f7c
VP
693 tree = splay_tree_new (splay_tree_int_comparator,
694 do_nothing,
695 free_vector_of_osdata_items);
696 make_cleanup (free_splay_tree, tree);
e0665bc8 697
07e059b5 698 for (ix_items = 0;
dc146f7c 699 VEC_iterate (osdata_item_s, threads->items,
e0665bc8 700 ix_items, item);
07e059b5
VP
701 ix_items++)
702 {
07e059b5 703 const char *pid = get_osdata_column (item, "pid");
dc146f7c
VP
704 int pid_i = strtoul (pid, NULL, 0);
705 VEC (osdata_item_s) *vec = 0;
706
707 splay_tree_node n = splay_tree_lookup (tree, pid_i);
708 if (!n)
709 {
710 VEC_safe_push (osdata_item_s, vec, item);
711 splay_tree_insert (tree, pid_i, (splay_tree_value)vec);
712 }
713 else
714 {
715 vec = (VEC (osdata_item_s) *) n->value;
716 VEC_safe_push (osdata_item_s, vec, item);
717 n->value = (splay_tree_value) vec;
718 }
719 }
720 }
721
722 make_cleanup_ui_out_list_begin_end (uiout, "groups");
07e059b5 723
dc146f7c
VP
724 for (ix_items = 0;
725 VEC_iterate (osdata_item_s, data->items,
726 ix_items, item);
727 ix_items++)
728 {
729 struct cleanup *back_to;
e0665bc8 730
dc146f7c
VP
731 const char *pid = get_osdata_column (item, "pid");
732 const char *cmd = get_osdata_column (item, "command");
733 const char *user = get_osdata_column (item, "user");
734 const char *cores = get_osdata_column (item, "cores");
735
736 int pid_i = strtoul (pid, NULL, 0);
737
738 /* At present, the target will return all available processes
739 and if information about specific ones was required, we filter
740 undesired processes here. */
741 if (ids && bsearch (&pid_i, VEC_address (int, ids),
742 VEC_length (int, ids),
743 sizeof (int), compare_positive_ints) == NULL)
744 continue;
745
746
747 back_to = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
748
749 ui_out_field_fmt (uiout, "id", "%s", pid);
750 ui_out_field_string (uiout, "type", "process");
751 if (cmd)
752 ui_out_field_string (uiout, "description", cmd);
753 if (user)
754 ui_out_field_string (uiout, "user", user);
755 if (cores)
756 output_cores (uiout, "cores", cores);
757
758 if (recurse)
759 {
760 splay_tree_node n = splay_tree_lookup (tree, pid_i);
761 if (n)
762 {
763 VEC (osdata_item_s) *children = (VEC (osdata_item_s) *) n->value;
764 struct osdata_item *child;
765 int ix_child;
766
767 make_cleanup_ui_out_list_begin_end (uiout, "threads");
768
769 for (ix_child = 0;
770 VEC_iterate (osdata_item_s, children, ix_child, child);
771 ++ix_child)
772 {
773 struct cleanup *back_to_2 =
774 make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
dc146f7c
VP
775 const char *tid = get_osdata_column (child, "tid");
776 const char *tcore = get_osdata_column (child, "core");
102040f0 777
dc146f7c
VP
778 ui_out_field_string (uiout, "id", tid);
779 if (tcore)
780 ui_out_field_string (uiout, "core", tcore);
781
782 do_cleanups (back_to_2);
783 }
784 }
07e059b5 785 }
dc146f7c
VP
786
787 do_cleanups (back_to);
07e059b5 788 }
dc146f7c
VP
789}
790
791void
792mi_cmd_list_thread_groups (char *command, char **argv, int argc)
793{
79a45e25 794 struct ui_out *uiout = current_uiout;
dc146f7c
VP
795 struct cleanup *back_to;
796 int available = 0;
797 int recurse = 0;
798 VEC (int) *ids = 0;
799
800 enum opt
801 {
802 AVAILABLE_OPT, RECURSE_OPT
803 };
91174723 804 static const struct mi_opt opts[] =
dc146f7c
VP
805 {
806 {"-available", AVAILABLE_OPT, 0},
807 {"-recurse", RECURSE_OPT, 1},
808 { 0, 0, 0 }
809 };
810
811 int optind = 0;
812 char *optarg;
813
814 while (1)
815 {
816 int opt = mi_getopt ("-list-thread-groups", argc, argv, opts,
817 &optind, &optarg);
102040f0 818
dc146f7c
VP
819 if (opt < 0)
820 break;
821 switch ((enum opt) opt)
822 {
823 case AVAILABLE_OPT:
824 available = 1;
825 break;
826 case RECURSE_OPT:
827 if (strcmp (optarg, "0") == 0)
828 ;
829 else if (strcmp (optarg, "1") == 0)
830 recurse = 1;
831 else
7ea6d463
PM
832 error (_("only '0' and '1' are valid values "
833 "for the '--recurse' option"));
dc146f7c
VP
834 break;
835 }
836 }
837
838 for (; optind < argc; ++optind)
839 {
840 char *end;
2f296114
VP
841 int inf;
842
843 if (*(argv[optind]) != 'i')
7ea6d463 844 error (_("invalid syntax of group id '%s'"), argv[optind]);
2f296114
VP
845
846 inf = strtoul (argv[optind] + 1, &end, 0);
102040f0 847
dc146f7c 848 if (*end != '\0')
7ea6d463 849 error (_("invalid syntax of group id '%s'"), argv[optind]);
dc146f7c
VP
850 VEC_safe_push (int, ids, inf);
851 }
852 if (VEC_length (int, ids) > 1)
853 qsort (VEC_address (int, ids),
854 VEC_length (int, ids),
855 sizeof (int), compare_positive_ints);
856
857 back_to = make_cleanup (free_vector_of_ints, &ids);
858
859 if (available)
860 {
861 list_available_thread_groups (ids, recurse);
862 }
863 else if (VEC_length (int, ids) == 1)
3ee1c036 864 {
dc146f7c 865 /* Local thread groups, single id. */
2f296114
VP
866 int id = *VEC_address (int, ids);
867 struct inferior *inf = find_inferior_id (id);
102040f0 868
2f296114 869 if (!inf)
7ea6d463 870 error (_("Non-existent thread group id '%d'"), id);
2f296114 871
aea5b279 872 print_thread_info (uiout, NULL, inf->pid);
3ee1c036
VP
873 }
874 else
875 {
dc146f7c 876 struct print_one_inferior_data data;
102040f0 877
dc146f7c
VP
878 data.recurse = recurse;
879 data.inferiors = ids;
880
881 /* Local thread groups. Either no explicit ids -- and we
882 print everything, or several explicit ids. In both cases,
883 we print more than one group, and have to use 'groups'
884 as the top-level element. */
3ee1c036 885 make_cleanup_ui_out_list_begin_end (uiout, "groups");
dc146f7c
VP
886 update_thread_list ();
887 iterate_over_inferiors (print_one_inferior, &data);
3ee1c036 888 }
dc146f7c 889
3ee1c036 890 do_cleanups (back_to);
8e8901c5
VP
891}
892
ce8f13f8 893void
fb40c209
AC
894mi_cmd_data_list_register_names (char *command, char **argv, int argc)
895{
7ccb0be9 896 struct gdbarch *gdbarch;
79a45e25 897 struct ui_out *uiout = current_uiout;
fb40c209
AC
898 int regnum, numregs;
899 int i;
4060713b 900 struct cleanup *cleanup;
fb40c209
AC
901
902 /* Note that the test for a valid register must include checking the
c9f4d572
UW
903 gdbarch_register_name because gdbarch_num_regs may be allocated for
904 the union of the register sets within a family of related processors.
905 In this case, some entries of gdbarch_register_name will change depending
906 upon the particular processor being debugged. */
fb40c209 907
441b986a 908 gdbarch = get_current_arch ();
7ccb0be9 909 numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
fb40c209 910
4060713b 911 cleanup = make_cleanup_ui_out_list_begin_end (uiout, "register-names");
fb40c209 912
41296c92 913 if (argc == 0) /* No args, just do all the regs. */
fb40c209
AC
914 {
915 for (regnum = 0;
916 regnum < numregs;
917 regnum++)
918 {
7ccb0be9
UW
919 if (gdbarch_register_name (gdbarch, regnum) == NULL
920 || *(gdbarch_register_name (gdbarch, regnum)) == '\0')
173d6894
AC
921 ui_out_field_string (uiout, NULL, "");
922 else
c9f4d572 923 ui_out_field_string (uiout, NULL,
7ccb0be9 924 gdbarch_register_name (gdbarch, regnum));
fb40c209
AC
925 }
926 }
927
41296c92 928 /* Else, list of register #s, just do listed regs. */
fb40c209
AC
929 for (i = 0; i < argc; i++)
930 {
931 regnum = atoi (argv[i]);
173d6894 932 if (regnum < 0 || regnum >= numregs)
7ea6d463 933 error (_("bad register number"));
a13e061a 934
7ccb0be9
UW
935 if (gdbarch_register_name (gdbarch, regnum) == NULL
936 || *(gdbarch_register_name (gdbarch, regnum)) == '\0')
173d6894
AC
937 ui_out_field_string (uiout, NULL, "");
938 else
c9f4d572 939 ui_out_field_string (uiout, NULL,
7ccb0be9 940 gdbarch_register_name (gdbarch, regnum));
fb40c209 941 }
4060713b 942 do_cleanups (cleanup);
fb40c209
AC
943}
944
ce8f13f8 945void
fb40c209
AC
946mi_cmd_data_list_changed_registers (char *command, char **argv, int argc)
947{
6ed7ea50 948 static struct regcache *this_regs = NULL;
79a45e25 949 struct ui_out *uiout = current_uiout;
6ed7ea50 950 struct regcache *prev_regs;
7ccb0be9 951 struct gdbarch *gdbarch;
fb40c209
AC
952 int regnum, numregs, changed;
953 int i;
4060713b 954 struct cleanup *cleanup;
fb40c209 955
6ed7ea50
UW
956 /* The last time we visited this function, the current frame's register
957 contents were saved in THIS_REGS. Move THIS_REGS over to PREV_REGS,
958 and refresh THIS_REGS with the now-current register contents. */
959
960 prev_regs = this_regs;
961 this_regs = frame_save_as_regcache (get_selected_frame (NULL));
962 cleanup = make_cleanup_regcache_xfree (prev_regs);
963
fb40c209 964 /* Note that the test for a valid register must include checking the
c9f4d572
UW
965 gdbarch_register_name because gdbarch_num_regs may be allocated for
966 the union of the register sets within a family of related processors.
967 In this case, some entries of gdbarch_register_name will change depending
968 upon the particular processor being debugged. */
fb40c209 969
7ccb0be9
UW
970 gdbarch = get_regcache_arch (this_regs);
971 numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
fb40c209 972
6ed7ea50 973 make_cleanup_ui_out_list_begin_end (uiout, "changed-registers");
fb40c209 974
41296c92 975 if (argc == 0) /* No args, just do all the regs. */
fb40c209
AC
976 {
977 for (regnum = 0;
978 regnum < numregs;
979 regnum++)
980 {
7ccb0be9
UW
981 if (gdbarch_register_name (gdbarch, regnum) == NULL
982 || *(gdbarch_register_name (gdbarch, regnum)) == '\0')
fb40c209 983 continue;
6ed7ea50 984 changed = register_changed_p (regnum, prev_regs, this_regs);
fb40c209 985 if (changed < 0)
7ea6d463
PM
986 error (_("-data-list-changed-registers: "
987 "Unable to read register contents."));
fb40c209
AC
988 else if (changed)
989 ui_out_field_int (uiout, NULL, regnum);
990 }
991 }
992
41296c92 993 /* Else, list of register #s, just do listed regs. */
fb40c209
AC
994 for (i = 0; i < argc; i++)
995 {
996 regnum = atoi (argv[i]);
997
998 if (regnum >= 0
999 && regnum < numregs
7ccb0be9
UW
1000 && gdbarch_register_name (gdbarch, regnum) != NULL
1001 && *gdbarch_register_name (gdbarch, regnum) != '\000')
fb40c209 1002 {
6ed7ea50 1003 changed = register_changed_p (regnum, prev_regs, this_regs);
fb40c209 1004 if (changed < 0)
7ea6d463
PM
1005 error (_("-data-list-changed-registers: "
1006 "Unable to read register contents."));
fb40c209
AC
1007 else if (changed)
1008 ui_out_field_int (uiout, NULL, regnum);
1009 }
1010 else
7ea6d463 1011 error (_("bad register number"));
fb40c209 1012 }
4060713b 1013 do_cleanups (cleanup);
fb40c209
AC
1014}
1015
1016static int
6ed7ea50
UW
1017register_changed_p (int regnum, struct regcache *prev_regs,
1018 struct regcache *this_regs)
fb40c209 1019{
6ed7ea50
UW
1020 struct gdbarch *gdbarch = get_regcache_arch (this_regs);
1021 gdb_byte prev_buffer[MAX_REGISTER_SIZE];
1022 gdb_byte this_buffer[MAX_REGISTER_SIZE];
e69aa73e
PA
1023 enum register_status prev_status;
1024 enum register_status this_status;
fb40c209 1025
e69aa73e
PA
1026 /* First time through or after gdbarch change consider all registers
1027 as changed. */
1028 if (!prev_regs || get_regcache_arch (prev_regs) != gdbarch)
6ed7ea50 1029 return 1;
fb40c209 1030
6ed7ea50 1031 /* Get register contents and compare. */
e69aa73e
PA
1032 prev_status = regcache_cooked_read (prev_regs, regnum, prev_buffer);
1033 this_status = regcache_cooked_read (this_regs, regnum, this_buffer);
fb40c209 1034
e69aa73e
PA
1035 if (this_status != prev_status)
1036 return 1;
1037 else if (this_status == REG_VALID)
1038 return memcmp (prev_buffer, this_buffer,
1039 register_size (gdbarch, regnum)) != 0;
1040 else
1041 return 0;
fb40c209
AC
1042}
1043
41296c92 1044/* Return a list of register number and value pairs. The valid
fb40c209 1045 arguments expected are: a letter indicating the format in which to
41296c92 1046 display the registers contents. This can be one of: x (hexadecimal), d
fb40c209
AC
1047 (decimal), N (natural), t (binary), o (octal), r (raw). After the
1048 format argumetn there can be a sequence of numbers, indicating which
41296c92
NR
1049 registers to fetch the content of. If the format is the only argument,
1050 a list of all the registers with their values is returned. */
ce8f13f8 1051void
fb40c209
AC
1052mi_cmd_data_list_register_values (char *command, char **argv, int argc)
1053{
79a45e25 1054 struct ui_out *uiout = current_uiout;
7ccb0be9
UW
1055 struct frame_info *frame;
1056 struct gdbarch *gdbarch;
a13e061a 1057 int regnum, numregs, format;
fb40c209 1058 int i;
4060713b 1059 struct cleanup *list_cleanup, *tuple_cleanup;
fb40c209
AC
1060
1061 /* Note that the test for a valid register must include checking the
c9f4d572
UW
1062 gdbarch_register_name because gdbarch_num_regs may be allocated for
1063 the union of the register sets within a family of related processors.
1064 In this case, some entries of gdbarch_register_name will change depending
1065 upon the particular processor being debugged. */
fb40c209 1066
fb40c209 1067 if (argc == 0)
7ea6d463
PM
1068 error (_("-data-list-register-values: Usage: "
1069 "-data-list-register-values <format> [<regnum1>...<regnumN>]"));
fb40c209
AC
1070
1071 format = (int) argv[0][0];
1072
7ccb0be9
UW
1073 frame = get_selected_frame (NULL);
1074 gdbarch = get_frame_arch (frame);
1075 numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
1076
4060713b 1077 list_cleanup = make_cleanup_ui_out_list_begin_end (uiout, "register-values");
fb40c209 1078
41296c92 1079 if (argc == 1) /* No args, beside the format: do all the regs. */
fb40c209
AC
1080 {
1081 for (regnum = 0;
1082 regnum < numregs;
1083 regnum++)
1084 {
7ccb0be9
UW
1085 if (gdbarch_register_name (gdbarch, regnum) == NULL
1086 || *(gdbarch_register_name (gdbarch, regnum)) == '\0')
fb40c209 1087 continue;
4060713b 1088 tuple_cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
fb40c209 1089 ui_out_field_int (uiout, "number", regnum);
7ccb0be9 1090 get_register (frame, regnum, format);
4060713b 1091 do_cleanups (tuple_cleanup);
fb40c209
AC
1092 }
1093 }
1094
41296c92 1095 /* Else, list of register #s, just do listed regs. */
fb40c209
AC
1096 for (i = 1; i < argc; i++)
1097 {
1098 regnum = atoi (argv[i]);
1099
1100 if (regnum >= 0
1101 && regnum < numregs
7ccb0be9
UW
1102 && gdbarch_register_name (gdbarch, regnum) != NULL
1103 && *gdbarch_register_name (gdbarch, regnum) != '\000')
fb40c209 1104 {
4060713b 1105 tuple_cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
fb40c209 1106 ui_out_field_int (uiout, "number", regnum);
7ccb0be9 1107 get_register (frame, regnum, format);
4060713b 1108 do_cleanups (tuple_cleanup);
fb40c209
AC
1109 }
1110 else
7ea6d463 1111 error (_("bad register number"));
fb40c209 1112 }
4060713b 1113 do_cleanups (list_cleanup);
fb40c209
AC
1114}
1115
41296c92 1116/* Output one register's contents in the desired format. */
a13e061a 1117static void
7ccb0be9 1118get_register (struct frame_info *frame, int regnum, int format)
fb40c209 1119{
7ccb0be9 1120 struct gdbarch *gdbarch = get_frame_arch (frame);
79a45e25 1121 struct ui_out *uiout = current_uiout;
ac2adee5
AC
1122 CORE_ADDR addr;
1123 enum lval_type lval;
cb0fd152 1124 struct ui_stream *stb;
20622269 1125 struct value *val;
fb40c209
AC
1126
1127 stb = ui_out_stream_new (uiout);
1128
1129 if (format == 'N')
1130 format = 0;
1131
20622269 1132 val = get_frame_register_value (frame, regnum);
ac2adee5 1133
20622269 1134 if (value_optimized_out (val))
7ea6d463 1135 error (_("Optimized out"));
fb40c209 1136
fb40c209
AC
1137 if (format == 'r')
1138 {
1139 int j;
1140 char *ptr, buf[1024];
20622269 1141 const gdb_byte *valaddr = value_contents_for_printing (val);
fb40c209
AC
1142
1143 strcpy (buf, "0x");
1144 ptr = buf + 2;
7ccb0be9 1145 for (j = 0; j < register_size (gdbarch, regnum); j++)
fb40c209 1146 {
7ccb0be9
UW
1147 int idx = gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG ?
1148 j : register_size (gdbarch, regnum) - 1 - j;
102040f0 1149
20622269 1150 sprintf (ptr, "%02x", (unsigned char) valaddr[idx]);
fb40c209
AC
1151 ptr += 2;
1152 }
1153 ui_out_field_string (uiout, "value", buf);
1154 /*fputs_filtered (buf, gdb_stdout); */
1155 }
1156 else
1157 {
79a45b7d 1158 struct value_print_options opts;
102040f0 1159
59669435 1160 get_formatted_print_options (&opts, format);
79a45b7d 1161 opts.deref_ref = 1;
20622269
PA
1162 val_print (value_type (val),
1163 value_contents_for_printing (val),
1164 value_embedded_offset (val), 0,
1165 stb->stream, 0, val, &opts, current_language);
fb40c209
AC
1166 ui_out_field_stream (uiout, "value", stb);
1167 ui_out_stream_delete (stb);
1168 }
fb40c209
AC
1169}
1170
24e8cecf 1171/* Write given values into registers. The registers and values are
41296c92 1172 given as pairs. The corresponding MI command is
9a2b4c1b
MS
1173 -data-write-register-values <format>
1174 [<regnum1> <value1>...<regnumN> <valueN>] */
ce8f13f8 1175void
24e8cecf
EZ
1176mi_cmd_data_write_register_values (char *command, char **argv, int argc)
1177{
7ccb0be9
UW
1178 struct regcache *regcache;
1179 struct gdbarch *gdbarch;
9f3a1602 1180 int numregs, i;
24e8cecf
EZ
1181 char format;
1182
1183 /* Note that the test for a valid register must include checking the
c9f4d572
UW
1184 gdbarch_register_name because gdbarch_num_regs may be allocated for
1185 the union of the register sets within a family of related processors.
1186 In this case, some entries of gdbarch_register_name will change depending
1187 upon the particular processor being debugged. */
24e8cecf 1188
7ccb0be9
UW
1189 regcache = get_current_regcache ();
1190 gdbarch = get_regcache_arch (regcache);
1191 numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
24e8cecf
EZ
1192
1193 if (argc == 0)
7ea6d463
PM
1194 error (_("-data-write-register-values: Usage: -data-write-register-"
1195 "values <format> [<regnum1> <value1>...<regnumN> <valueN>]"));
24e8cecf
EZ
1196
1197 format = (int) argv[0][0];
1198
1199 if (!target_has_registers)
7ea6d463 1200 error (_("-data-write-register-values: No registers."));
24e8cecf
EZ
1201
1202 if (!(argc - 1))
7ea6d463 1203 error (_("-data-write-register-values: No regs and values specified."));
24e8cecf
EZ
1204
1205 if ((argc - 1) % 2)
7ea6d463
PM
1206 error (_("-data-write-register-values: "
1207 "Regs and vals are not in pairs."));
24e8cecf
EZ
1208
1209 for (i = 1; i < argc; i = i + 2)
1210 {
9f3a1602 1211 int regnum = atoi (argv[i]);
24e8cecf 1212
9f3a1602 1213 if (regnum >= 0 && regnum < numregs
7ccb0be9
UW
1214 && gdbarch_register_name (gdbarch, regnum)
1215 && *gdbarch_register_name (gdbarch, regnum))
24e8cecf 1216 {
9f3a1602 1217 LONGEST value;
d8bf3afa 1218
9f3a1602 1219 /* Get the value as a number. */
24e8cecf 1220 value = parse_and_eval_address (argv[i + 1]);
9f3a1602 1221
41296c92 1222 /* Write it down. */
7ccb0be9 1223 regcache_cooked_write_signed (regcache, regnum, value);
24e8cecf
EZ
1224 }
1225 else
7ea6d463 1226 error (_("bad register number"));
24e8cecf 1227 }
24e8cecf
EZ
1228}
1229
41296c92 1230/* Evaluate the value of the argument. The argument is an
fb40c209 1231 expression. If the expression contains spaces it needs to be
41296c92 1232 included in double quotes. */
ce8f13f8 1233void
fb40c209
AC
1234mi_cmd_data_evaluate_expression (char *command, char **argv, int argc)
1235{
1236 struct expression *expr;
1237 struct cleanup *old_chain = NULL;
96052a95 1238 struct value *val;
fb40c209 1239 struct ui_stream *stb = NULL;
79a45b7d 1240 struct value_print_options opts;
79a45e25 1241 struct ui_out *uiout = current_uiout;
fb40c209
AC
1242
1243 stb = ui_out_stream_new (uiout);
1244
1245 if (argc != 1)
1246 {
412bbd6c 1247 ui_out_stream_delete (stb);
7ea6d463
PM
1248 error (_("-data-evaluate-expression: "
1249 "Usage: -data-evaluate-expression expression"));
fb40c209
AC
1250 }
1251
1252 expr = parse_expression (argv[0]);
1253
47cf603e 1254 old_chain = make_cleanup (free_current_contents, &expr);
fb40c209
AC
1255
1256 val = evaluate_expression (expr);
1257
41296c92 1258 /* Print the result of the expression evaluation. */
79a45b7d
TT
1259 get_user_print_options (&opts);
1260 opts.deref_ref = 0;
0e03807e 1261 common_val_print (val, stb->stream, 0, &opts, current_language);
fb40c209
AC
1262
1263 ui_out_field_stream (uiout, "value", stb);
1264 ui_out_stream_delete (stb);
1265
1266 do_cleanups (old_chain);
fb40c209
AC
1267}
1268
fb40c209
AC
1269/* DATA-MEMORY-READ:
1270
1271 ADDR: start address of data to be dumped.
41296c92 1272 WORD-FORMAT: a char indicating format for the ``word''. See
fb40c209 1273 the ``x'' command.
41296c92 1274 WORD-SIZE: size of each ``word''; 1,2,4, or 8 bytes.
fb40c209
AC
1275 NR_ROW: Number of rows.
1276 NR_COL: The number of colums (words per row).
1277 ASCHAR: (OPTIONAL) Append an ascii character dump to each row. Use
1278 ASCHAR for unprintable characters.
1279
1280 Reads SIZE*NR_ROW*NR_COL bytes starting at ADDR from memory and
1281 displayes them. Returns:
1282
1283 {addr="...",rowN={wordN="..." ,... [,ascii="..."]}, ...}
1284
1285 Returns:
1286 The number of bytes read is SIZE*ROW*COL. */
1287
ce8f13f8 1288void
fb40c209
AC
1289mi_cmd_data_read_memory (char *command, char **argv, int argc)
1290{
e17c207e 1291 struct gdbarch *gdbarch = get_current_arch ();
79a45e25 1292 struct ui_out *uiout = current_uiout;
fb40c209
AC
1293 struct cleanup *cleanups = make_cleanup (null_cleanup, NULL);
1294 CORE_ADDR addr;
1295 long total_bytes;
1296 long nr_cols;
1297 long nr_rows;
1298 char word_format;
1299 struct type *word_type;
1300 long word_size;
1301 char word_asize;
1302 char aschar;
508416a1 1303 gdb_byte *mbuf;
fb40c209
AC
1304 int nr_bytes;
1305 long offset = 0;
1306 int optind = 0;
1307 char *optarg;
1308 enum opt
1309 {
1310 OFFSET_OPT
1311 };
91174723 1312 static const struct mi_opt opts[] =
fb40c209
AC
1313 {
1314 {"o", OFFSET_OPT, 1},
d5d6fca5 1315 { 0, 0, 0 }
fb40c209
AC
1316 };
1317
1318 while (1)
1319 {
1b05df00 1320 int opt = mi_getopt ("-data-read-memory", argc, argv, opts,
fb40c209 1321 &optind, &optarg);
102040f0 1322
fb40c209
AC
1323 if (opt < 0)
1324 break;
1325 switch ((enum opt) opt)
1326 {
1327 case OFFSET_OPT:
1328 offset = atol (optarg);
1329 break;
1330 }
1331 }
1332 argv += optind;
1333 argc -= optind;
1334
1335 if (argc < 5 || argc > 6)
7ea6d463
PM
1336 error (_("-data-read-memory: Usage: "
1337 "ADDR WORD-FORMAT WORD-SIZE NR-ROWS NR-COLS [ASCHAR]."));
fb40c209
AC
1338
1339 /* Extract all the arguments. */
1340
41296c92 1341 /* Start address of the memory dump. */
fb40c209 1342 addr = parse_and_eval_address (argv[0]) + offset;
41296c92 1343 /* The format character to use when displaying a memory word. See
fb40c209
AC
1344 the ``x'' command. */
1345 word_format = argv[1][0];
41296c92 1346 /* The size of the memory word. */
fb40c209
AC
1347 word_size = atol (argv[2]);
1348 switch (word_size)
1349 {
1350 case 1:
df4df182 1351 word_type = builtin_type (gdbarch)->builtin_int8;
fb40c209
AC
1352 word_asize = 'b';
1353 break;
1354 case 2:
df4df182 1355 word_type = builtin_type (gdbarch)->builtin_int16;
fb40c209
AC
1356 word_asize = 'h';
1357 break;
1358 case 4:
df4df182 1359 word_type = builtin_type (gdbarch)->builtin_int32;
fb40c209
AC
1360 word_asize = 'w';
1361 break;
1362 case 8:
df4df182 1363 word_type = builtin_type (gdbarch)->builtin_int64;
fb40c209
AC
1364 word_asize = 'g';
1365 break;
1366 default:
df4df182 1367 word_type = builtin_type (gdbarch)->builtin_int8;
fb40c209
AC
1368 word_asize = 'b';
1369 }
41296c92 1370 /* The number of rows. */
fb40c209
AC
1371 nr_rows = atol (argv[3]);
1372 if (nr_rows <= 0)
7ea6d463 1373 error (_("-data-read-memory: invalid number of rows."));
a13e061a 1374
41296c92 1375 /* Number of bytes per row. */
fb40c209
AC
1376 nr_cols = atol (argv[4]);
1377 if (nr_cols <= 0)
7ea6d463 1378 error (_("-data-read-memory: invalid number of columns."));
a13e061a 1379
41296c92 1380 /* The un-printable character when printing ascii. */
fb40c209
AC
1381 if (argc == 6)
1382 aschar = *argv[5];
1383 else
1384 aschar = 0;
1385
41296c92 1386 /* Create a buffer and read it in. */
fb40c209 1387 total_bytes = word_size * nr_rows * nr_cols;
2e94c453 1388 mbuf = xcalloc (total_bytes, 1);
b8c9b27d 1389 make_cleanup (xfree, mbuf);
cf7a04e8 1390
a4261689
PA
1391 /* Dispatch memory reads to the topmost target, not the flattened
1392 current_target. */
8dedea02
VP
1393 nr_bytes = target_read (current_target.beneath,
1394 TARGET_OBJECT_MEMORY, NULL, mbuf,
1395 addr, total_bytes);
cf7a04e8 1396 if (nr_bytes <= 0)
7ea6d463 1397 error (_("Unable to read memory."));
fb40c209 1398
41296c92 1399 /* Output the header information. */
5af949e3 1400 ui_out_field_core_addr (uiout, "addr", gdbarch, addr);
fb40c209
AC
1401 ui_out_field_int (uiout, "nr-bytes", nr_bytes);
1402 ui_out_field_int (uiout, "total-bytes", total_bytes);
5af949e3
UW
1403 ui_out_field_core_addr (uiout, "next-row",
1404 gdbarch, addr + word_size * nr_cols);
1405 ui_out_field_core_addr (uiout, "prev-row",
1406 gdbarch, addr - word_size * nr_cols);
1407 ui_out_field_core_addr (uiout, "next-page", gdbarch, addr + total_bytes);
1408 ui_out_field_core_addr (uiout, "prev-page", gdbarch, addr - total_bytes);
fb40c209 1409
41296c92 1410 /* Build the result as a two dimentional table. */
fb40c209
AC
1411 {
1412 struct ui_stream *stream = ui_out_stream_new (uiout);
6ad4a2cf 1413 struct cleanup *cleanup_list_memory;
fb40c209
AC
1414 int row;
1415 int row_byte;
102040f0 1416
6ad4a2cf 1417 cleanup_list_memory = make_cleanup_ui_out_list_begin_end (uiout, "memory");
fb40c209
AC
1418 for (row = 0, row_byte = 0;
1419 row < nr_rows;
1420 row++, row_byte += nr_cols * word_size)
1421 {
1422 int col;
1423 int col_byte;
6ad4a2cf
JJ
1424 struct cleanup *cleanup_tuple;
1425 struct cleanup *cleanup_list_data;
79a45b7d
TT
1426 struct value_print_options opts;
1427
6ad4a2cf 1428 cleanup_tuple = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
5af949e3 1429 ui_out_field_core_addr (uiout, "addr", gdbarch, addr + row_byte);
9a2b4c1b
MS
1430 /* ui_out_field_core_addr_symbolic (uiout, "saddr", addr +
1431 row_byte); */
6ad4a2cf 1432 cleanup_list_data = make_cleanup_ui_out_list_begin_end (uiout, "data");
79a45b7d 1433 get_formatted_print_options (&opts, word_format);
fb40c209
AC
1434 for (col = 0, col_byte = row_byte;
1435 col < nr_cols;
1436 col++, col_byte += word_size)
1437 {
1438 if (col_byte + word_size > nr_bytes)
1439 {
1440 ui_out_field_string (uiout, NULL, "N/A");
1441 }
1442 else
1443 {
1444 ui_file_rewind (stream->stream);
79a45b7d 1445 print_scalar_formatted (mbuf + col_byte, word_type, &opts,
fb40c209
AC
1446 word_asize, stream->stream);
1447 ui_out_field_stream (uiout, NULL, stream);
1448 }
1449 }
6ad4a2cf 1450 do_cleanups (cleanup_list_data);
fb40c209
AC
1451 if (aschar)
1452 {
1453 int byte;
102040f0 1454
fb40c209 1455 ui_file_rewind (stream->stream);
9a2b4c1b
MS
1456 for (byte = row_byte;
1457 byte < row_byte + word_size * nr_cols; byte++)
fb40c209
AC
1458 {
1459 if (byte >= nr_bytes)
1460 {
1461 fputc_unfiltered ('X', stream->stream);
1462 }
1463 else if (mbuf[byte] < 32 || mbuf[byte] > 126)
1464 {
1465 fputc_unfiltered (aschar, stream->stream);
1466 }
1467 else
1468 fputc_unfiltered (mbuf[byte], stream->stream);
1469 }
1470 ui_out_field_stream (uiout, "ascii", stream);
1471 }
6ad4a2cf 1472 do_cleanups (cleanup_tuple);
fb40c209
AC
1473 }
1474 ui_out_stream_delete (stream);
6ad4a2cf 1475 do_cleanups (cleanup_list_memory);
fb40c209
AC
1476 }
1477 do_cleanups (cleanups);
fb40c209
AC
1478}
1479
8dedea02
VP
1480void
1481mi_cmd_data_read_memory_bytes (char *command, char **argv, int argc)
1482{
1483 struct gdbarch *gdbarch = get_current_arch ();
79a45e25 1484 struct ui_out *uiout = current_uiout;
8dedea02
VP
1485 struct cleanup *cleanups;
1486 CORE_ADDR addr;
1487 LONGEST length;
1488 memory_read_result_s *read_result;
1489 int ix;
1490 VEC(memory_read_result_s) *result;
1491 long offset = 0;
1492 int optind = 0;
1493 char *optarg;
1494 enum opt
1495 {
1496 OFFSET_OPT
1497 };
91174723 1498 static const struct mi_opt opts[] =
8dedea02
VP
1499 {
1500 {"o", OFFSET_OPT, 1},
1501 { 0, 0, 0 }
1502 };
1503
1504 while (1)
1505 {
1b05df00 1506 int opt = mi_getopt ("-data-read-memory-bytes", argc, argv, opts,
8dedea02
VP
1507 &optind, &optarg);
1508 if (opt < 0)
1509 break;
1510 switch ((enum opt) opt)
1511 {
1512 case OFFSET_OPT:
1513 offset = atol (optarg);
1514 break;
1515 }
1516 }
1517 argv += optind;
1518 argc -= optind;
1519
1520 if (argc != 2)
7ea6d463 1521 error (_("Usage: [ -o OFFSET ] ADDR LENGTH."));
8dedea02
VP
1522
1523 addr = parse_and_eval_address (argv[0]) + offset;
1524 length = atol (argv[1]);
1525
1526 result = read_memory_robust (current_target.beneath, addr, length);
1527
1528 cleanups = make_cleanup (free_memory_read_result_vector, result);
1529
1530 if (VEC_length (memory_read_result_s, result) == 0)
7ea6d463 1531 error (_("Unable to read memory."));
8dedea02
VP
1532
1533 make_cleanup_ui_out_list_begin_end (uiout, "memory");
1534 for (ix = 0;
1535 VEC_iterate (memory_read_result_s, result, ix, read_result);
1536 ++ix)
1537 {
1538 struct cleanup *t = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
1539 char *data, *p;
1540 int i;
1541
1542 ui_out_field_core_addr (uiout, "begin", gdbarch, read_result->begin);
1543 ui_out_field_core_addr (uiout, "offset", gdbarch, read_result->begin
1544 - addr);
1545 ui_out_field_core_addr (uiout, "end", gdbarch, read_result->end);
1546
1547 data = xmalloc ((read_result->end - read_result->begin) * 2 + 1);
1548
1549 for (i = 0, p = data;
1550 i < (read_result->end - read_result->begin);
1551 ++i, p += 2)
1552 {
1553 sprintf (p, "%02x", read_result->data[i]);
1554 }
1555 ui_out_field_string (uiout, "contents", data);
1556 xfree (data);
1557 do_cleanups (t);
1558 }
1559 do_cleanups (cleanups);
1560}
1561
1562
fb40c209
AC
1563/* DATA-MEMORY-WRITE:
1564
177b42fe 1565 COLUMN_OFFSET: optional argument. Must be preceded by '-o'. The
fb40c209
AC
1566 offset from the beginning of the memory grid row where the cell to
1567 be written is.
1568 ADDR: start address of the row in the memory grid where the memory
41296c92 1569 cell is, if OFFSET_COLUMN is specified. Otherwise, the address of
fb40c209 1570 the location to write to.
41296c92 1571 FORMAT: a char indicating format for the ``word''. See
fb40c209
AC
1572 the ``x'' command.
1573 WORD_SIZE: size of each ``word''; 1,2,4, or 8 bytes
1574 VALUE: value to be written into the memory address.
1575
1576 Writes VALUE into ADDR + (COLUMN_OFFSET * WORD_SIZE).
1577
41296c92 1578 Prints nothing. */
ce8f13f8 1579void
fb40c209
AC
1580mi_cmd_data_write_memory (char *command, char **argv, int argc)
1581{
e17a4113
UW
1582 struct gdbarch *gdbarch = get_current_arch ();
1583 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
fb40c209
AC
1584 CORE_ADDR addr;
1585 char word_format;
1586 long word_size;
1587 /* FIXME: ezannoni 2000-02-17 LONGEST could possibly not be big
41296c92 1588 enough when using a compiler other than GCC. */
fb40c209 1589 LONGEST value;
d8bf3afa
KB
1590 void *buffer;
1591 struct cleanup *old_chain;
fb40c209
AC
1592 long offset = 0;
1593 int optind = 0;
1594 char *optarg;
1595 enum opt
1596 {
1597 OFFSET_OPT
1598 };
91174723 1599 static const struct mi_opt opts[] =
fb40c209
AC
1600 {
1601 {"o", OFFSET_OPT, 1},
d5d6fca5 1602 { 0, 0, 0 }
fb40c209
AC
1603 };
1604
1605 while (1)
1606 {
1b05df00 1607 int opt = mi_getopt ("-data-write-memory", argc, argv, opts,
fb40c209 1608 &optind, &optarg);
102040f0 1609
fb40c209
AC
1610 if (opt < 0)
1611 break;
1612 switch ((enum opt) opt)
1613 {
1614 case OFFSET_OPT:
1615 offset = atol (optarg);
1616 break;
1617 }
1618 }
1619 argv += optind;
1620 argc -= optind;
1621
1622 if (argc != 4)
7ea6d463
PM
1623 error (_("-data-write-memory: Usage: "
1624 "[-o COLUMN_OFFSET] ADDR FORMAT WORD-SIZE VALUE."));
fb40c209 1625
41296c92
NR
1626 /* Extract all the arguments. */
1627 /* Start address of the memory dump. */
fb40c209 1628 addr = parse_and_eval_address (argv[0]);
41296c92
NR
1629 /* The format character to use when displaying a memory word. See
1630 the ``x'' command. */
fb40c209
AC
1631 word_format = argv[1][0];
1632 /* The size of the memory word. */
1633 word_size = atol (argv[2]);
1634
41296c92 1635 /* Calculate the real address of the write destination. */
fb40c209
AC
1636 addr += (offset * word_size);
1637
41296c92 1638 /* Get the value as a number. */
fb40c209 1639 value = parse_and_eval_address (argv[3]);
41296c92 1640 /* Get the value into an array. */
d8bf3afa
KB
1641 buffer = xmalloc (word_size);
1642 old_chain = make_cleanup (xfree, buffer);
e17a4113 1643 store_signed_integer (buffer, word_size, byte_order, value);
41296c92 1644 /* Write it down to memory. */
fb40c209 1645 write_memory (addr, buffer, word_size);
d8bf3afa
KB
1646 /* Free the buffer. */
1647 do_cleanups (old_chain);
fb40c209
AC
1648}
1649
8dedea02
VP
1650/* DATA-MEMORY-WRITE-RAW:
1651
1652 ADDR: start address
1653 DATA: string of bytes to write at that address. */
1654void
1655mi_cmd_data_write_memory_bytes (char *command, char **argv, int argc)
1656{
1657 CORE_ADDR addr;
1658 char *cdata;
1659 gdb_byte *data;
1660 int len, r, i;
1661 struct cleanup *back_to;
1662
1663 if (argc != 2)
7ea6d463 1664 error (_("Usage: ADDR DATA."));
8dedea02
VP
1665
1666 addr = parse_and_eval_address (argv[0]);
1667 cdata = argv[1];
1668 len = strlen (cdata)/2;
1669
1670 data = xmalloc (len);
1671 back_to = make_cleanup (xfree, data);
1672
1673 for (i = 0; i < len; ++i)
1674 {
1675 int x;
1676 sscanf (cdata + i * 2, "%02x", &x);
1677 data[i] = (gdb_byte)x;
1678 }
1679
1680 r = target_write_memory (addr, data, len);
1681 if (r != 0)
1682 error (_("Could not write memory"));
1683
1684 do_cleanups (back_to);
1685}
1686
1687
ce8f13f8 1688void
d8c83789
NR
1689mi_cmd_enable_timings (char *command, char **argv, int argc)
1690{
1691 if (argc == 0)
1692 do_timings = 1;
1693 else if (argc == 1)
1694 {
1695 if (strcmp (argv[0], "yes") == 0)
1696 do_timings = 1;
1697 else if (strcmp (argv[0], "no") == 0)
1698 do_timings = 0;
1699 else
1700 goto usage_error;
1701 }
1702 else
1703 goto usage_error;
1704
ce8f13f8 1705 return;
d8c83789
NR
1706
1707 usage_error:
7ea6d463 1708 error (_("-enable-timings: Usage: %s {yes|no}"), command);
d8c83789
NR
1709}
1710
ce8f13f8 1711void
084344da
VP
1712mi_cmd_list_features (char *command, char **argv, int argc)
1713{
1714 if (argc == 0)
1715 {
1716 struct cleanup *cleanup = NULL;
79a45e25 1717 struct ui_out *uiout = current_uiout;
084344da 1718
102040f0 1719 cleanup = make_cleanup_ui_out_list_begin_end (uiout, "features");
084344da 1720 ui_out_field_string (uiout, NULL, "frozen-varobjs");
8b4ed427 1721 ui_out_field_string (uiout, NULL, "pending-breakpoints");
8e8901c5 1722 ui_out_field_string (uiout, NULL, "thread-info");
8dedea02 1723 ui_out_field_string (uiout, NULL, "data-read-memory-bytes");
39c4d40a 1724 ui_out_field_string (uiout, NULL, "breakpoint-notifications");
75082e8c 1725 ui_out_field_string (uiout, NULL, "ada-task-info");
084344da 1726
b6313243
TT
1727#if HAVE_PYTHON
1728 ui_out_field_string (uiout, NULL, "python");
1729#endif
1730
084344da 1731 do_cleanups (cleanup);
ce8f13f8 1732 return;
084344da
VP
1733 }
1734
7ea6d463 1735 error (_("-list-features should be passed no arguments"));
084344da 1736}
c6ebd6cf
VP
1737
1738void
1739mi_cmd_list_target_features (char *command, char **argv, int argc)
1740{
1741 if (argc == 0)
1742 {
1743 struct cleanup *cleanup = NULL;
79a45e25 1744 struct ui_out *uiout = current_uiout;
c6ebd6cf 1745
102040f0 1746 cleanup = make_cleanup_ui_out_list_begin_end (uiout, "features");
c6ebd6cf
VP
1747 if (target_can_async_p ())
1748 ui_out_field_string (uiout, NULL, "async");
f75d858b
MK
1749 if (target_can_execute_reverse)
1750 ui_out_field_string (uiout, NULL, "reverse");
c6ebd6cf
VP
1751
1752 do_cleanups (cleanup);
1753 return;
1754 }
1755
7ea6d463 1756 error (_("-list-target-features should be passed no arguments"));
c6ebd6cf
VP
1757}
1758
a79b8f6e
VP
1759void
1760mi_cmd_add_inferior (char *command, char **argv, int argc)
1761{
1762 struct inferior *inf;
1763
1764 if (argc != 0)
1765 error (_("-add-inferior should be passed no arguments"));
1766
1767 inf = add_inferior_with_spaces ();
1768
79a45e25 1769 ui_out_field_fmt (current_uiout, "inferior", "i%d", inf->num);
a79b8f6e
VP
1770}
1771
57bf2d7e
MK
1772/* Callback used to find the first inferior other than the
1773 current one. */
1774
1775static int
1776get_other_inferior (struct inferior *inf, void *arg)
1777{
1778 if (inf == current_inferior ())
1779 return 0;
1780
1781 return 1;
1782}
1783
a79b8f6e
VP
1784void
1785mi_cmd_remove_inferior (char *command, char **argv, int argc)
1786{
1787 int id;
1788 struct inferior *inf;
1789
1790 if (argc != 1)
7ea6d463 1791 error (_("-remove-inferior should be passed a single argument"));
a79b8f6e 1792
e2b4a699 1793 if (sscanf (argv[0], "i%d", &id) != 1)
7ea6d463 1794 error (_("the thread group id is syntactically invalid"));
a79b8f6e
VP
1795
1796 inf = find_inferior_id (id);
1797 if (!inf)
7ea6d463 1798 error (_("the specified thread group does not exist"));
a79b8f6e 1799
8fa067af 1800 if (inf->pid != 0)
81ec3cce 1801 error (_("cannot remove an active inferior"));
8fa067af 1802
57bf2d7e
MK
1803 if (inf == current_inferior ())
1804 {
1805 struct thread_info *tp = 0;
1806 struct inferior *new_inferior
1807 = iterate_over_inferiors (get_other_inferior, NULL);
1808
1809 if (new_inferior == NULL)
1810 error (_("Cannot remove last inferior"));
1811
1812 set_current_inferior (new_inferior);
1813 if (new_inferior->pid != 0)
1814 tp = any_thread_of_process (new_inferior->pid);
1815 switch_to_thread (tp ? tp->ptid : null_ptid);
1816 set_current_program_space (new_inferior->pspace);
1817 }
1818
a79b8f6e
VP
1819 delete_inferior_1 (inf, 1 /* silent */);
1820}
1821
1822\f
1823
8d34ea23
KS
1824/* Execute a command within a safe environment.
1825 Return <0 for error; >=0 for ok.
1826
1827 args->action will tell mi_execute_command what action
42972f50 1828 to perfrom after the given command has executed (display/suppress
8d34ea23 1829 prompt, display error). */
fb40c209 1830
f30f06b8 1831static void
04bd08de 1832captured_mi_execute_command (struct ui_out *uiout, struct mi_parse *context)
fb40c209 1833{
1f31650a 1834 struct cleanup *cleanup;
fb40c209 1835
4333ada3
VP
1836 if (do_timings)
1837 current_command_ts = context->cmd_start;
d8c83789 1838
1f31650a
VP
1839 current_token = xstrdup (context->token);
1840 cleanup = make_cleanup (free_current_contents, &current_token);
1841
a2840c35 1842 running_result_record_printed = 0;
f3b1572e 1843 mi_proceeded = 0;
fb40c209
AC
1844 switch (context->op)
1845 {
fb40c209 1846 case MI_COMMAND:
41296c92 1847 /* A MI command was read from the input stream. */
fb40c209
AC
1848 if (mi_debug_p)
1849 /* FIXME: gdb_???? */
1850 fprintf_unfiltered (raw_stdout, " token=`%s' command=`%s' args=`%s'\n",
1851 context->token, context->command, context->args);
d8c83789 1852
d8c83789 1853
ce8f13f8 1854 mi_cmd_execute (context);
8d34ea23 1855
a2840c35 1856 /* Print the result if there were no errors.
4389a95a 1857
a2840c35
VP
1858 Remember that on the way out of executing a command, you have
1859 to directly use the mi_interp's uiout, since the command could
1860 have reset the interpreter, in which case the current uiout
1861 will most likely crash in the mi_out_* routines. */
ce8f13f8 1862 if (!running_result_record_printed)
a2840c35
VP
1863 {
1864 fputs_unfiltered (context->token, raw_stdout);
ce8f13f8
VP
1865 /* There's no particularly good reason why target-connect results
1866 in not ^done. Should kill ^connected for MI3. */
1867 fputs_unfiltered (strcmp (context->command, "target-select") == 0
1868 ? "^connected" : "^done", raw_stdout);
a2840c35
VP
1869 mi_out_put (uiout, raw_stdout);
1870 mi_out_rewind (uiout);
4333ada3 1871 mi_print_timing_maybe ();
a2840c35
VP
1872 fputs_unfiltered ("\n", raw_stdout);
1873 }
1874 else
f7f9a841
VP
1875 /* The command does not want anything to be printed. In that
1876 case, the command probably should not have written anything
1877 to uiout, but in case it has written something, discard it. */
a2840c35 1878 mi_out_rewind (uiout);
fb40c209
AC
1879 break;
1880
1881 case CLI_COMMAND:
78f5381d
AC
1882 {
1883 char *argv[2];
102040f0 1884
78f5381d
AC
1885 /* A CLI command was read from the input stream. */
1886 /* This "feature" will be removed as soon as we have a
1887 complete set of mi commands. */
1888 /* Echo the command on the console. */
1889 fprintf_unfiltered (gdb_stdlog, "%s\n", context->command);
1890 /* Call the "console" interpreter. */
1891 argv[0] = "console";
1892 argv[1] = context->command;
ce8f13f8 1893 mi_cmd_interpreter_exec ("-interpreter-exec", argv, 2);
78f5381d 1894
eec01795 1895 /* If we changed interpreters, DON'T print out anything. */
78f5381d
AC
1896 if (current_interp_named_p (INTERP_MI)
1897 || current_interp_named_p (INTERP_MI1)
1898 || current_interp_named_p (INTERP_MI2)
1899 || current_interp_named_p (INTERP_MI3))
1900 {
ce8f13f8 1901 if (!running_result_record_printed)
eec01795
DJ
1902 {
1903 fputs_unfiltered (context->token, raw_stdout);
1904 fputs_unfiltered ("^done", raw_stdout);
1905 mi_out_put (uiout, raw_stdout);
1906 mi_out_rewind (uiout);
4333ada3
VP
1907 mi_print_timing_maybe ();
1908 fputs_unfiltered ("\n", raw_stdout);
eec01795 1909 }
eec01795
DJ
1910 else
1911 mi_out_rewind (uiout);
78f5381d
AC
1912 }
1913 break;
1914 }
fb40c209
AC
1915
1916 }
8d34ea23 1917
1f31650a
VP
1918 do_cleanups (cleanup);
1919
f30f06b8 1920 return;
fb40c209
AC
1921}
1922
305aeedc
TT
1923/* Print a gdb exception to the MI output stream. */
1924
1925static void
1926mi_print_exception (const char *token, struct gdb_exception exception)
1927{
1928 fputs_unfiltered (token, raw_stdout);
1929 fputs_unfiltered ("^error,msg=\"", raw_stdout);
1930 if (exception.message == NULL)
1931 fputs_unfiltered ("unknown error", raw_stdout);
1932 else
1933 fputstr_unfiltered (exception.message, '"', raw_stdout);
1934 fputs_unfiltered ("\"\n", raw_stdout);
1935}
fb40c209
AC
1936
1937void
1938mi_execute_command (char *cmd, int from_tty)
1939{
305aeedc
TT
1940 char *token;
1941 struct mi_parse *command = NULL;
1942 volatile struct gdb_exception exception;
fb40c209 1943
41296c92
NR
1944 /* This is to handle EOF (^D). We just quit gdb. */
1945 /* FIXME: we should call some API function here. */
fb40c209
AC
1946 if (cmd == 0)
1947 quit_force (NULL, from_tty);
1948
11334b82
VP
1949 target_log_command (cmd);
1950
305aeedc
TT
1951 TRY_CATCH (exception, RETURN_MASK_ALL)
1952 {
1953 command = mi_parse (cmd, &token);
1954 }
1955 if (exception.reason < 0)
1956 {
1957 mi_print_exception (token, exception);
1958 xfree (token);
1959 }
1960 else
fb40c209 1961 {
04bd08de 1962 volatile struct gdb_exception result;
66bb093b 1963 ptid_t previous_ptid = inferior_ptid;
d8c83789 1964
305aeedc
TT
1965 command->token = token;
1966
d8c83789
NR
1967 if (do_timings)
1968 {
1969 command->cmd_start = (struct mi_timestamp *)
1970 xmalloc (sizeof (struct mi_timestamp));
1971 timestamp (command->cmd_start);
1972 }
1973
04bd08de
TT
1974 TRY_CATCH (result, RETURN_MASK_ALL)
1975 {
79a45e25 1976 captured_mi_execute_command (current_uiout, command);
04bd08de 1977 }
ce43223b 1978 if (result.reason < 0)
fb40c209 1979 {
fb40c209 1980 /* The command execution failed and error() was called
589e074d 1981 somewhere. */
305aeedc 1982 mi_print_exception (command->token, result);
79a45e25 1983 mi_out_rewind (current_uiout);
fb40c209 1984 }
a13e061a 1985
5d4e2b76
VP
1986 bpstat_do_actions ();
1987
66bb093b
VP
1988 if (/* The notifications are only output when the top-level
1989 interpreter (specified on the command line) is MI. */
1990 ui_out_is_mi_like_p (interp_ui_out (top_level_interpreter ()))
1991 /* Don't try report anything if there are no threads --
1992 the program is dead. */
1993 && thread_count () != 0
1994 /* -thread-select explicitly changes thread. If frontend uses that
1995 internally, we don't want to emit =thread-selected, since
1996 =thread-selected is supposed to indicate user's intentions. */
1997 && strcmp (command->command, "thread-select") != 0)
1998 {
1999 struct mi_interp *mi = top_level_interpreter_data ();
d729566a 2000 int report_change = 0;
66bb093b
VP
2001
2002 if (command->thread == -1)
2003 {
d729566a
PA
2004 report_change = (!ptid_equal (previous_ptid, null_ptid)
2005 && !ptid_equal (inferior_ptid, previous_ptid)
2006 && !ptid_equal (inferior_ptid, null_ptid));
66bb093b 2007 }
d729566a 2008 else if (!ptid_equal (inferior_ptid, null_ptid))
66bb093b 2009 {
d729566a 2010 struct thread_info *ti = inferior_thread ();
102040f0 2011
66bb093b
VP
2012 report_change = (ti->num != command->thread);
2013 }
2014
2015 if (report_change)
2016 {
d729566a 2017 struct thread_info *ti = inferior_thread ();
102040f0 2018
66bb093b
VP
2019 target_terminal_ours ();
2020 fprintf_unfiltered (mi->event_channel,
2021 "thread-selected,id=\"%d\"",
2022 ti->num);
2023 gdb_flush (mi->event_channel);
2024 }
2025 }
2026
fb40c209
AC
2027 mi_parse_free (command);
2028 }
2029
fb40c209 2030 fputs_unfiltered ("(gdb) \n", raw_stdout);
a433f9e4 2031 gdb_flush (raw_stdout);
41296c92 2032 /* Print any buffered hook code. */
fb40c209
AC
2033 /* ..... */
2034}
2035
ce8f13f8 2036static void
fb40c209
AC
2037mi_cmd_execute (struct mi_parse *parse)
2038{
f107f563 2039 struct cleanup *cleanup;
e23110bb 2040
028d0ed5 2041 cleanup = prepare_execute_command ();
1b98914a 2042
a79b8f6e
VP
2043 if (parse->all && parse->thread_group != -1)
2044 error (_("Cannot specify --thread-group together with --all"));
2045
2046 if (parse->all && parse->thread != -1)
2047 error (_("Cannot specify --thread together with --all"));
2048
2049 if (parse->thread_group != -1 && parse->thread != -1)
2050 error (_("Cannot specify --thread together with --thread-group"));
2051
1e92afda
VP
2052 if (parse->frame != -1 && parse->thread == -1)
2053 error (_("Cannot specify --frame without --thread"));
dcf4fbde 2054
a79b8f6e
VP
2055 if (parse->thread_group != -1)
2056 {
2057 struct inferior *inf = find_inferior_id (parse->thread_group);
2058 struct thread_info *tp = 0;
2059
2060 if (!inf)
46ef47e5 2061 error (_("Invalid thread group for the --thread-group option"));
a79b8f6e
VP
2062
2063 set_current_inferior (inf);
2064 /* This behaviour means that if --thread-group option identifies
2065 an inferior with multiple threads, then a random one will be picked.
2066 This is not a problem -- frontend should always provide --thread if
2067 it wishes to operate on a specific thread. */
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);
fb40c209
AC
2158 execute_command ( /*ui */ run, 0 /*from_tty */ );
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
fb40c209
AC
2176 execute_command ( /*ui */ run, 0 /*from_tty */ );
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)
2277 {
d8c83789
NR
2278 gettimeofday (&tv->wallclock, NULL);
2279#ifdef HAVE_GETRUSAGE
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;
2285#else
a1b7d198
MS
2286 {
2287 long usec = get_run_time ();
2288
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;
2293 }
d8c83789
NR
2294#endif
2295 }
2296
2297static void
2298print_diff_now (struct mi_timestamp *start)
2299 {
2300 struct mi_timestamp now;
102040f0 2301
d8c83789
NR
2302 timestamp (&now);
2303 print_diff (start, &now);
2304 }
2305
4333ada3
VP
2306void
2307mi_print_timing_maybe (void)
2308{
2309 /* If the command is -enable-timing then do_timings may be
2310 true whilst current_command_ts is not initialized. */
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)
2317 {
f2395593 2318 return ((end.tv_sec - start.tv_sec) * 1000000L)
d8c83789
NR
2319 + (end.tv_usec - start.tv_usec);
2320 }
2321
2322static void
2323print_diff (struct mi_timestamp *start, struct mi_timestamp *end)
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)
2375 error (_("-trace-list-variables: no arguments are allowed"));
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)
2460 {
2461 print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC);
2462 }
2463}
2464
011aacb0
VP
2465void
2466mi_cmd_trace_save (char *command, char **argv, int argc)
2467{
2468 int target_saves = 0;
2469 char *filename;
2470
2471 if (argc != 1 && argc != 2)
2472 error (_("Usage: -trace-save [-r] filename"));
2473
2474 if (argc == 2)
2475 {
2476 filename = argv[1];
2477 if (strcmp (argv[0], "-r") == 0)
2478 target_saves = 1;
2479 else
2480 error (_("Invalid option: %s"), argv[0]);
2481 }
2482 else
2483 {
2484 filename = argv[0];
2485 }
2486
2487 trace_save (filename, target_saves);
2488}
2489
2490
f224b49d
VP
2491void
2492mi_cmd_trace_start (char *command, char **argv, int argc)
2493{
f196051f 2494 start_tracing (NULL);
f224b49d
VP
2495}
2496
2497void
2498mi_cmd_trace_status (char *command, char **argv, int argc)
2499{
2500 trace_status_mi (0);
2501}
2502
2503void
2504mi_cmd_trace_stop (char *command, char **argv, int argc)
2505{
f196051f 2506 stop_tracing (NULL);
f224b49d
VP
2507 trace_status_mi (1);
2508}
75082e8c
JB
2509
2510/* Implement the "-ada-task-info" GDB/MI command. */
2511
2512void
2513mi_cmd_ada_task_info (char *command, char **argv, int argc)
2514{
2515 if (argc != 0 && argc != 1)
2516 error (_("Invalid MI command"));
2517
2518 print_ada_task_info (current_uiout, argv[0], current_inferior ());
2519}
This page took 1.160825 seconds and 4 git commands to generate.