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