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