x86-64: accept 64-bit LFS/LGS/LSS forms with suffix or operand size specifier
[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 153 DEF_MI_CMD_MI ("symbol-list-lines", mi_cmd_symbol_list_lines),
7dc42066
AB
154 DEF_MI_CMD_MI ("symbol-info-functions", mi_cmd_symbol_info_functions),
155 DEF_MI_CMD_MI ("symbol-info-variables", mi_cmd_symbol_info_variables),
156 DEF_MI_CMD_MI ("symbol-info-types", mi_cmd_symbol_info_types),
db5960b4 157 DEF_MI_CMD_MI ("symbol-info-modules", mi_cmd_symbol_info_modules),
648beb2b
YQ
158 DEF_MI_CMD_CLI ("target-attach", "attach", 1),
159 DEF_MI_CMD_MI ("target-detach", mi_cmd_target_detach),
160 DEF_MI_CMD_CLI ("target-disconnect", "disconnect", 0),
161 DEF_MI_CMD_CLI ("target-download", "load", 1),
162 DEF_MI_CMD_MI ("target-file-delete", mi_cmd_target_file_delete),
163 DEF_MI_CMD_MI ("target-file-get", mi_cmd_target_file_get),
164 DEF_MI_CMD_MI ("target-file-put", mi_cmd_target_file_put),
78cbbba8 165 DEF_MI_CMD_MI ("target-flash-erase", mi_cmd_target_flash_erase),
648beb2b
YQ
166 DEF_MI_CMD_CLI ("target-select", "target", 1),
167 DEF_MI_CMD_MI ("thread-info", mi_cmd_thread_info),
168 DEF_MI_CMD_MI ("thread-list-ids", mi_cmd_thread_list_ids),
4034d0ff
AT
169 DEF_MI_CMD_MI_1 ("thread-select", mi_cmd_thread_select,
170 &mi_suppress_notification.user_selected_context),
648beb2b 171 DEF_MI_CMD_MI ("trace-define-variable", mi_cmd_trace_define_variable),
201b4506
YQ
172 DEF_MI_CMD_MI_1 ("trace-find", mi_cmd_trace_find,
173 &mi_suppress_notification.traceframe),
dc673c81
YQ
174 DEF_MI_CMD_MI ("trace-frame-collected",
175 mi_cmd_trace_frame_collected),
648beb2b
YQ
176 DEF_MI_CMD_MI ("trace-list-variables", mi_cmd_trace_list_variables),
177 DEF_MI_CMD_MI ("trace-save", mi_cmd_trace_save),
178 DEF_MI_CMD_MI ("trace-start", mi_cmd_trace_start),
179 DEF_MI_CMD_MI ("trace-status", mi_cmd_trace_status),
180 DEF_MI_CMD_MI ("trace-stop", mi_cmd_trace_stop),
181 DEF_MI_CMD_MI ("var-assign", mi_cmd_var_assign),
182 DEF_MI_CMD_MI ("var-create", mi_cmd_var_create),
183 DEF_MI_CMD_MI ("var-delete", mi_cmd_var_delete),
184 DEF_MI_CMD_MI ("var-evaluate-expression", mi_cmd_var_evaluate_expression),
185 DEF_MI_CMD_MI ("var-info-path-expression", mi_cmd_var_info_path_expression),
186 DEF_MI_CMD_MI ("var-info-expression", mi_cmd_var_info_expression),
187 DEF_MI_CMD_MI ("var-info-num-children", mi_cmd_var_info_num_children),
188 DEF_MI_CMD_MI ("var-info-type", mi_cmd_var_info_type),
189 DEF_MI_CMD_MI ("var-list-children", mi_cmd_var_list_children),
190 DEF_MI_CMD_MI ("var-set-format", mi_cmd_var_set_format),
191 DEF_MI_CMD_MI ("var-set-frozen", mi_cmd_var_set_frozen),
192 DEF_MI_CMD_MI ("var-set-update-range", mi_cmd_var_set_update_range),
193 DEF_MI_CMD_MI ("var-set-visualizer", mi_cmd_var_set_visualizer),
194 DEF_MI_CMD_MI ("var-show-attributes", mi_cmd_var_show_attributes),
195 DEF_MI_CMD_MI ("var-show-format", mi_cmd_var_show_format),
196 DEF_MI_CMD_MI ("var-update", mi_cmd_var_update),
b2af646b 197 { NULL, }
fb40c209
AC
198};
199
2b03b41d 200/* Pointer to the mi command table (built at run time). */
fb40c209
AC
201
202static struct mi_cmd **mi_table;
203
2b03b41d 204/* A prime large enough to accomodate the entire command table. */
fb40c209
AC
205enum
206 {
207 MI_TABLE_SIZE = 227
208 };
209
2b03b41d 210/* Exported function used to obtain info from the table. */
fb40c209
AC
211struct mi_cmd *
212mi_lookup (const char *command)
213{
214 return *lookup_table (command);
215}
216
2b03b41d
SS
217/* Used for collecting hash hit/miss statistics. */
218
fb40c209
AC
219struct mi_cmd_stats
220{
221 int hit;
222 int miss;
223 int rehash;
224};
225struct mi_cmd_stats stats;
226
2b03b41d
SS
227/* Look up a command. */
228
fb40c209
AC
229static struct mi_cmd **
230lookup_table (const char *command)
231{
232 const char *chp;
233 unsigned int index = 0;
102040f0 234
2b03b41d 235 /* Compute our hash. */
fb40c209
AC
236 for (chp = command; *chp; chp++)
237 {
2b03b41d 238 /* We use a somewhat arbitrary formula. */
fb40c209
AC
239 index = ((index << 6) + (unsigned int) *chp) % MI_TABLE_SIZE;
240 }
2b03b41d 241
fb40c209
AC
242 while (1)
243 {
244 struct mi_cmd **entry = &mi_table[index];
245 if ((*entry) == 0)
246 {
247 /* not found, return pointer to next free. */
248 stats.miss++;
249 return entry;
250 }
251 if (strcmp (command, (*entry)->name) == 0)
252 {
253 stats.hit++;
254 return entry; /* found */
255 }
256 index = (index + 1) % MI_TABLE_SIZE;
257 stats.rehash++;
258 }
259}
260
261static void
262build_table (struct mi_cmd *commands)
263{
264 int nr_rehash = 0;
265 int nr_entries = 0;
266 struct mi_cmd *command;
fb40c209 267
c4e54771 268 mi_table = XCNEWVEC (struct mi_cmd *, MI_TABLE_SIZE);
fb40c209
AC
269 for (command = commands; command->name != 0; command++)
270 {
271 struct mi_cmd **entry = lookup_table (command->name);
102040f0 272
fb40c209 273 if (*entry)
8e65ff28 274 internal_error (__FILE__, __LINE__,
e2e0b3e5 275 _("command `%s' appears to be duplicated"),
fb40c209
AC
276 command->name);
277 *entry = command;
2b03b41d 278 /* FIXME lose these prints */
fb40c209
AC
279 if (0)
280 {
281 fprintf_unfiltered (gdb_stdlog, "%-30s %2d\n",
282 command->name, stats.rehash - nr_rehash);
283 }
284 nr_entries++;
285 nr_rehash = stats.rehash;
286 }
287 if (0)
288 {
289 fprintf_filtered (gdb_stdlog, "Average %3.1f\n",
290 (double) nr_rehash / (double) nr_entries);
291 }
292}
293
294void
fba45db2 295_initialize_mi_cmds (void)
fb40c209
AC
296{
297 build_table (mi_cmds);
298 memset (&stats, 0, sizeof (stats));
299}
This page took 2.139055 seconds and 4 git commands to generate.