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