gdb: Don't allow annotations to influence what else GDB prints
[deliverable/binutils-gdb.git] / gdb / mi / mi-cmds.c
CommitLineData
4389a95a 1/* MI Command Set for GDB, the GNU debugger.
42a4f53d 2 Copyright (C) 2000-2019 Free Software Foundation, Inc.
4389a95a 3
ab91fdd5 4 Contributed by Cygnus Solutions (a Red Hat company).
fb40c209
AC
5
6 This file is part of GDB.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
a9762ec7 10 the Free Software Foundation; either version 3 of the License, or
fb40c209
AC
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
a9762ec7 19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
fb40c209
AC
20
21#include "defs.h"
22#include "top.h"
23#include "mi-cmds.h"
648beb2b 24#include "mi-main.h"
fb40c209 25
fb40c209
AC
26struct mi_cmd;
27static struct mi_cmd **lookup_table (const char *command);
28static void build_table (struct mi_cmd *commands);
29
ef07a9f7 30static struct mi_cmd mi_cmds[] =
fb40c209 31{
648beb2b
YQ
32/* Define a MI command of NAME, and its corresponding CLI command is
33 CLI_NAME. */
34#define DEF_MI_CMD_CLI_1(NAME, CLI_NAME, ARGS_P, CALLED) \
35 { NAME, { CLI_NAME, ARGS_P}, NULL, CALLED }
36#define DEF_MI_CMD_CLI(NAME, CLI_NAME, ARGS_P) \
37 DEF_MI_CMD_CLI_1(NAME, CLI_NAME, ARGS_P, NULL)
38
39/* Define a MI command of NAME, and implemented by function MI_FUNC. */
40#define DEF_MI_CMD_MI_1(NAME, MI_FUNC, CALLED) \
41 { NAME, {NULL, 0}, MI_FUNC, CALLED }
42#define DEF_MI_CMD_MI(NAME, MI_FUNC) DEF_MI_CMD_MI_1(NAME, MI_FUNC, NULL)
43
44 DEF_MI_CMD_MI ("ada-task-info", mi_cmd_ada_task_info),
45 DEF_MI_CMD_MI ("add-inferior", mi_cmd_add_inferior),
46 DEF_MI_CMD_CLI_1 ("break-after", "ignore", 1,
47 &mi_suppress_notification.breakpoint),
48 DEF_MI_CMD_CLI_1 ("break-condition","cond", 1,
49 &mi_suppress_notification.breakpoint),
50 DEF_MI_CMD_MI_1 ("break-commands", mi_cmd_break_commands,
51 &mi_suppress_notification.breakpoint),
52 DEF_MI_CMD_CLI_1 ("break-delete", "delete breakpoint", 1,
53 &mi_suppress_notification.breakpoint),
54 DEF_MI_CMD_CLI_1 ("break-disable", "disable breakpoint", 1,
55 &mi_suppress_notification.breakpoint),
56 DEF_MI_CMD_CLI_1 ("break-enable", "enable breakpoint", 1,
57 &mi_suppress_notification.breakpoint),
58 DEF_MI_CMD_CLI ("break-info", "info break", 1),
59 DEF_MI_CMD_MI_1 ("break-insert", mi_cmd_break_insert,
60 &mi_suppress_notification.breakpoint),
c5867ab6
HZ
61 DEF_MI_CMD_MI_1 ("dprintf-insert", mi_cmd_dprintf_insert,
62 &mi_suppress_notification.breakpoint),
648beb2b
YQ
63 DEF_MI_CMD_CLI ("break-list", "info break", 0),
64 DEF_MI_CMD_MI_1 ("break-passcount", mi_cmd_break_passcount,
65 &mi_suppress_notification.breakpoint),
66 DEF_MI_CMD_MI_1 ("break-watch", mi_cmd_break_watch,
67 &mi_suppress_notification.breakpoint),
349774ef
JB
68 DEF_MI_CMD_MI_1 ("catch-assert", mi_cmd_catch_assert,
69 &mi_suppress_notification.breakpoint),
70 DEF_MI_CMD_MI_1 ("catch-exception", mi_cmd_catch_exception,
71 &mi_suppress_notification.breakpoint),
bea298f9
XR
72 DEF_MI_CMD_MI_1 ("catch-handlers", mi_cmd_catch_handlers,
73 &mi_suppress_notification.breakpoint),
91985142
MG
74 DEF_MI_CMD_MI_1 ("catch-load", mi_cmd_catch_load,
75 &mi_suppress_notification.breakpoint),
76 DEF_MI_CMD_MI_1 ("catch-unload", mi_cmd_catch_unload,
77 &mi_suppress_notification.breakpoint),
26648588 78 DEF_MI_CMD_MI ("complete", mi_cmd_complete),
648beb2b
YQ
79 DEF_MI_CMD_MI ("data-disassemble", mi_cmd_disassemble),
80 DEF_MI_CMD_MI ("data-evaluate-expression", mi_cmd_data_evaluate_expression),
81 DEF_MI_CMD_MI ("data-list-changed-registers",
82 mi_cmd_data_list_changed_registers),
83 DEF_MI_CMD_MI ("data-list-register-names", mi_cmd_data_list_register_names),
84 DEF_MI_CMD_MI ("data-list-register-values", mi_cmd_data_list_register_values),
85 DEF_MI_CMD_MI ("data-read-memory", mi_cmd_data_read_memory),
86 DEF_MI_CMD_MI ("data-read-memory-bytes", mi_cmd_data_read_memory_bytes),
8de0566d
YQ
87 DEF_MI_CMD_MI_1 ("data-write-memory", mi_cmd_data_write_memory,
88 &mi_suppress_notification.memory),
89 DEF_MI_CMD_MI_1 ("data-write-memory-bytes", mi_cmd_data_write_memory_bytes,
90 &mi_suppress_notification.memory),
648beb2b
YQ
91 DEF_MI_CMD_MI ("data-write-register-values",
92 mi_cmd_data_write_register_values),
93 DEF_MI_CMD_MI ("enable-timings", mi_cmd_enable_timings),
94 DEF_MI_CMD_MI ("enable-pretty-printing", mi_cmd_enable_pretty_printing),
1e611234 95 DEF_MI_CMD_MI ("enable-frame-filters", mi_cmd_enable_frame_filters),
648beb2b
YQ
96 DEF_MI_CMD_MI ("environment-cd", mi_cmd_env_cd),
97 DEF_MI_CMD_MI ("environment-directory", mi_cmd_env_dir),
98 DEF_MI_CMD_MI ("environment-path", mi_cmd_env_path),
99 DEF_MI_CMD_MI ("environment-pwd", mi_cmd_env_pwd),
62a813cc
YQ
100 DEF_MI_CMD_CLI_1 ("exec-arguments", "set args", 1,
101 &mi_suppress_notification.cmd_param_changed),
648beb2b
YQ
102 DEF_MI_CMD_MI ("exec-continue", mi_cmd_exec_continue),
103 DEF_MI_CMD_MI ("exec-finish", mi_cmd_exec_finish),
104 DEF_MI_CMD_MI ("exec-jump", mi_cmd_exec_jump),
105 DEF_MI_CMD_MI ("exec-interrupt", mi_cmd_exec_interrupt),
106 DEF_MI_CMD_MI ("exec-next", mi_cmd_exec_next),
107 DEF_MI_CMD_MI ("exec-next-instruction", mi_cmd_exec_next_instruction),
108 DEF_MI_CMD_MI ("exec-return", mi_cmd_exec_return),
109 DEF_MI_CMD_MI ("exec-run", mi_cmd_exec_run),
110 DEF_MI_CMD_MI ("exec-step", mi_cmd_exec_step),
111 DEF_MI_CMD_MI ("exec-step-instruction", mi_cmd_exec_step_instruction),
112 DEF_MI_CMD_CLI ("exec-until", "until", 1),
113 DEF_MI_CMD_CLI ("file-exec-and-symbols", "file", 1),
114 DEF_MI_CMD_CLI ("file-exec-file", "exec-file", 1),
115 DEF_MI_CMD_MI ("file-list-exec-source-file",
116 mi_cmd_file_list_exec_source_file),
117 DEF_MI_CMD_MI ("file-list-exec-source-files",
118 mi_cmd_file_list_exec_source_files),
51457a05
MAL
119 DEF_MI_CMD_MI ("file-list-shared-libraries",
120 mi_cmd_file_list_shared_libraries),
648beb2b 121 DEF_MI_CMD_CLI ("file-symbol-file", "symbol-file", 1),
b4be1b06
SM
122 DEF_MI_CMD_MI ("fix-multi-location-breakpoint-output",
123 mi_cmd_fix_multi_location_breakpoint_output),
648beb2b
YQ
124 DEF_MI_CMD_MI ("gdb-exit", mi_cmd_gdb_exit),
125 DEF_MI_CMD_CLI_1 ("gdb-set", "set", 1,
126 &mi_suppress_notification.cmd_param_changed),
127 DEF_MI_CMD_CLI ("gdb-show", "show", 1),
128 DEF_MI_CMD_CLI ("gdb-version", "show version", 0),
129 DEF_MI_CMD_MI ("inferior-tty-set", mi_cmd_inferior_tty_set),
130 DEF_MI_CMD_MI ("inferior-tty-show", mi_cmd_inferior_tty_show),
a7e332c2 131 DEF_MI_CMD_MI ("info-ada-exceptions", mi_cmd_info_ada_exceptions),
6b7cbff1 132 DEF_MI_CMD_MI ("info-gdb-mi-command", mi_cmd_info_gdb_mi_command),
648beb2b
YQ
133 DEF_MI_CMD_MI ("info-os", mi_cmd_info_os),
134 DEF_MI_CMD_MI ("interpreter-exec", mi_cmd_interpreter_exec),
135 DEF_MI_CMD_MI ("list-features", mi_cmd_list_features),
136 DEF_MI_CMD_MI ("list-target-features", mi_cmd_list_target_features),
137 DEF_MI_CMD_MI ("list-thread-groups", mi_cmd_list_thread_groups),
138 DEF_MI_CMD_MI ("remove-inferior", mi_cmd_remove_inferior),
139 DEF_MI_CMD_MI ("stack-info-depth", mi_cmd_stack_info_depth),
140 DEF_MI_CMD_MI ("stack-info-frame", mi_cmd_stack_info_frame),
141 DEF_MI_CMD_MI ("stack-list-arguments", mi_cmd_stack_list_args),
142 DEF_MI_CMD_MI ("stack-list-frames", mi_cmd_stack_list_frames),
143 DEF_MI_CMD_MI ("stack-list-locals", mi_cmd_stack_list_locals),
144 DEF_MI_CMD_MI ("stack-list-variables", mi_cmd_stack_list_variables),
4034d0ff
AT
145 DEF_MI_CMD_MI_1 ("stack-select-frame", mi_cmd_stack_select_frame,
146 &mi_suppress_notification.user_selected_context),
648beb2b
YQ
147 DEF_MI_CMD_MI ("symbol-list-lines", mi_cmd_symbol_list_lines),
148 DEF_MI_CMD_CLI ("target-attach", "attach", 1),
149 DEF_MI_CMD_MI ("target-detach", mi_cmd_target_detach),
150 DEF_MI_CMD_CLI ("target-disconnect", "disconnect", 0),
151 DEF_MI_CMD_CLI ("target-download", "load", 1),
152 DEF_MI_CMD_MI ("target-file-delete", mi_cmd_target_file_delete),
153 DEF_MI_CMD_MI ("target-file-get", mi_cmd_target_file_get),
154 DEF_MI_CMD_MI ("target-file-put", mi_cmd_target_file_put),
78cbbba8 155 DEF_MI_CMD_MI ("target-flash-erase", mi_cmd_target_flash_erase),
648beb2b
YQ
156 DEF_MI_CMD_CLI ("target-select", "target", 1),
157 DEF_MI_CMD_MI ("thread-info", mi_cmd_thread_info),
158 DEF_MI_CMD_MI ("thread-list-ids", mi_cmd_thread_list_ids),
4034d0ff
AT
159 DEF_MI_CMD_MI_1 ("thread-select", mi_cmd_thread_select,
160 &mi_suppress_notification.user_selected_context),
648beb2b 161 DEF_MI_CMD_MI ("trace-define-variable", mi_cmd_trace_define_variable),
201b4506
YQ
162 DEF_MI_CMD_MI_1 ("trace-find", mi_cmd_trace_find,
163 &mi_suppress_notification.traceframe),
dc673c81
YQ
164 DEF_MI_CMD_MI ("trace-frame-collected",
165 mi_cmd_trace_frame_collected),
648beb2b
YQ
166 DEF_MI_CMD_MI ("trace-list-variables", mi_cmd_trace_list_variables),
167 DEF_MI_CMD_MI ("trace-save", mi_cmd_trace_save),
168 DEF_MI_CMD_MI ("trace-start", mi_cmd_trace_start),
169 DEF_MI_CMD_MI ("trace-status", mi_cmd_trace_status),
170 DEF_MI_CMD_MI ("trace-stop", mi_cmd_trace_stop),
171 DEF_MI_CMD_MI ("var-assign", mi_cmd_var_assign),
172 DEF_MI_CMD_MI ("var-create", mi_cmd_var_create),
173 DEF_MI_CMD_MI ("var-delete", mi_cmd_var_delete),
174 DEF_MI_CMD_MI ("var-evaluate-expression", mi_cmd_var_evaluate_expression),
175 DEF_MI_CMD_MI ("var-info-path-expression", mi_cmd_var_info_path_expression),
176 DEF_MI_CMD_MI ("var-info-expression", mi_cmd_var_info_expression),
177 DEF_MI_CMD_MI ("var-info-num-children", mi_cmd_var_info_num_children),
178 DEF_MI_CMD_MI ("var-info-type", mi_cmd_var_info_type),
179 DEF_MI_CMD_MI ("var-list-children", mi_cmd_var_list_children),
180 DEF_MI_CMD_MI ("var-set-format", mi_cmd_var_set_format),
181 DEF_MI_CMD_MI ("var-set-frozen", mi_cmd_var_set_frozen),
182 DEF_MI_CMD_MI ("var-set-update-range", mi_cmd_var_set_update_range),
183 DEF_MI_CMD_MI ("var-set-visualizer", mi_cmd_var_set_visualizer),
184 DEF_MI_CMD_MI ("var-show-attributes", mi_cmd_var_show_attributes),
185 DEF_MI_CMD_MI ("var-show-format", mi_cmd_var_show_format),
186 DEF_MI_CMD_MI ("var-update", mi_cmd_var_update),
b2af646b 187 { NULL, }
fb40c209
AC
188};
189
2b03b41d 190/* Pointer to the mi command table (built at run time). */
fb40c209
AC
191
192static struct mi_cmd **mi_table;
193
2b03b41d 194/* A prime large enough to accomodate the entire command table. */
fb40c209
AC
195enum
196 {
197 MI_TABLE_SIZE = 227
198 };
199
2b03b41d 200/* Exported function used to obtain info from the table. */
fb40c209
AC
201struct mi_cmd *
202mi_lookup (const char *command)
203{
204 return *lookup_table (command);
205}
206
2b03b41d
SS
207/* Used for collecting hash hit/miss statistics. */
208
fb40c209
AC
209struct mi_cmd_stats
210{
211 int hit;
212 int miss;
213 int rehash;
214};
215struct mi_cmd_stats stats;
216
2b03b41d
SS
217/* Look up a command. */
218
fb40c209
AC
219static struct mi_cmd **
220lookup_table (const char *command)
221{
222 const char *chp;
223 unsigned int index = 0;
102040f0 224
2b03b41d 225 /* Compute our hash. */
fb40c209
AC
226 for (chp = command; *chp; chp++)
227 {
2b03b41d 228 /* We use a somewhat arbitrary formula. */
fb40c209
AC
229 index = ((index << 6) + (unsigned int) *chp) % MI_TABLE_SIZE;
230 }
2b03b41d 231
fb40c209
AC
232 while (1)
233 {
234 struct mi_cmd **entry = &mi_table[index];
235 if ((*entry) == 0)
236 {
237 /* not found, return pointer to next free. */
238 stats.miss++;
239 return entry;
240 }
241 if (strcmp (command, (*entry)->name) == 0)
242 {
243 stats.hit++;
244 return entry; /* found */
245 }
246 index = (index + 1) % MI_TABLE_SIZE;
247 stats.rehash++;
248 }
249}
250
251static void
252build_table (struct mi_cmd *commands)
253{
254 int nr_rehash = 0;
255 int nr_entries = 0;
256 struct mi_cmd *command;
fb40c209 257
c4e54771 258 mi_table = XCNEWVEC (struct mi_cmd *, MI_TABLE_SIZE);
fb40c209
AC
259 for (command = commands; command->name != 0; command++)
260 {
261 struct mi_cmd **entry = lookup_table (command->name);
102040f0 262
fb40c209 263 if (*entry)
8e65ff28 264 internal_error (__FILE__, __LINE__,
e2e0b3e5 265 _("command `%s' appears to be duplicated"),
fb40c209
AC
266 command->name);
267 *entry = command;
2b03b41d 268 /* FIXME lose these prints */
fb40c209
AC
269 if (0)
270 {
271 fprintf_unfiltered (gdb_stdlog, "%-30s %2d\n",
272 command->name, stats.rehash - nr_rehash);
273 }
274 nr_entries++;
275 nr_rehash = stats.rehash;
276 }
277 if (0)
278 {
279 fprintf_filtered (gdb_stdlog, "Average %3.1f\n",
280 (double) nr_rehash / (double) nr_entries);
281 }
282}
283
284void
fba45db2 285_initialize_mi_cmds (void)
fb40c209
AC
286{
287 build_table (mi_cmds);
288 memset (&stats, 0, sizeof (stats));
289}
This page took 2.550173 seconds and 4 git commands to generate.