2002-11-29 Andrew Cagney <ac131313@redhat.com>
[deliverable/binutils-gdb.git] / gdb / mi / mi-main.c
CommitLineData
fb40c209 1/* MI Command Set.
8926118c 2 Copyright 2000, 2001, 2002 Free Software Foundation, Inc.
ab91fdd5 3 Contributed by Cygnus Solutions (a Red Hat company).
fb40c209
AC
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
21
22/* Work in progress */
23
24#include "defs.h"
25#include "target.h"
26#include "inferior.h"
27#include "gdb_string.h"
28#include "top.h"
29#include "gdbthread.h"
30#include "mi-cmds.h"
31#include "mi-parse.h"
32#include "mi-getopt.h"
33#include "mi-console.h"
34#include "ui-out.h"
35#include "mi-out.h"
36#include "event-loop.h"
37#include "event-top.h"
38#include "gdbcore.h" /* for write_memory() */
73937e03 39#include "value.h" /* for deprecated_write_register_bytes() */
4e052eda 40#include "regcache.h"
5b7f31a4 41#include "gdb.h"
36dc181b
EZ
42#include "frame.h"
43
fb40c209
AC
44#include <ctype.h>
45#include <sys/time.h>
46
fb40c209
AC
47enum
48 {
49 FROM_TTY = 0
50 };
51
8d34ea23
KS
52/* Enumerations of the actions that may result from calling
53 captured_mi_execute_command */
54
55enum captured_mi_execute_command_actions
56 {
57 EXECUTE_COMMAND_DISPLAY_PROMPT,
58 EXECUTE_COMMAND_SUPRESS_PROMPT,
59 EXECUTE_COMMAND_DISPLAY_ERROR
60 };
61
62/* This structure is used to pass information from captured_mi_execute_command
63 to mi_execute_command. */
64struct captured_mi_execute_command_args
65{
66 /* This return result of the MI command (output) */
67 enum mi_cmd_result rc;
68
69 /* What action to perform when the call is finished (output) */
70 enum captured_mi_execute_command_actions action;
71
72 /* The command context to be executed (input) */
73 struct mi_parse *command;
74};
fb40c209
AC
75
76int mi_debug_p;
77struct ui_file *raw_stdout;
78
79/* The token of the last asynchronous command */
80static char *last_async_command;
81static char *previous_async_command;
82static char *mi_error_message;
83static char *old_regs;
84
85extern void _initialize_mi_main (void);
86static char *mi_input (char *);
87static void mi_execute_command (char *cmd, int from_tty);
88static enum mi_cmd_result mi_cmd_execute (struct mi_parse *parse);
89
90static void mi_execute_cli_command (const char *cli, char *args);
91static enum mi_cmd_result mi_execute_async_cli_command (char *mi, char *args, int from_tty);
92static void mi_execute_command_wrapper (char *cmd);
93
94void mi_exec_async_cli_cmd_continuation (struct continuation_arg *arg);
fb40c209
AC
95
96static int register_changed_p (int regnum);
97static int get_register (int regnum, int format);
98static void mi_load_progress (const char *section_name,
99 unsigned long sent_so_far,
100 unsigned long total_section,
101 unsigned long total_sent,
102 unsigned long grand_total);
103
fb40c209
AC
104/* Command implementations. FIXME: Is this libgdb? No. This is the MI
105 layer that calls libgdb. Any operation used in the below should be
106 formalized. */
107
108enum mi_cmd_result
109mi_cmd_gdb_exit (char *command, char **argv, int argc)
110{
111 /* We have to print everything right here because we never return */
112 if (last_async_command)
113 fputs_unfiltered (last_async_command, raw_stdout);
114 fputs_unfiltered ("^exit\n", raw_stdout);
115 mi_out_put (uiout, raw_stdout);
116 /* FIXME: The function called is not yet a formal libgdb function */
117 quit_force (NULL, FROM_TTY);
118 return MI_CMD_DONE;
119}
120
121enum mi_cmd_result
122mi_cmd_exec_run (char *args, int from_tty)
123{
124 /* FIXME: Should call a libgdb function, not a cli wrapper */
125 return mi_execute_async_cli_command ("run", args, from_tty);
126}
127
128enum mi_cmd_result
129mi_cmd_exec_next (char *args, int from_tty)
130{
131 /* FIXME: Should call a libgdb function, not a cli wrapper */
132 return mi_execute_async_cli_command ("next", args, from_tty);
133}
134
135enum mi_cmd_result
136mi_cmd_exec_next_instruction (char *args, int from_tty)
137{
138 /* FIXME: Should call a libgdb function, not a cli wrapper */
139 return mi_execute_async_cli_command ("nexti", args, from_tty);
140}
141
142enum mi_cmd_result
143mi_cmd_exec_step (char *args, int from_tty)
144{
145 /* FIXME: Should call a libgdb function, not a cli wrapper */
146 return mi_execute_async_cli_command ("step", args, from_tty);
147}
148
149enum mi_cmd_result
150mi_cmd_exec_step_instruction (char *args, int from_tty)
151{
152 /* FIXME: Should call a libgdb function, not a cli wrapper */
153 return mi_execute_async_cli_command ("stepi", args, from_tty);
154}
155
156enum mi_cmd_result
157mi_cmd_exec_finish (char *args, int from_tty)
158{
159 /* FIXME: Should call a libgdb function, not a cli wrapper */
160 return mi_execute_async_cli_command ("finish", args, from_tty);
161}
162
163enum mi_cmd_result
164mi_cmd_exec_until (char *args, int from_tty)
165{
166 /* FIXME: Should call a libgdb function, not a cli wrapper */
167 return mi_execute_async_cli_command ("until", args, from_tty);
168}
169
170enum mi_cmd_result
171mi_cmd_exec_return (char *args, int from_tty)
172{
fb40c209
AC
173 /* This command doesn't really execute the target, it just pops the
174 specified number of frames. */
175 if (*args)
176 /* Call return_command with from_tty argument equal to 0 so as to
177 avoid being queried. */
36dc181b 178 return_command (args, 0);
fb40c209
AC
179 else
180 /* Call return_command with from_tty argument equal to 0 so as to
181 avoid being queried. */
36dc181b 182 return_command (NULL, 0);
fb40c209
AC
183
184 /* Because we have called return_command with from_tty = 0, we need
185 to print the frame here. */
6e7f8b9c
AC
186 show_and_print_stack_frame (deprecated_selected_frame,
187 frame_relative_level (deprecated_selected_frame),
fb40c209 188 LOC_AND_ADDRESS);
fb40c209
AC
189
190 return MI_CMD_DONE;
191}
192
193enum mi_cmd_result
194mi_cmd_exec_continue (char *args, int from_tty)
195{
196 /* FIXME: Should call a libgdb function, not a cli wrapper */
197 return mi_execute_async_cli_command ("continue", args, from_tty);
198}
199
200/* Interrupt the execution of the target. Note how we must play around
201 with the token varialbes, in order to display the current token in
202 the result of the interrupt command, and the previous execution
203 token when the target finally stops. See comments in
204 mi_cmd_execute. */
205enum mi_cmd_result
206mi_cmd_exec_interrupt (char *args, int from_tty)
207{
fb40c209
AC
208 if (!target_executing)
209 {
76995688
AC
210 xasprintf (&mi_error_message,
211 "mi_cmd_exec_interrupt: Inferior not executing.");
fb40c209
AC
212 return MI_CMD_ERROR;
213 }
36dc181b 214 interrupt_target_command (args, from_tty);
fb40c209
AC
215 if (last_async_command)
216 fputs_unfiltered (last_async_command, raw_stdout);
217 fputs_unfiltered ("^done", raw_stdout);
b8c9b27d 218 xfree (last_async_command);
fb40c209
AC
219 if (previous_async_command)
220 last_async_command = xstrdup (previous_async_command);
b8c9b27d 221 xfree (previous_async_command);
fb40c209
AC
222 previous_async_command = NULL;
223 mi_out_put (uiout, raw_stdout);
224 mi_out_rewind (uiout);
225 fputs_unfiltered ("\n", raw_stdout);
fb40c209
AC
226 return MI_CMD_QUIET;
227}
228
229enum mi_cmd_result
230mi_cmd_thread_select (char *command, char **argv, int argc)
231{
232 enum gdb_rc rc;
233
234 if (argc != 1)
235 {
76995688
AC
236 xasprintf (&mi_error_message,
237 "mi_cmd_thread_select: USAGE: threadnum.");
fb40c209
AC
238 return MI_CMD_ERROR;
239 }
240 else
2b65245e 241 rc = gdb_thread_select (uiout, argv[0]);
fb40c209 242
99615eb8
KS
243 /* RC is enum gdb_rc if it is successful (>=0)
244 enum return_reason if not (<0). */
245 if ((int) rc < 0 && (enum return_reason) rc == RETURN_ERROR)
fb40c209 246 return MI_CMD_CAUGHT_ERROR;
99615eb8
KS
247 else if ((int) rc >= 0 && rc == GDB_RC_FAIL)
248 return MI_CMD_ERROR;
fb40c209
AC
249 else
250 return MI_CMD_DONE;
251}
252
253enum mi_cmd_result
254mi_cmd_thread_list_ids (char *command, char **argv, int argc)
255{
256 enum gdb_rc rc = MI_CMD_DONE;
257
258 if (argc != 0)
259 {
76995688
AC
260 xasprintf (&mi_error_message,
261 "mi_cmd_thread_list_ids: No arguments required.");
fb40c209
AC
262 return MI_CMD_ERROR;
263 }
264 else
2b65245e 265 rc = gdb_list_thread_ids (uiout);
fb40c209
AC
266
267 if (rc == GDB_RC_FAIL)
268 return MI_CMD_CAUGHT_ERROR;
269 else
270 return MI_CMD_DONE;
271}
272
273enum mi_cmd_result
274mi_cmd_data_list_register_names (char *command, char **argv, int argc)
275{
276 int regnum, numregs;
277 int i;
4060713b 278 struct cleanup *cleanup;
fb40c209
AC
279
280 /* Note that the test for a valid register must include checking the
281 REGISTER_NAME because NUM_REGS may be allocated for the union of
282 the register sets within a family of related processors. In this
283 case, some entries of REGISTER_NAME will change depending upon
284 the particular processor being debugged. */
285
173d6894 286 numregs = NUM_REGS + NUM_PSEUDO_REGS;
fb40c209 287
4060713b 288 cleanup = make_cleanup_ui_out_list_begin_end (uiout, "register-names");
fb40c209
AC
289
290 if (argc == 0) /* No args, just do all the regs */
291 {
292 for (regnum = 0;
293 regnum < numregs;
294 regnum++)
295 {
296 if (REGISTER_NAME (regnum) == NULL
297 || *(REGISTER_NAME (regnum)) == '\0')
173d6894
AC
298 ui_out_field_string (uiout, NULL, "");
299 else
300 ui_out_field_string (uiout, NULL, REGISTER_NAME (regnum));
fb40c209
AC
301 }
302 }
303
304 /* Else, list of register #s, just do listed regs */
305 for (i = 0; i < argc; i++)
306 {
307 regnum = atoi (argv[i]);
173d6894 308 if (regnum < 0 || regnum >= numregs)
fb40c209 309 {
4060713b 310 do_cleanups (cleanup);
76995688 311 xasprintf (&mi_error_message, "bad register number");
fb40c209
AC
312 return MI_CMD_ERROR;
313 }
173d6894
AC
314 if (REGISTER_NAME (regnum) == NULL
315 || *(REGISTER_NAME (regnum)) == '\0')
316 ui_out_field_string (uiout, NULL, "");
317 else
318 ui_out_field_string (uiout, NULL, REGISTER_NAME (regnum));
fb40c209 319 }
4060713b 320 do_cleanups (cleanup);
fb40c209
AC
321 return MI_CMD_DONE;
322}
323
324enum mi_cmd_result
325mi_cmd_data_list_changed_registers (char *command, char **argv, int argc)
326{
327 int regnum, numregs, changed;
328 int i;
4060713b 329 struct cleanup *cleanup;
fb40c209
AC
330
331 /* Note that the test for a valid register must include checking the
332 REGISTER_NAME because NUM_REGS may be allocated for the union of
333 the register sets within a family of related processors. In this
334 case, some entries of REGISTER_NAME will change depending upon
335 the particular processor being debugged. */
336
a728f042 337 numregs = NUM_REGS;
fb40c209 338
4060713b 339 cleanup = make_cleanup_ui_out_list_begin_end (uiout, "changed-registers");
fb40c209
AC
340
341 if (argc == 0) /* No args, just do all the regs */
342 {
343 for (regnum = 0;
344 regnum < numregs;
345 regnum++)
346 {
347 if (REGISTER_NAME (regnum) == NULL
348 || *(REGISTER_NAME (regnum)) == '\0')
349 continue;
350 changed = register_changed_p (regnum);
351 if (changed < 0)
352 {
4060713b 353 do_cleanups (cleanup);
76995688
AC
354 xasprintf (&mi_error_message,
355 "mi_cmd_data_list_changed_registers: Unable to read register contents.");
fb40c209
AC
356 return MI_CMD_ERROR;
357 }
358 else if (changed)
359 ui_out_field_int (uiout, NULL, regnum);
360 }
361 }
362
363 /* Else, list of register #s, just do listed regs */
364 for (i = 0; i < argc; i++)
365 {
366 regnum = atoi (argv[i]);
367
368 if (regnum >= 0
369 && regnum < numregs
370 && REGISTER_NAME (regnum) != NULL
371 && *REGISTER_NAME (regnum) != '\000')
372 {
373 changed = register_changed_p (regnum);
374 if (changed < 0)
375 {
4060713b 376 do_cleanups (cleanup);
76995688
AC
377 xasprintf (&mi_error_message,
378 "mi_cmd_data_list_register_change: Unable to read register contents.");
fb40c209
AC
379 return MI_CMD_ERROR;
380 }
381 else if (changed)
382 ui_out_field_int (uiout, NULL, regnum);
383 }
384 else
385 {
4060713b 386 do_cleanups (cleanup);
76995688 387 xasprintf (&mi_error_message, "bad register number");
fb40c209
AC
388 return MI_CMD_ERROR;
389 }
390 }
4060713b 391 do_cleanups (cleanup);
fb40c209
AC
392 return MI_CMD_DONE;
393}
394
395static int
396register_changed_p (int regnum)
397{
d8bf3afa 398 char *raw_buffer = alloca (MAX_REGISTER_RAW_SIZE);
fb40c209 399
6e7f8b9c 400 if (! frame_register_read (deprecated_selected_frame, regnum, raw_buffer))
fb40c209
AC
401 return -1;
402
403 if (memcmp (&old_regs[REGISTER_BYTE (regnum)], raw_buffer,
404 REGISTER_RAW_SIZE (regnum)) == 0)
405 return 0;
406
407 /* Found a changed register. Return 1. */
408
409 memcpy (&old_regs[REGISTER_BYTE (regnum)], raw_buffer,
410 REGISTER_RAW_SIZE (regnum));
411
412 return 1;
413}
414
415/* Return a list of register number and value pairs. The valid
416 arguments expected are: a letter indicating the format in which to
417 display the registers contents. This can be one of: x (hexadecimal), d
418 (decimal), N (natural), t (binary), o (octal), r (raw). After the
419 format argumetn there can be a sequence of numbers, indicating which
420 registers to fetch the content of. If the format is the only argument,
421 a list of all the registers with their values is returned. */
422enum mi_cmd_result
423mi_cmd_data_list_register_values (char *command, char **argv, int argc)
424{
425 int regnum, numregs, format, result;
426 int i;
4060713b 427 struct cleanup *list_cleanup, *tuple_cleanup;
fb40c209
AC
428
429 /* Note that the test for a valid register must include checking the
430 REGISTER_NAME because NUM_REGS may be allocated for the union of
431 the register sets within a family of related processors. In this
432 case, some entries of REGISTER_NAME will change depending upon
433 the particular processor being debugged. */
434
a728f042 435 numregs = NUM_REGS;
fb40c209
AC
436
437 if (argc == 0)
438 {
76995688
AC
439 xasprintf (&mi_error_message,
440 "mi_cmd_data_list_register_values: Usage: -data-list-register-values <format> [<regnum1>...<regnumN>]");
fb40c209
AC
441 return MI_CMD_ERROR;
442 }
443
444 format = (int) argv[0][0];
445
446 if (!target_has_registers)
447 {
76995688
AC
448 xasprintf (&mi_error_message,
449 "mi_cmd_data_list_register_values: No registers.");
fb40c209
AC
450 return MI_CMD_ERROR;
451 }
452
4060713b 453 list_cleanup = make_cleanup_ui_out_list_begin_end (uiout, "register-values");
fb40c209
AC
454
455 if (argc == 1) /* No args, beside the format: do all the regs */
456 {
457 for (regnum = 0;
458 regnum < numregs;
459 regnum++)
460 {
461 if (REGISTER_NAME (regnum) == NULL
462 || *(REGISTER_NAME (regnum)) == '\0')
463 continue;
4060713b 464 tuple_cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
fb40c209
AC
465 ui_out_field_int (uiout, "number", regnum);
466 result = get_register (regnum, format);
467 if (result == -1)
4060713b
KS
468 {
469 do_cleanups (list_cleanup);
470 return MI_CMD_ERROR;
471 }
472 do_cleanups (tuple_cleanup);
fb40c209
AC
473 }
474 }
475
476 /* Else, list of register #s, just do listed regs */
477 for (i = 1; i < argc; i++)
478 {
479 regnum = atoi (argv[i]);
480
481 if (regnum >= 0
482 && regnum < numregs
483 && REGISTER_NAME (regnum) != NULL
484 && *REGISTER_NAME (regnum) != '\000')
485 {
4060713b 486 tuple_cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
fb40c209
AC
487 ui_out_field_int (uiout, "number", regnum);
488 result = get_register (regnum, format);
489 if (result == -1)
4060713b
KS
490 {
491 do_cleanups (list_cleanup);
492 return MI_CMD_ERROR;
493 }
494 do_cleanups (tuple_cleanup);
fb40c209
AC
495 }
496 else
497 {
4060713b 498 do_cleanups (list_cleanup);
76995688 499 xasprintf (&mi_error_message, "bad register number");
fb40c209
AC
500 return MI_CMD_ERROR;
501 }
502 }
4060713b 503 do_cleanups (list_cleanup);
fb40c209
AC
504 return MI_CMD_DONE;
505}
506
507/* Output one register's contents in the desired format. */
508static int
509get_register (int regnum, int format)
510{
d8bf3afa
KB
511 char *raw_buffer = alloca (MAX_REGISTER_RAW_SIZE);
512 char *virtual_buffer = alloca (MAX_REGISTER_VIRTUAL_SIZE);
fb40c209
AC
513 int optim;
514 static struct ui_stream *stb = NULL;
515
516 stb = ui_out_stream_new (uiout);
517
518 if (format == 'N')
519 format = 0;
520
6e7f8b9c
AC
521 get_saved_register (raw_buffer, &optim, (CORE_ADDR *) NULL,
522 deprecated_selected_frame,
fb40c209
AC
523 regnum, (enum lval_type *) NULL);
524 if (optim)
525 {
76995688 526 xasprintf (&mi_error_message, "Optimized out");
fb40c209
AC
527 return -1;
528 }
529
530 /* Convert raw data to virtual format if necessary. */
531
532 if (REGISTER_CONVERTIBLE (regnum))
533 {
534 REGISTER_CONVERT_TO_VIRTUAL (regnum, REGISTER_VIRTUAL_TYPE (regnum),
535 raw_buffer, virtual_buffer);
536 }
537 else
538 memcpy (virtual_buffer, raw_buffer, REGISTER_VIRTUAL_SIZE (regnum));
539
540 if (format == 'r')
541 {
542 int j;
543 char *ptr, buf[1024];
544
545 strcpy (buf, "0x");
546 ptr = buf + 2;
547 for (j = 0; j < REGISTER_RAW_SIZE (regnum); j++)
548 {
d7449b42 549 register int idx = TARGET_BYTE_ORDER == BFD_ENDIAN_BIG ? j
fb40c209
AC
550 : REGISTER_RAW_SIZE (regnum) - 1 - j;
551 sprintf (ptr, "%02x", (unsigned char) raw_buffer[idx]);
552 ptr += 2;
553 }
554 ui_out_field_string (uiout, "value", buf);
555 /*fputs_filtered (buf, gdb_stdout); */
556 }
557 else
558 {
559 val_print (REGISTER_VIRTUAL_TYPE (regnum), virtual_buffer, 0, 0,
560 stb->stream, format, 1, 0, Val_pretty_default);
561 ui_out_field_stream (uiout, "value", stb);
562 ui_out_stream_delete (stb);
563 }
564 return 1;
565}
566
24e8cecf
EZ
567/* Write given values into registers. The registers and values are
568 given as pairs. The corresponding MI command is
569 -data-write-register-values <format> [<regnum1> <value1>...<regnumN> <valueN>]*/
570enum mi_cmd_result
571mi_cmd_data_write_register_values (char *command, char **argv, int argc)
572{
573 int regnum;
574 int i;
575 int numregs;
24e8cecf
EZ
576 LONGEST value;
577 char format;
578
579 /* Note that the test for a valid register must include checking the
580 REGISTER_NAME because NUM_REGS may be allocated for the union of
581 the register sets within a family of related processors. In this
582 case, some entries of REGISTER_NAME will change depending upon
583 the particular processor being debugged. */
584
a728f042 585 numregs = NUM_REGS;
24e8cecf
EZ
586
587 if (argc == 0)
588 {
76995688
AC
589 xasprintf (&mi_error_message,
590 "mi_cmd_data_write_register_values: Usage: -data-write-register-values <format> [<regnum1> <value1>...<regnumN> <valueN>]");
24e8cecf
EZ
591 return MI_CMD_ERROR;
592 }
593
594 format = (int) argv[0][0];
595
596 if (!target_has_registers)
597 {
76995688
AC
598 xasprintf (&mi_error_message,
599 "mi_cmd_data_write_register_values: No registers.");
24e8cecf
EZ
600 return MI_CMD_ERROR;
601 }
602
603 if (!(argc - 1))
604 {
76995688
AC
605 xasprintf (&mi_error_message,
606 "mi_cmd_data_write_register_values: No regs and values specified.");
24e8cecf
EZ
607 return MI_CMD_ERROR;
608 }
609
610 if ((argc - 1) % 2)
611 {
76995688
AC
612 xasprintf (&mi_error_message,
613 "mi_cmd_data_write_register_values: Regs and vals are not in pairs.");
24e8cecf
EZ
614 return MI_CMD_ERROR;
615 }
616
617 for (i = 1; i < argc; i = i + 2)
618 {
619 regnum = atoi (argv[i]);
620
621 if (regnum >= 0
622 && regnum < numregs
623 && REGISTER_NAME (regnum) != NULL
624 && *REGISTER_NAME (regnum) != '\000')
625 {
d8bf3afa
KB
626 void *buffer;
627 struct cleanup *old_chain;
628
24e8cecf
EZ
629 /* Get the value as a number */
630 value = parse_and_eval_address (argv[i + 1]);
631 /* Get the value into an array */
d8bf3afa
KB
632 buffer = xmalloc (REGISTER_SIZE);
633 old_chain = make_cleanup (xfree, buffer);
24e8cecf
EZ
634 store_signed_integer (buffer, REGISTER_SIZE, value);
635 /* Write it down */
73937e03 636 deprecated_write_register_bytes (REGISTER_BYTE (regnum), buffer, REGISTER_RAW_SIZE (regnum));
d8bf3afa
KB
637 /* Free the buffer. */
638 do_cleanups (old_chain);
24e8cecf
EZ
639 }
640 else
641 {
76995688 642 xasprintf (&mi_error_message, "bad register number");
24e8cecf
EZ
643 return MI_CMD_ERROR;
644 }
645 }
646 return MI_CMD_DONE;
647}
648
fb40c209
AC
649#if 0
650/*This is commented out because we decided it was not useful. I leave
651 it, just in case. ezannoni:1999-12-08 */
652
653/* Assign a value to a variable. The expression argument must be in
654 the form A=2 or "A = 2" (I.e. if there are spaces it needs to be
655 quoted. */
656enum mi_cmd_result
657mi_cmd_data_assign (char *command, char **argv, int argc)
658{
659 struct expression *expr;
660 struct cleanup *old_chain;
661
662 if (argc != 1)
663 {
76995688
AC
664 xasprintf (&mi_error_message,
665 "mi_cmd_data_assign: Usage: -data-assign expression");
fb40c209
AC
666 return MI_CMD_ERROR;
667 }
668
669 /* NOTE what follows is a clone of set_command(). FIXME: ezannoni
670 01-12-1999: Need to decide what to do with this for libgdb purposes. */
671
672 expr = parse_expression (argv[0]);
47cf603e 673 old_chain = make_cleanup (free_current_contents, &expr);
fb40c209
AC
674 evaluate_expression (expr);
675 do_cleanups (old_chain);
676 return MI_CMD_DONE;
677}
678#endif
679
680/* Evaluate the value of the argument. The argument is an
681 expression. If the expression contains spaces it needs to be
682 included in double quotes. */
683enum mi_cmd_result
684mi_cmd_data_evaluate_expression (char *command, char **argv, int argc)
685{
686 struct expression *expr;
687 struct cleanup *old_chain = NULL;
96052a95 688 struct value *val;
fb40c209
AC
689 struct ui_stream *stb = NULL;
690
691 stb = ui_out_stream_new (uiout);
692
693 if (argc != 1)
694 {
76995688
AC
695 xasprintf (&mi_error_message,
696 "mi_cmd_data_evaluate_expression: Usage: -data-evaluate-expression expression");
fb40c209
AC
697 return MI_CMD_ERROR;
698 }
699
700 expr = parse_expression (argv[0]);
701
47cf603e 702 old_chain = make_cleanup (free_current_contents, &expr);
fb40c209
AC
703
704 val = evaluate_expression (expr);
705
706 /* Print the result of the expression evaluation. */
707 val_print (VALUE_TYPE (val), VALUE_CONTENTS (val),
708 VALUE_EMBEDDED_OFFSET (val), VALUE_ADDRESS (val),
709 stb->stream, 0, 0, 0, 0);
710
711 ui_out_field_stream (uiout, "value", stb);
712 ui_out_stream_delete (stb);
713
714 do_cleanups (old_chain);
715
716 return MI_CMD_DONE;
717}
718
719enum mi_cmd_result
720mi_cmd_target_download (char *args, int from_tty)
721{
722 char *run;
723 struct cleanup *old_cleanups = NULL;
724
76995688 725 xasprintf (&run, "load %s", args);
b8c9b27d 726 old_cleanups = make_cleanup (xfree, run);
fb40c209
AC
727 execute_command (run, from_tty);
728
729 do_cleanups (old_cleanups);
730 return MI_CMD_DONE;
731}
732
733/* Connect to the remote target. */
734enum mi_cmd_result
735mi_cmd_target_select (char *args, int from_tty)
736{
737 char *run;
738 struct cleanup *old_cleanups = NULL;
739
76995688 740 xasprintf (&run, "target %s", args);
b8c9b27d 741 old_cleanups = make_cleanup (xfree, run);
fb40c209
AC
742
743 /* target-select is always synchronous. once the call has returned
744 we know that we are connected. */
745 /* NOTE: At present all targets that are connected are also
746 (implicitly) talking to a halted target. In the future this may
747 change. */
748 execute_command (run, from_tty);
749
750 do_cleanups (old_cleanups);
751
752 /* Issue the completion message here. */
753 if (last_async_command)
754 fputs_unfiltered (last_async_command, raw_stdout);
755 fputs_unfiltered ("^connected", raw_stdout);
756 mi_out_put (uiout, raw_stdout);
757 mi_out_rewind (uiout);
758 fputs_unfiltered ("\n", raw_stdout);
759 do_exec_cleanups (ALL_CLEANUPS);
760 return MI_CMD_QUIET;
761}
762
763/* DATA-MEMORY-READ:
764
765 ADDR: start address of data to be dumped.
766 WORD-FORMAT: a char indicating format for the ``word''. See
767 the ``x'' command.
768 WORD-SIZE: size of each ``word''; 1,2,4, or 8 bytes
769 NR_ROW: Number of rows.
770 NR_COL: The number of colums (words per row).
771 ASCHAR: (OPTIONAL) Append an ascii character dump to each row. Use
772 ASCHAR for unprintable characters.
773
774 Reads SIZE*NR_ROW*NR_COL bytes starting at ADDR from memory and
775 displayes them. Returns:
776
777 {addr="...",rowN={wordN="..." ,... [,ascii="..."]}, ...}
778
779 Returns:
780 The number of bytes read is SIZE*ROW*COL. */
781
782enum mi_cmd_result
783mi_cmd_data_read_memory (char *command, char **argv, int argc)
784{
785 struct cleanup *cleanups = make_cleanup (null_cleanup, NULL);
786 CORE_ADDR addr;
787 long total_bytes;
788 long nr_cols;
789 long nr_rows;
790 char word_format;
791 struct type *word_type;
792 long word_size;
793 char word_asize;
794 char aschar;
795 char *mbuf;
796 int nr_bytes;
797 long offset = 0;
798 int optind = 0;
799 char *optarg;
800 enum opt
801 {
802 OFFSET_OPT
803 };
804 static struct mi_opt opts[] =
805 {
806 {"o", OFFSET_OPT, 1},
807 0
808 };
809
810 while (1)
811 {
812 int opt = mi_getopt ("mi_cmd_data_read_memory", argc, argv, opts,
813 &optind, &optarg);
814 if (opt < 0)
815 break;
816 switch ((enum opt) opt)
817 {
818 case OFFSET_OPT:
819 offset = atol (optarg);
820 break;
821 }
822 }
823 argv += optind;
824 argc -= optind;
825
826 if (argc < 5 || argc > 6)
827 {
76995688
AC
828 xasprintf (&mi_error_message,
829 "mi_cmd_data_read_memory: Usage: ADDR WORD-FORMAT WORD-SIZE NR-ROWS NR-COLS [ASCHAR].");
fb40c209
AC
830 return MI_CMD_ERROR;
831 }
832
833 /* Extract all the arguments. */
834
835 /* Start address of the memory dump. */
836 addr = parse_and_eval_address (argv[0]) + offset;
837 /* The format character to use when displaying a memory word. See
838 the ``x'' command. */
839 word_format = argv[1][0];
840 /* The size of the memory word. */
841 word_size = atol (argv[2]);
842 switch (word_size)
843 {
844 case 1:
845 word_type = builtin_type_int8;
846 word_asize = 'b';
847 break;
848 case 2:
849 word_type = builtin_type_int16;
850 word_asize = 'h';
851 break;
852 case 4:
853 word_type = builtin_type_int32;
854 word_asize = 'w';
855 break;
856 case 8:
857 word_type = builtin_type_int64;
858 word_asize = 'g';
859 break;
860 default:
861 word_type = builtin_type_int8;
862 word_asize = 'b';
863 }
864 /* The number of rows */
865 nr_rows = atol (argv[3]);
866 if (nr_rows <= 0)
867 {
76995688
AC
868 xasprintf (&mi_error_message,
869 "mi_cmd_data_read_memory: invalid number of rows.");
fb40c209
AC
870 return MI_CMD_ERROR;
871 }
872 /* number of bytes per row. */
873 nr_cols = atol (argv[4]);
874 if (nr_cols <= 0)
875 {
76995688
AC
876 xasprintf (&mi_error_message,
877 "mi_cmd_data_read_memory: invalid number of columns.");
fb40c209
AC
878 }
879 /* The un-printable character when printing ascii. */
880 if (argc == 6)
881 aschar = *argv[5];
882 else
883 aschar = 0;
884
885 /* create a buffer and read it in. */
886 total_bytes = word_size * nr_rows * nr_cols;
2e94c453 887 mbuf = xcalloc (total_bytes, 1);
b8c9b27d 888 make_cleanup (xfree, mbuf);
fb40c209
AC
889 if (mbuf == NULL)
890 {
76995688
AC
891 xasprintf (&mi_error_message,
892 "mi_cmd_data_read_memory: out of memory.");
fb40c209
AC
893 return MI_CMD_ERROR;
894 }
895 nr_bytes = 0;
896 while (nr_bytes < total_bytes)
897 {
898 int error;
899 long num = target_read_memory_partial (addr + nr_bytes, mbuf + nr_bytes,
900 total_bytes - nr_bytes,
901 &error);
902 if (num <= 0)
903 break;
904 nr_bytes += num;
905 }
906
907 /* output the header information. */
908 ui_out_field_core_addr (uiout, "addr", addr);
909 ui_out_field_int (uiout, "nr-bytes", nr_bytes);
910 ui_out_field_int (uiout, "total-bytes", total_bytes);
911 ui_out_field_core_addr (uiout, "next-row", addr + word_size * nr_cols);
912 ui_out_field_core_addr (uiout, "prev-row", addr - word_size * nr_cols);
913 ui_out_field_core_addr (uiout, "next-page", addr + total_bytes);
914 ui_out_field_core_addr (uiout, "prev-page", addr - total_bytes);
915
916 /* Build the result as a two dimentional table. */
917 {
918 struct ui_stream *stream = ui_out_stream_new (uiout);
6ad4a2cf 919 struct cleanup *cleanup_list_memory;
fb40c209
AC
920 int row;
921 int row_byte;
6ad4a2cf 922 cleanup_list_memory = make_cleanup_ui_out_list_begin_end (uiout, "memory");
fb40c209
AC
923 for (row = 0, row_byte = 0;
924 row < nr_rows;
925 row++, row_byte += nr_cols * word_size)
926 {
927 int col;
928 int col_byte;
6ad4a2cf
JJ
929 struct cleanup *cleanup_tuple;
930 struct cleanup *cleanup_list_data;
931 cleanup_tuple = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
fb40c209
AC
932 ui_out_field_core_addr (uiout, "addr", addr + row_byte);
933 /* ui_out_field_core_addr_symbolic (uiout, "saddr", addr + row_byte); */
6ad4a2cf 934 cleanup_list_data = make_cleanup_ui_out_list_begin_end (uiout, "data");
fb40c209
AC
935 for (col = 0, col_byte = row_byte;
936 col < nr_cols;
937 col++, col_byte += word_size)
938 {
939 if (col_byte + word_size > nr_bytes)
940 {
941 ui_out_field_string (uiout, NULL, "N/A");
942 }
943 else
944 {
945 ui_file_rewind (stream->stream);
946 print_scalar_formatted (mbuf + col_byte, word_type, word_format,
947 word_asize, stream->stream);
948 ui_out_field_stream (uiout, NULL, stream);
949 }
950 }
6ad4a2cf 951 do_cleanups (cleanup_list_data);
fb40c209
AC
952 if (aschar)
953 {
954 int byte;
955 ui_file_rewind (stream->stream);
956 for (byte = row_byte; byte < row_byte + word_size * nr_cols; byte++)
957 {
958 if (byte >= nr_bytes)
959 {
960 fputc_unfiltered ('X', stream->stream);
961 }
962 else if (mbuf[byte] < 32 || mbuf[byte] > 126)
963 {
964 fputc_unfiltered (aschar, stream->stream);
965 }
966 else
967 fputc_unfiltered (mbuf[byte], stream->stream);
968 }
969 ui_out_field_stream (uiout, "ascii", stream);
970 }
6ad4a2cf 971 do_cleanups (cleanup_tuple);
fb40c209
AC
972 }
973 ui_out_stream_delete (stream);
6ad4a2cf 974 do_cleanups (cleanup_list_memory);
fb40c209
AC
975 }
976 do_cleanups (cleanups);
977 return MI_CMD_DONE;
978}
979
980/* DATA-MEMORY-WRITE:
981
982 COLUMN_OFFSET: optional argument. Must be preceeded by '-o'. The
983 offset from the beginning of the memory grid row where the cell to
984 be written is.
985 ADDR: start address of the row in the memory grid where the memory
986 cell is, if OFFSET_COLUMN is specified. Otherwise, the address of
987 the location to write to.
988 FORMAT: a char indicating format for the ``word''. See
989 the ``x'' command.
990 WORD_SIZE: size of each ``word''; 1,2,4, or 8 bytes
991 VALUE: value to be written into the memory address.
992
993 Writes VALUE into ADDR + (COLUMN_OFFSET * WORD_SIZE).
994
995 Prints nothing. */
996enum mi_cmd_result
997mi_cmd_data_write_memory (char *command, char **argv, int argc)
998{
999 CORE_ADDR addr;
1000 char word_format;
1001 long word_size;
1002 /* FIXME: ezannoni 2000-02-17 LONGEST could possibly not be big
1003 enough when using a compiler other than GCC. */
1004 LONGEST value;
d8bf3afa
KB
1005 void *buffer;
1006 struct cleanup *old_chain;
fb40c209
AC
1007 long offset = 0;
1008 int optind = 0;
1009 char *optarg;
1010 enum opt
1011 {
1012 OFFSET_OPT
1013 };
1014 static struct mi_opt opts[] =
1015 {
1016 {"o", OFFSET_OPT, 1},
1017 0
1018 };
1019
1020 while (1)
1021 {
1022 int opt = mi_getopt ("mi_cmd_data_write_memory", argc, argv, opts,
1023 &optind, &optarg);
1024 if (opt < 0)
1025 break;
1026 switch ((enum opt) opt)
1027 {
1028 case OFFSET_OPT:
1029 offset = atol (optarg);
1030 break;
1031 }
1032 }
1033 argv += optind;
1034 argc -= optind;
1035
1036 if (argc != 4)
1037 {
76995688
AC
1038 xasprintf (&mi_error_message,
1039 "mi_cmd_data_write_memory: Usage: [-o COLUMN_OFFSET] ADDR FORMAT WORD-SIZE VALUE.");
fb40c209
AC
1040 return MI_CMD_ERROR;
1041 }
1042
1043 /* Extract all the arguments. */
1044 /* Start address of the memory dump. */
1045 addr = parse_and_eval_address (argv[0]);
1046 /* The format character to use when displaying a memory word. See
1047 the ``x'' command. */
1048 word_format = argv[1][0];
1049 /* The size of the memory word. */
1050 word_size = atol (argv[2]);
1051
1052 /* Calculate the real address of the write destination. */
1053 addr += (offset * word_size);
1054
1055 /* Get the value as a number */
1056 value = parse_and_eval_address (argv[3]);
1057 /* Get the value into an array */
d8bf3afa
KB
1058 buffer = xmalloc (word_size);
1059 old_chain = make_cleanup (xfree, buffer);
fb40c209
AC
1060 store_signed_integer (buffer, word_size, value);
1061 /* Write it down to memory */
1062 write_memory (addr, buffer, word_size);
d8bf3afa
KB
1063 /* Free the buffer. */
1064 do_cleanups (old_chain);
fb40c209
AC
1065
1066 return MI_CMD_DONE;
1067}
1068
8d34ea23
KS
1069/* Execute a command within a safe environment.
1070 Return <0 for error; >=0 for ok.
1071
1072 args->action will tell mi_execute_command what action
1073 to perfrom after the given command has executed (display/supress
1074 prompt, display error). */
fb40c209
AC
1075
1076static int
8d34ea23 1077captured_mi_execute_command (struct ui_out *uiout, void *data)
fb40c209 1078{
8d34ea23
KS
1079 struct captured_mi_execute_command_args *args =
1080 (struct captured_mi_execute_command_args *) data;
1081 struct mi_parse *context = args->command;
fb40c209
AC
1082
1083 switch (context->op)
1084 {
1085
1086 case MI_COMMAND:
1087 /* A MI command was read from the input stream */
1088 if (mi_debug_p)
1089 /* FIXME: gdb_???? */
1090 fprintf_unfiltered (raw_stdout, " token=`%s' command=`%s' args=`%s'\n",
1091 context->token, context->command, context->args);
1092 /* FIXME: cagney/1999-09-25: Rather than this convoluted
1093 condition expression, each function should return an
1094 indication of what action is required and then switch on
1095 that. */
8d34ea23
KS
1096 args->action = EXECUTE_COMMAND_DISPLAY_PROMPT;
1097 args->rc = mi_cmd_execute (context);
1098
fb40c209
AC
1099 if (!target_can_async_p () || !target_executing)
1100 {
1101 /* print the result if there were no errors */
8d34ea23 1102 if (args->rc == MI_CMD_DONE)
fb40c209
AC
1103 {
1104 fputs_unfiltered (context->token, raw_stdout);
1105 fputs_unfiltered ("^done", raw_stdout);
1106 mi_out_put (uiout, raw_stdout);
1107 mi_out_rewind (uiout);
1108 fputs_unfiltered ("\n", raw_stdout);
1109 }
8d34ea23 1110 else if (args->rc == MI_CMD_ERROR)
fb40c209
AC
1111 {
1112 if (mi_error_message)
1113 {
1114 fputs_unfiltered (context->token, raw_stdout);
1115 fputs_unfiltered ("^error,msg=\"", raw_stdout);
1116 fputstr_unfiltered (mi_error_message, '"', raw_stdout);
b8c9b27d 1117 xfree (mi_error_message);
fb40c209
AC
1118 fputs_unfiltered ("\"\n", raw_stdout);
1119 }
1120 mi_out_rewind (uiout);
1121 }
8d34ea23 1122 else if (args->rc == MI_CMD_CAUGHT_ERROR)
fb40c209
AC
1123 {
1124 mi_out_rewind (uiout);
8d34ea23
KS
1125 args->action = EXECUTE_COMMAND_DISPLAY_ERROR;
1126 return 1;
fb40c209
AC
1127 }
1128 else
1129 mi_out_rewind (uiout);
1130 }
1131 else if (sync_execution)
8d34ea23
KS
1132 {
1133 /* Don't print the prompt. We are executing the target in
1134 synchronous mode. */
1135 args->action = EXECUTE_COMMAND_SUPRESS_PROMPT;
1136 return 1;
1137 }
fb40c209
AC
1138 break;
1139
1140 case CLI_COMMAND:
1141 /* A CLI command was read from the input stream */
1142 /* This will be removed as soon as we have a complete set of
1143 mi commands */
1144 /* echo the command on the console. */
1145 fprintf_unfiltered (gdb_stdlog, "%s\n", context->command);
1146 /* FIXME: If the command string has something that looks like
1147 a format spec (e.g. %s) we will get a core dump */
1148 mi_execute_cli_command ("%s", context->command);
1149 /* print the result */
1150 /* FIXME: Check for errors here. */
1151 fputs_unfiltered (context->token, raw_stdout);
1152 fputs_unfiltered ("^done", raw_stdout);
1153 mi_out_put (uiout, raw_stdout);
1154 mi_out_rewind (uiout);
1155 fputs_unfiltered ("\n", raw_stdout);
8d34ea23
KS
1156 args->action = EXECUTE_COMMAND_DISPLAY_PROMPT;
1157 args->rc = MI_CMD_DONE;
fb40c209
AC
1158 break;
1159
1160 }
8d34ea23 1161
fb40c209
AC
1162 return 1;
1163}
1164
1165
1166void
1167mi_execute_command (char *cmd, int from_tty)
1168{
1169 struct mi_parse *command;
8d34ea23
KS
1170 struct captured_mi_execute_command_args args;
1171 struct ui_out *saved_uiout = uiout;
1172 int result, rc;
fb40c209
AC
1173
1174 /* This is to handle EOF (^D). We just quit gdb. */
1175 /* FIXME: we should call some API function here. */
1176 if (cmd == 0)
1177 quit_force (NULL, from_tty);
1178
1179 command = mi_parse (cmd);
1180
1181 if (command != NULL)
1182 {
8d34ea23 1183 /* FIXME: cagney/1999-11-04: Can this use of catch_exceptions either
fb40c209 1184 be pushed even further down or even eliminated? */
8d34ea23
KS
1185 args.command = command;
1186 result = catch_exceptions (uiout, captured_mi_execute_command, &args, "",
1187 RETURN_MASK_ALL);
1188
1189 if (args.action == EXECUTE_COMMAND_SUPRESS_PROMPT)
fb40c209
AC
1190 {
1191 /* The command is executing synchronously. Bail out early
1192 suppressing the finished prompt. */
1193 mi_parse_free (command);
1194 return;
1195 }
8d34ea23 1196 if (args.action == EXECUTE_COMMAND_DISPLAY_ERROR || result < 0)
fb40c209
AC
1197 {
1198 char *msg = error_last_message ();
b8c9b27d 1199 struct cleanup *cleanup = make_cleanup (xfree, msg);
fb40c209
AC
1200 /* The command execution failed and error() was called
1201 somewhere */
1202 fputs_unfiltered (command->token, raw_stdout);
1203 fputs_unfiltered ("^error,msg=\"", raw_stdout);
1204 fputstr_unfiltered (msg, '"', raw_stdout);
1205 fputs_unfiltered ("\"\n", raw_stdout);
1206 }
1207 mi_parse_free (command);
1208 }
1209
fb40c209 1210 fputs_unfiltered ("(gdb) \n", raw_stdout);
a433f9e4 1211 gdb_flush (raw_stdout);
fb40c209
AC
1212 /* print any buffered hook code */
1213 /* ..... */
1214}
1215
1216static enum mi_cmd_result
1217mi_cmd_execute (struct mi_parse *parse)
1218{
1219 if (parse->cmd->argv_func != NULL
1220 || parse->cmd->args_func != NULL)
1221 {
1222 /* FIXME: We need to save the token because the command executed
1223 may be asynchronous and need to print the token again.
1224 In the future we can pass the token down to the func
1225 and get rid of the last_async_command */
1226 /* The problem here is to keep the token around when we launch
1227 the target, and we want to interrupt it later on. The
1228 interrupt command will have its own token, but when the
1229 target stops, we must display the token corresponding to the
1230 last execution command given. So we have another string where
1231 we copy the token (previous_async_command), if this was
1232 indeed the token of an execution command, and when we stop we
1233 print that one. This is possible because the interrupt
1234 command, when over, will copy that token back into the
1235 default token string (last_async_command). */
1236
1237 if (target_executing)
1238 {
1239 if (!previous_async_command)
1240 previous_async_command = xstrdup (last_async_command);
1241 if (strcmp (parse->command, "exec-interrupt"))
1242 {
1243 fputs_unfiltered (parse->token, raw_stdout);
1244 fputs_unfiltered ("^error,msg=\"", raw_stdout);
1245 fputs_unfiltered ("Cannot execute command ", raw_stdout);
1246 fputstr_unfiltered (parse->command, '"', raw_stdout);
1247 fputs_unfiltered (" while target running", raw_stdout);
1248 fputs_unfiltered ("\"\n", raw_stdout);
1249 return MI_CMD_ERROR;
1250 }
1251 }
1252 last_async_command = xstrdup (parse->token);
e2f9c474 1253 make_exec_cleanup (free_current_contents, &last_async_command);
fb40c209
AC
1254 /* FIXME: DELETE THIS! */
1255 if (parse->cmd->args_func != NULL)
1256 return parse->cmd->args_func (parse->args, 0 /*from_tty */ );
1257 return parse->cmd->argv_func (parse->command, parse->argv, parse->argc);
1258 }
1259 else if (parse->cmd->cli != 0)
1260 {
1261 /* FIXME: DELETE THIS. */
1262 /* The operation is still implemented by a cli command */
1263 /* Must be a synchronous one */
1264 mi_execute_cli_command (parse->cmd->cli, parse->args);
1265 return MI_CMD_DONE;
1266 }
1267 else
1268 {
1269 /* FIXME: DELETE THIS. */
1270 fputs_unfiltered (parse->token, raw_stdout);
1271 fputs_unfiltered ("^error,msg=\"", raw_stdout);
1272 fputs_unfiltered ("Undefined mi command: ", raw_stdout);
1273 fputstr_unfiltered (parse->command, '"', raw_stdout);
1274 fputs_unfiltered (" (missing implementation)", raw_stdout);
1275 fputs_unfiltered ("\"\n", raw_stdout);
1276 return MI_CMD_ERROR;
1277 }
1278}
1279
fb40c209
AC
1280static void
1281mi_execute_command_wrapper (char *cmd)
1282{
1283 mi_execute_command (cmd, stdin == instream);
1284}
1285
1286/* FIXME: This is just a hack so we can get some extra commands going.
1287 We don't want to channel things through the CLI, but call libgdb directly */
1288/* Use only for synchronous commands */
1289
1290void
1291mi_execute_cli_command (const char *cli, char *args)
1292{
1293 if (cli != 0)
1294 {
1295 struct cleanup *old_cleanups;
1296 char *run;
76995688 1297 xasprintf (&run, cli, args);
fb40c209
AC
1298 if (mi_debug_p)
1299 /* FIXME: gdb_???? */
1300 fprintf_unfiltered (gdb_stdout, "cli=%s run=%s\n",
1301 cli, run);
b8c9b27d 1302 old_cleanups = make_cleanup (xfree, run);
fb40c209
AC
1303 execute_command ( /*ui */ run, 0 /*from_tty */ );
1304 do_cleanups (old_cleanups);
1305 return;
1306 }
1307}
1308
1309enum mi_cmd_result
1310mi_execute_async_cli_command (char *mi, char *args, int from_tty)
1311{
1312 struct cleanup *old_cleanups;
1313 char *run;
1314 char *async_args;
1315
1316 if (target_can_async_p ())
1317 {
1318 async_args = (char *) xmalloc (strlen (args) + 2);
1319 make_exec_cleanup (free, async_args);
1320 strcpy (async_args, args);
1321 strcat (async_args, "&");
76995688 1322 xasprintf (&run, "%s %s", mi, async_args);
fb40c209
AC
1323 make_exec_cleanup (free, run);
1324 add_continuation (mi_exec_async_cli_cmd_continuation, NULL);
6311b07d 1325 old_cleanups = NULL;
fb40c209
AC
1326 }
1327 else
1328 {
76995688 1329 xasprintf (&run, "%s %s", mi, args);
b8c9b27d 1330 old_cleanups = make_cleanup (xfree, run);
fb40c209
AC
1331 }
1332
1333 if (!target_can_async_p ())
1334 {
1335 /* NOTE: For synchronous targets asynchronous behavour is faked by
1336 printing out the GDB prompt before we even try to execute the
1337 command. */
1338 if (last_async_command)
1339 fputs_unfiltered (last_async_command, raw_stdout);
1340 fputs_unfiltered ("^running\n", raw_stdout);
1341 fputs_unfiltered ("(gdb) \n", raw_stdout);
a433f9e4 1342 gdb_flush (raw_stdout);
fb40c209
AC
1343 }
1344 else
1345 {
1346 /* FIXME: cagney/1999-11-29: Printing this message before
1347 calling execute_command is wrong. It should only be printed
1348 once gdb has confirmed that it really has managed to send a
1349 run command to the target. */
1350 if (last_async_command)
1351 fputs_unfiltered (last_async_command, raw_stdout);
1352 fputs_unfiltered ("^running\n", raw_stdout);
1353 }
1354
1355 execute_command ( /*ui */ run, 0 /*from_tty */ );
1356
1357 if (!target_can_async_p ())
1358 {
1359 /* Do this before doing any printing. It would appear that some
1360 print code leaves garbage around in the buffer. */
1361 do_cleanups (old_cleanups);
1362 /* If the target was doing the operation synchronously we fake
1363 the stopped message. */
1364 if (last_async_command)
1365 fputs_unfiltered (last_async_command, raw_stdout);
1366 fputs_unfiltered ("*stopped", raw_stdout);
1367 mi_out_put (uiout, raw_stdout);
1368 mi_out_rewind (uiout);
1369 fputs_unfiltered ("\n", raw_stdout);
1370 return MI_CMD_QUIET;
1371 }
1372 return MI_CMD_DONE;
1373}
1374
1375void
1376mi_exec_async_cli_cmd_continuation (struct continuation_arg *arg)
1377{
1378 if (last_async_command)
1379 fputs_unfiltered (last_async_command, raw_stdout);
1380 fputs_unfiltered ("*stopped", raw_stdout);
1381 mi_out_put (uiout, raw_stdout);
1382 fputs_unfiltered ("\n", raw_stdout);
1383 fputs_unfiltered ("(gdb) \n", raw_stdout);
a433f9e4 1384 gdb_flush (raw_stdout);
fb40c209
AC
1385 do_exec_cleanups (ALL_CLEANUPS);
1386}
1387
1388static char *
1389mi_input (char *buf)
1390{
1391 return gdb_readline (NULL);
1392}
1393
1394static void
1395mi_load_progress (const char *section_name,
1396 unsigned long sent_so_far,
1397 unsigned long total_section,
1398 unsigned long total_sent,
1399 unsigned long grand_total)
1400{
1401 struct timeval time_now, delta, update_threshold;
1402 static struct timeval last_update;
1403 static char *previous_sect_name = NULL;
1404 int new_section;
1405
b30bf9ee 1406 if (!interpreter_p || strncmp (interpreter_p, "mi", 2) != 0)
fb40c209
AC
1407 return;
1408
1409 update_threshold.tv_sec = 0;
1410 update_threshold.tv_usec = 500000;
1411 gettimeofday (&time_now, NULL);
1412
1413 delta.tv_usec = time_now.tv_usec - last_update.tv_usec;
1414 delta.tv_sec = time_now.tv_sec - last_update.tv_sec;
1415
1416 if (delta.tv_usec < 0)
1417 {
1418 delta.tv_sec -= 1;
1419 delta.tv_usec += 1000000;
1420 }
1421
1422 new_section = (previous_sect_name ?
1423 strcmp (previous_sect_name, section_name) : 1);
1424 if (new_section)
1425 {
6ad4a2cf 1426 struct cleanup *cleanup_tuple;
b8c9b27d 1427 xfree (previous_sect_name);
fb40c209
AC
1428 previous_sect_name = xstrdup (section_name);
1429
1430 if (last_async_command)
1431 fputs_unfiltered (last_async_command, raw_stdout);
1432 fputs_unfiltered ("+download", raw_stdout);
6ad4a2cf 1433 cleanup_tuple = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
fb40c209
AC
1434 ui_out_field_string (uiout, "section", section_name);
1435 ui_out_field_int (uiout, "section-size", total_section);
1436 ui_out_field_int (uiout, "total-size", grand_total);
6ad4a2cf 1437 do_cleanups (cleanup_tuple);
fb40c209
AC
1438 mi_out_put (uiout, raw_stdout);
1439 fputs_unfiltered ("\n", raw_stdout);
1440 gdb_flush (raw_stdout);
1441 }
1442
1443 if (delta.tv_sec >= update_threshold.tv_sec &&
1444 delta.tv_usec >= update_threshold.tv_usec)
1445 {
6ad4a2cf 1446 struct cleanup *cleanup_tuple;
fb40c209
AC
1447 last_update.tv_sec = time_now.tv_sec;
1448 last_update.tv_usec = time_now.tv_usec;
1449 if (last_async_command)
1450 fputs_unfiltered (last_async_command, raw_stdout);
1451 fputs_unfiltered ("+download", raw_stdout);
6ad4a2cf 1452 cleanup_tuple = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
fb40c209
AC
1453 ui_out_field_string (uiout, "section", section_name);
1454 ui_out_field_int (uiout, "section-sent", sent_so_far);
1455 ui_out_field_int (uiout, "section-size", total_section);
1456 ui_out_field_int (uiout, "total-sent", total_sent);
1457 ui_out_field_int (uiout, "total-size", grand_total);
6ad4a2cf 1458 do_cleanups (cleanup_tuple);
fb40c209
AC
1459 mi_out_put (uiout, raw_stdout);
1460 fputs_unfiltered ("\n", raw_stdout);
1461 gdb_flush (raw_stdout);
1462 }
1463}
1464
1465static void
b30bf9ee 1466mi_command_loop (int mi_version)
fb40c209 1467{
e78c0063
JJ
1468 if (mi_version <= 1)
1469 {
1470 /* HACK: Force stdout/stderr to point at the console. This avoids
1471 any potential side effects caused by legacy code that is still
1472 using the TUI / fputs_unfiltered_hook */
1473 raw_stdout = stdio_fileopen (stdout);
1474 /* Route normal output through the MIx */
1475 gdb_stdout = mi_console_file_new (raw_stdout, "~");
1476 }
1477
fb40c209
AC
1478 /* Route error and log output through the MI */
1479 gdb_stderr = mi_console_file_new (raw_stdout, "&");
1480 gdb_stdlog = gdb_stderr;
1481 /* Route target output through the MI. */
1482 gdb_stdtarg = mi_console_file_new (raw_stdout, "@");
1483
1484 /* HACK: Poke the ui_out table directly. Should we be creating a
1485 mi_out object wired up to the above gdb_stdout / gdb_stderr? */
b30bf9ee 1486 uiout = mi_out_new (mi_version);
fb40c209
AC
1487
1488 /* HACK: Override any other interpreter hooks. We need to create a
1489 real event table and pass in that. */
1490 init_ui_hook = 0;
1491 /* command_loop_hook = 0; */
1492 print_frame_info_listing_hook = 0;
1493 query_hook = 0;
1494 warning_hook = 0;
1495 create_breakpoint_hook = 0;
1496 delete_breakpoint_hook = 0;
1497 modify_breakpoint_hook = 0;
1498 interactive_hook = 0;
1499 registers_changed_hook = 0;
1500 readline_begin_hook = 0;
1501 readline_hook = 0;
1502 readline_end_hook = 0;
1503 register_changed_hook = 0;
1504 memory_changed_hook = 0;
1505 context_hook = 0;
1506 target_wait_hook = 0;
1507 call_command_hook = 0;
1508 error_hook = 0;
1509 error_begin_hook = 0;
1510 show_load_progress = mi_load_progress;
1511
1512 /* Turn off 8 bit strings in quoted output. Any character with the
1513 high bit set is printed using C's octal format. */
1514 sevenbit_strings = 1;
1515
1516 /* Tell the world that we're alive */
1517 fputs_unfiltered ("(gdb) \n", raw_stdout);
a433f9e4 1518 gdb_flush (raw_stdout);
fb40c209
AC
1519
1520 if (!event_loop_p)
1521 simplified_command_loop (mi_input, mi_execute_command);
1522 else
1523 start_event_loop ();
1524}
1525
b30bf9ee 1526static void
da0f9dcd 1527mi1_command_loop (void)
b30bf9ee 1528{
da0f9dcd 1529 mi_command_loop (1);
b30bf9ee
AC
1530}
1531
1532static void
da0f9dcd 1533mi2_command_loop (void)
b30bf9ee 1534{
da0f9dcd 1535 mi_command_loop (2);
b30bf9ee
AC
1536}
1537
fb40c209 1538static void
fba45db2 1539setup_architecture_data (void)
fb40c209
AC
1540{
1541 /* don't trust REGISTER_BYTES to be zero. */
1542 old_regs = xmalloc (REGISTER_BYTES + 1);
1543 memset (old_regs, 0, REGISTER_BYTES + 1);
1544}
1545
1546static void
fba45db2 1547mi_init_ui (char *arg0)
fb40c209 1548{
e78c0063
JJ
1549 if (strlen (interpreter_p) <= 2 ||
1550 interpreter_p[2] > '1')
1551 {
1552 /* HACK: Force stdout/stderr to point at the console. This avoids
1553 any potential side effects caused by legacy code that is still
1554 using the TUI / fputs_unfiltered_hook */
1555 raw_stdout = stdio_fileopen (stdout);
1556 /* Route normal output through the MIx */
1557 gdb_stdout = mi_console_file_new (raw_stdout, "~");
1558 }
fb40c209
AC
1559}
1560
1561void
fba45db2 1562_initialize_mi_main (void)
fb40c209 1563{
b30bf9ee
AC
1564 if (interpreter_p == NULL)
1565 return;
1566
fb40c209 1567 /* If we're _the_ interpreter, take control. */
da0f9dcd
AC
1568 if (strcmp (interpreter_p, "mi") == 0)
1569 command_loop_hook = mi2_command_loop;
1570 else if (strcmp (interpreter_p, "mi1") == 0)
b30bf9ee 1571 command_loop_hook = mi1_command_loop;
da0f9dcd
AC
1572 else if (strcmp (interpreter_p, "mi2") == 0)
1573 command_loop_hook = mi2_command_loop;
b30bf9ee
AC
1574 else
1575 return;
1576
1577 init_ui_hook = mi_init_ui;
1578 setup_architecture_data ();
1579 register_gdbarch_swap (&old_regs, sizeof (old_regs), NULL);
1580 register_gdbarch_swap (NULL, 0, setup_architecture_data);
1581 if (event_loop_p)
fb40c209 1582 {
b30bf9ee
AC
1583 /* These overwrite some of the initialization done in
1584 _intialize_event_loop. */
1585 call_readline = gdb_readline2;
1586 input_handler = mi_execute_command_wrapper;
1587 add_file_handler (input_fd, stdin_event_handler, 0);
1588 async_command_editing_p = 0;
fb40c209
AC
1589 }
1590 /* FIXME: Should we notify main that we are here as a possible
1591 interpreter? */
1592}
This page took 0.294145 seconds and 4 git commands to generate.