]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/mi/mi-cmds.c
Update copyright year range in all GDB files
[thirdparty/binutils-gdb.git] / gdb / mi / mi-cmds.c
CommitLineData
4389a95a 1/* MI Command Set for GDB, the GNU debugger.
3666a048 2 Copyright (C) 2000-2021 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 68 DEF_MI_CMD_MI_1 ("catch-assert", mi_cmd_catch_assert,
dda83cd7 69 &mi_suppress_notification.breakpoint),
349774ef 70 DEF_MI_CMD_MI_1 ("catch-exception", mi_cmd_catch_exception,
dda83cd7 71 &mi_suppress_notification.breakpoint),
bea298f9 72 DEF_MI_CMD_MI_1 ("catch-handlers", mi_cmd_catch_handlers,
dda83cd7 73 &mi_suppress_notification.breakpoint),
91985142 74 DEF_MI_CMD_MI_1 ("catch-load", mi_cmd_catch_load,
dda83cd7 75 &mi_suppress_notification.breakpoint),
91985142 76 DEF_MI_CMD_MI_1 ("catch-unload", mi_cmd_catch_unload,
dda83cd7 77 &mi_suppress_notification.breakpoint),
30056ea0 78 DEF_MI_CMD_MI_1 ("catch-throw", mi_cmd_catch_throw,
dda83cd7 79 &mi_suppress_notification.breakpoint),
30056ea0 80 DEF_MI_CMD_MI_1 ("catch-rethrow", mi_cmd_catch_rethrow,
dda83cd7 81 &mi_suppress_notification.breakpoint),
30056ea0 82 DEF_MI_CMD_MI_1 ("catch-catch", mi_cmd_catch_catch,
dda83cd7 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),
293b38d6
AB
158 DEF_MI_CMD_MI ("symbol-info-module-functions",
159 mi_cmd_symbol_info_module_functions),
160 DEF_MI_CMD_MI ("symbol-info-module-variables",
161 mi_cmd_symbol_info_module_variables),
648beb2b
YQ
162 DEF_MI_CMD_CLI ("target-attach", "attach", 1),
163 DEF_MI_CMD_MI ("target-detach", mi_cmd_target_detach),
164 DEF_MI_CMD_CLI ("target-disconnect", "disconnect", 0),
165 DEF_MI_CMD_CLI ("target-download", "load", 1),
166 DEF_MI_CMD_MI ("target-file-delete", mi_cmd_target_file_delete),
167 DEF_MI_CMD_MI ("target-file-get", mi_cmd_target_file_get),
168 DEF_MI_CMD_MI ("target-file-put", mi_cmd_target_file_put),
78cbbba8 169 DEF_MI_CMD_MI ("target-flash-erase", mi_cmd_target_flash_erase),
648beb2b
YQ
170 DEF_MI_CMD_CLI ("target-select", "target", 1),
171 DEF_MI_CMD_MI ("thread-info", mi_cmd_thread_info),
172 DEF_MI_CMD_MI ("thread-list-ids", mi_cmd_thread_list_ids),
4034d0ff
AT
173 DEF_MI_CMD_MI_1 ("thread-select", mi_cmd_thread_select,
174 &mi_suppress_notification.user_selected_context),
648beb2b 175 DEF_MI_CMD_MI ("trace-define-variable", mi_cmd_trace_define_variable),
201b4506
YQ
176 DEF_MI_CMD_MI_1 ("trace-find", mi_cmd_trace_find,
177 &mi_suppress_notification.traceframe),
dc673c81
YQ
178 DEF_MI_CMD_MI ("trace-frame-collected",
179 mi_cmd_trace_frame_collected),
648beb2b
YQ
180 DEF_MI_CMD_MI ("trace-list-variables", mi_cmd_trace_list_variables),
181 DEF_MI_CMD_MI ("trace-save", mi_cmd_trace_save),
182 DEF_MI_CMD_MI ("trace-start", mi_cmd_trace_start),
183 DEF_MI_CMD_MI ("trace-status", mi_cmd_trace_status),
184 DEF_MI_CMD_MI ("trace-stop", mi_cmd_trace_stop),
185 DEF_MI_CMD_MI ("var-assign", mi_cmd_var_assign),
186 DEF_MI_CMD_MI ("var-create", mi_cmd_var_create),
187 DEF_MI_CMD_MI ("var-delete", mi_cmd_var_delete),
188 DEF_MI_CMD_MI ("var-evaluate-expression", mi_cmd_var_evaluate_expression),
189 DEF_MI_CMD_MI ("var-info-path-expression", mi_cmd_var_info_path_expression),
190 DEF_MI_CMD_MI ("var-info-expression", mi_cmd_var_info_expression),
191 DEF_MI_CMD_MI ("var-info-num-children", mi_cmd_var_info_num_children),
192 DEF_MI_CMD_MI ("var-info-type", mi_cmd_var_info_type),
193 DEF_MI_CMD_MI ("var-list-children", mi_cmd_var_list_children),
194 DEF_MI_CMD_MI ("var-set-format", mi_cmd_var_set_format),
195 DEF_MI_CMD_MI ("var-set-frozen", mi_cmd_var_set_frozen),
196 DEF_MI_CMD_MI ("var-set-update-range", mi_cmd_var_set_update_range),
197 DEF_MI_CMD_MI ("var-set-visualizer", mi_cmd_var_set_visualizer),
198 DEF_MI_CMD_MI ("var-show-attributes", mi_cmd_var_show_attributes),
199 DEF_MI_CMD_MI ("var-show-format", mi_cmd_var_show_format),
200 DEF_MI_CMD_MI ("var-update", mi_cmd_var_update),
b2af646b 201 { NULL, }
fb40c209
AC
202};
203
2b03b41d 204/* Pointer to the mi command table (built at run time). */
fb40c209
AC
205
206static struct mi_cmd **mi_table;
207
2b03b41d 208/* A prime large enough to accomodate the entire command table. */
fb40c209
AC
209enum
210 {
211 MI_TABLE_SIZE = 227
212 };
213
2b03b41d 214/* Exported function used to obtain info from the table. */
fb40c209
AC
215struct mi_cmd *
216mi_lookup (const char *command)
217{
218 return *lookup_table (command);
219}
220
2b03b41d
SS
221/* Used for collecting hash hit/miss statistics. */
222
fb40c209
AC
223struct mi_cmd_stats
224{
225 int hit;
226 int miss;
227 int rehash;
228};
229struct mi_cmd_stats stats;
230
2b03b41d
SS
231/* Look up a command. */
232
fb40c209
AC
233static struct mi_cmd **
234lookup_table (const char *command)
235{
236 const char *chp;
237 unsigned int index = 0;
102040f0 238
2b03b41d 239 /* Compute our hash. */
fb40c209
AC
240 for (chp = command; *chp; chp++)
241 {
2b03b41d 242 /* We use a somewhat arbitrary formula. */
fb40c209
AC
243 index = ((index << 6) + (unsigned int) *chp) % MI_TABLE_SIZE;
244 }
2b03b41d 245
fb40c209
AC
246 while (1)
247 {
248 struct mi_cmd **entry = &mi_table[index];
249 if ((*entry) == 0)
250 {
251 /* not found, return pointer to next free. */
252 stats.miss++;
253 return entry;
254 }
255 if (strcmp (command, (*entry)->name) == 0)
256 {
257 stats.hit++;
258 return entry; /* found */
259 }
260 index = (index + 1) % MI_TABLE_SIZE;
261 stats.rehash++;
262 }
263}
264
265static void
266build_table (struct mi_cmd *commands)
267{
268 int nr_rehash = 0;
269 int nr_entries = 0;
270 struct mi_cmd *command;
fb40c209 271
c4e54771 272 mi_table = XCNEWVEC (struct mi_cmd *, MI_TABLE_SIZE);
fb40c209
AC
273 for (command = commands; command->name != 0; command++)
274 {
275 struct mi_cmd **entry = lookup_table (command->name);
102040f0 276
fb40c209 277 if (*entry)
8e65ff28 278 internal_error (__FILE__, __LINE__,
e2e0b3e5 279 _("command `%s' appears to be duplicated"),
fb40c209
AC
280 command->name);
281 *entry = command;
2b03b41d 282 /* FIXME lose these prints */
fb40c209
AC
283 if (0)
284 {
285 fprintf_unfiltered (gdb_stdlog, "%-30s %2d\n",
286 command->name, stats.rehash - nr_rehash);
287 }
288 nr_entries++;
289 nr_rehash = stats.rehash;
290 }
291 if (0)
292 {
293 fprintf_filtered (gdb_stdlog, "Average %3.1f\n",
294 (double) nr_rehash / (double) nr_entries);
295 }
296}
297
6c265988 298void _initialize_mi_cmds ();
fb40c209 299void
6c265988 300_initialize_mi_cmds ()
fb40c209
AC
301{
302 build_table (mi_cmds);
303 memset (&stats, 0, sizeof (stats));
304}