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