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