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