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