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