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