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