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