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