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