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