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