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