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