x86: drop a few dead macros
[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),
30056ea0
AB
78 DEF_MI_CMD_MI_1 ("catch-throw", mi_cmd_catch_throw,
79 &mi_suppress_notification.breakpoint),
80 DEF_MI_CMD_MI_1 ("catch-rethrow", mi_cmd_catch_rethrow,
81 &mi_suppress_notification.breakpoint),
82 DEF_MI_CMD_MI_1 ("catch-catch", mi_cmd_catch_catch,
83 &mi_suppress_notification.breakpoint),
26648588 84 DEF_MI_CMD_MI ("complete", mi_cmd_complete),
648beb2b
YQ
85 DEF_MI_CMD_MI ("data-disassemble", mi_cmd_disassemble),
86 DEF_MI_CMD_MI ("data-evaluate-expression", mi_cmd_data_evaluate_expression),
87 DEF_MI_CMD_MI ("data-list-changed-registers",
88 mi_cmd_data_list_changed_registers),
89 DEF_MI_CMD_MI ("data-list-register-names", mi_cmd_data_list_register_names),
90 DEF_MI_CMD_MI ("data-list-register-values", mi_cmd_data_list_register_values),
91 DEF_MI_CMD_MI ("data-read-memory", mi_cmd_data_read_memory),
92 DEF_MI_CMD_MI ("data-read-memory-bytes", mi_cmd_data_read_memory_bytes),
8de0566d
YQ
93 DEF_MI_CMD_MI_1 ("data-write-memory", mi_cmd_data_write_memory,
94 &mi_suppress_notification.memory),
95 DEF_MI_CMD_MI_1 ("data-write-memory-bytes", mi_cmd_data_write_memory_bytes,
96 &mi_suppress_notification.memory),
648beb2b
YQ
97 DEF_MI_CMD_MI ("data-write-register-values",
98 mi_cmd_data_write_register_values),
99 DEF_MI_CMD_MI ("enable-timings", mi_cmd_enable_timings),
100 DEF_MI_CMD_MI ("enable-pretty-printing", mi_cmd_enable_pretty_printing),
1e611234 101 DEF_MI_CMD_MI ("enable-frame-filters", mi_cmd_enable_frame_filters),
648beb2b
YQ
102 DEF_MI_CMD_MI ("environment-cd", mi_cmd_env_cd),
103 DEF_MI_CMD_MI ("environment-directory", mi_cmd_env_dir),
104 DEF_MI_CMD_MI ("environment-path", mi_cmd_env_path),
105 DEF_MI_CMD_MI ("environment-pwd", mi_cmd_env_pwd),
62a813cc
YQ
106 DEF_MI_CMD_CLI_1 ("exec-arguments", "set args", 1,
107 &mi_suppress_notification.cmd_param_changed),
648beb2b
YQ
108 DEF_MI_CMD_MI ("exec-continue", mi_cmd_exec_continue),
109 DEF_MI_CMD_MI ("exec-finish", mi_cmd_exec_finish),
110 DEF_MI_CMD_MI ("exec-jump", mi_cmd_exec_jump),
111 DEF_MI_CMD_MI ("exec-interrupt", mi_cmd_exec_interrupt),
112 DEF_MI_CMD_MI ("exec-next", mi_cmd_exec_next),
113 DEF_MI_CMD_MI ("exec-next-instruction", mi_cmd_exec_next_instruction),
114 DEF_MI_CMD_MI ("exec-return", mi_cmd_exec_return),
115 DEF_MI_CMD_MI ("exec-run", mi_cmd_exec_run),
116 DEF_MI_CMD_MI ("exec-step", mi_cmd_exec_step),
117 DEF_MI_CMD_MI ("exec-step-instruction", mi_cmd_exec_step_instruction),
118 DEF_MI_CMD_CLI ("exec-until", "until", 1),
119 DEF_MI_CMD_CLI ("file-exec-and-symbols", "file", 1),
120 DEF_MI_CMD_CLI ("file-exec-file", "exec-file", 1),
121 DEF_MI_CMD_MI ("file-list-exec-source-file",
122 mi_cmd_file_list_exec_source_file),
123 DEF_MI_CMD_MI ("file-list-exec-source-files",
124 mi_cmd_file_list_exec_source_files),
51457a05
MAL
125 DEF_MI_CMD_MI ("file-list-shared-libraries",
126 mi_cmd_file_list_shared_libraries),
648beb2b 127 DEF_MI_CMD_CLI ("file-symbol-file", "symbol-file", 1),
b4be1b06
SM
128 DEF_MI_CMD_MI ("fix-multi-location-breakpoint-output",
129 mi_cmd_fix_multi_location_breakpoint_output),
648beb2b
YQ
130 DEF_MI_CMD_MI ("gdb-exit", mi_cmd_gdb_exit),
131 DEF_MI_CMD_CLI_1 ("gdb-set", "set", 1,
132 &mi_suppress_notification.cmd_param_changed),
133 DEF_MI_CMD_CLI ("gdb-show", "show", 1),
134 DEF_MI_CMD_CLI ("gdb-version", "show version", 0),
135 DEF_MI_CMD_MI ("inferior-tty-set", mi_cmd_inferior_tty_set),
136 DEF_MI_CMD_MI ("inferior-tty-show", mi_cmd_inferior_tty_show),
a7e332c2 137 DEF_MI_CMD_MI ("info-ada-exceptions", mi_cmd_info_ada_exceptions),
6b7cbff1 138 DEF_MI_CMD_MI ("info-gdb-mi-command", mi_cmd_info_gdb_mi_command),
648beb2b
YQ
139 DEF_MI_CMD_MI ("info-os", mi_cmd_info_os),
140 DEF_MI_CMD_MI ("interpreter-exec", mi_cmd_interpreter_exec),
141 DEF_MI_CMD_MI ("list-features", mi_cmd_list_features),
142 DEF_MI_CMD_MI ("list-target-features", mi_cmd_list_target_features),
143 DEF_MI_CMD_MI ("list-thread-groups", mi_cmd_list_thread_groups),
144 DEF_MI_CMD_MI ("remove-inferior", mi_cmd_remove_inferior),
145 DEF_MI_CMD_MI ("stack-info-depth", mi_cmd_stack_info_depth),
146 DEF_MI_CMD_MI ("stack-info-frame", mi_cmd_stack_info_frame),
147 DEF_MI_CMD_MI ("stack-list-arguments", mi_cmd_stack_list_args),
148 DEF_MI_CMD_MI ("stack-list-frames", mi_cmd_stack_list_frames),
149 DEF_MI_CMD_MI ("stack-list-locals", mi_cmd_stack_list_locals),
150 DEF_MI_CMD_MI ("stack-list-variables", mi_cmd_stack_list_variables),
4034d0ff
AT
151 DEF_MI_CMD_MI_1 ("stack-select-frame", mi_cmd_stack_select_frame,
152 &mi_suppress_notification.user_selected_context),
648beb2b
YQ
153 DEF_MI_CMD_MI ("symbol-list-lines", mi_cmd_symbol_list_lines),
154 DEF_MI_CMD_CLI ("target-attach", "attach", 1),
155 DEF_MI_CMD_MI ("target-detach", mi_cmd_target_detach),
156 DEF_MI_CMD_CLI ("target-disconnect", "disconnect", 0),
157 DEF_MI_CMD_CLI ("target-download", "load", 1),
158 DEF_MI_CMD_MI ("target-file-delete", mi_cmd_target_file_delete),
159 DEF_MI_CMD_MI ("target-file-get", mi_cmd_target_file_get),
160 DEF_MI_CMD_MI ("target-file-put", mi_cmd_target_file_put),
78cbbba8 161 DEF_MI_CMD_MI ("target-flash-erase", mi_cmd_target_flash_erase),
648beb2b
YQ
162 DEF_MI_CMD_CLI ("target-select", "target", 1),
163 DEF_MI_CMD_MI ("thread-info", mi_cmd_thread_info),
164 DEF_MI_CMD_MI ("thread-list-ids", mi_cmd_thread_list_ids),
4034d0ff
AT
165 DEF_MI_CMD_MI_1 ("thread-select", mi_cmd_thread_select,
166 &mi_suppress_notification.user_selected_context),
648beb2b 167 DEF_MI_CMD_MI ("trace-define-variable", mi_cmd_trace_define_variable),
201b4506
YQ
168 DEF_MI_CMD_MI_1 ("trace-find", mi_cmd_trace_find,
169 &mi_suppress_notification.traceframe),
dc673c81
YQ
170 DEF_MI_CMD_MI ("trace-frame-collected",
171 mi_cmd_trace_frame_collected),
648beb2b
YQ
172 DEF_MI_CMD_MI ("trace-list-variables", mi_cmd_trace_list_variables),
173 DEF_MI_CMD_MI ("trace-save", mi_cmd_trace_save),
174 DEF_MI_CMD_MI ("trace-start", mi_cmd_trace_start),
175 DEF_MI_CMD_MI ("trace-status", mi_cmd_trace_status),
176 DEF_MI_CMD_MI ("trace-stop", mi_cmd_trace_stop),
177 DEF_MI_CMD_MI ("var-assign", mi_cmd_var_assign),
178 DEF_MI_CMD_MI ("var-create", mi_cmd_var_create),
179 DEF_MI_CMD_MI ("var-delete", mi_cmd_var_delete),
180 DEF_MI_CMD_MI ("var-evaluate-expression", mi_cmd_var_evaluate_expression),
181 DEF_MI_CMD_MI ("var-info-path-expression", mi_cmd_var_info_path_expression),
182 DEF_MI_CMD_MI ("var-info-expression", mi_cmd_var_info_expression),
183 DEF_MI_CMD_MI ("var-info-num-children", mi_cmd_var_info_num_children),
184 DEF_MI_CMD_MI ("var-info-type", mi_cmd_var_info_type),
185 DEF_MI_CMD_MI ("var-list-children", mi_cmd_var_list_children),
186 DEF_MI_CMD_MI ("var-set-format", mi_cmd_var_set_format),
187 DEF_MI_CMD_MI ("var-set-frozen", mi_cmd_var_set_frozen),
188 DEF_MI_CMD_MI ("var-set-update-range", mi_cmd_var_set_update_range),
189 DEF_MI_CMD_MI ("var-set-visualizer", mi_cmd_var_set_visualizer),
190 DEF_MI_CMD_MI ("var-show-attributes", mi_cmd_var_show_attributes),
191 DEF_MI_CMD_MI ("var-show-format", mi_cmd_var_show_format),
192 DEF_MI_CMD_MI ("var-update", mi_cmd_var_update),
b2af646b 193 { NULL, }
fb40c209
AC
194};
195
2b03b41d 196/* Pointer to the mi command table (built at run time). */
fb40c209
AC
197
198static struct mi_cmd **mi_table;
199
2b03b41d 200/* A prime large enough to accomodate the entire command table. */
fb40c209
AC
201enum
202 {
203 MI_TABLE_SIZE = 227
204 };
205
2b03b41d 206/* Exported function used to obtain info from the table. */
fb40c209
AC
207struct mi_cmd *
208mi_lookup (const char *command)
209{
210 return *lookup_table (command);
211}
212
2b03b41d
SS
213/* Used for collecting hash hit/miss statistics. */
214
fb40c209
AC
215struct mi_cmd_stats
216{
217 int hit;
218 int miss;
219 int rehash;
220};
221struct mi_cmd_stats stats;
222
2b03b41d
SS
223/* Look up a command. */
224
fb40c209
AC
225static struct mi_cmd **
226lookup_table (const char *command)
227{
228 const char *chp;
229 unsigned int index = 0;
102040f0 230
2b03b41d 231 /* Compute our hash. */
fb40c209
AC
232 for (chp = command; *chp; chp++)
233 {
2b03b41d 234 /* We use a somewhat arbitrary formula. */
fb40c209
AC
235 index = ((index << 6) + (unsigned int) *chp) % MI_TABLE_SIZE;
236 }
2b03b41d 237
fb40c209
AC
238 while (1)
239 {
240 struct mi_cmd **entry = &mi_table[index];
241 if ((*entry) == 0)
242 {
243 /* not found, return pointer to next free. */
244 stats.miss++;
245 return entry;
246 }
247 if (strcmp (command, (*entry)->name) == 0)
248 {
249 stats.hit++;
250 return entry; /* found */
251 }
252 index = (index + 1) % MI_TABLE_SIZE;
253 stats.rehash++;
254 }
255}
256
257static void
258build_table (struct mi_cmd *commands)
259{
260 int nr_rehash = 0;
261 int nr_entries = 0;
262 struct mi_cmd *command;
fb40c209 263
c4e54771 264 mi_table = XCNEWVEC (struct mi_cmd *, MI_TABLE_SIZE);
fb40c209
AC
265 for (command = commands; command->name != 0; command++)
266 {
267 struct mi_cmd **entry = lookup_table (command->name);
102040f0 268
fb40c209 269 if (*entry)
8e65ff28 270 internal_error (__FILE__, __LINE__,
e2e0b3e5 271 _("command `%s' appears to be duplicated"),
fb40c209
AC
272 command->name);
273 *entry = command;
2b03b41d 274 /* FIXME lose these prints */
fb40c209
AC
275 if (0)
276 {
277 fprintf_unfiltered (gdb_stdlog, "%-30s %2d\n",
278 command->name, stats.rehash - nr_rehash);
279 }
280 nr_entries++;
281 nr_rehash = stats.rehash;
282 }
283 if (0)
284 {
285 fprintf_filtered (gdb_stdlog, "Average %3.1f\n",
286 (double) nr_rehash / (double) nr_entries);
287 }
288}
289
290void
fba45db2 291_initialize_mi_cmds (void)
fb40c209
AC
292{
293 build_table (mi_cmds);
294 memset (&stats, 0, sizeof (stats));
295}
This page took 2.039167 seconds and 4 git commands to generate.