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