-trace-define-variable and -trace-list-variables.
[deliverable/binutils-gdb.git] / gdb / mi / mi-cmds.c
CommitLineData
4389a95a
AC
1/* MI Command Set for GDB, the GNU debugger.
2
4c38e0a4 3 Copyright (C) 2000, 2001, 2003, 2007, 2008, 2009, 2010
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},
50 { "data-list-changed-registers", { NULL, 0 }, mi_cmd_data_list_changed_registers},
51 { "data-list-register-names", { NULL, 0 }, mi_cmd_data_list_register_names},
52 { "data-list-register-values", { NULL, 0 }, mi_cmd_data_list_register_values},
53 { "data-read-memory", { NULL, 0 }, mi_cmd_data_read_memory},
54 { "data-write-memory", { NULL, 0 }, mi_cmd_data_write_memory},
55 { "data-write-register-values", { NULL, 0 }, mi_cmd_data_write_register_values},
56 { "enable-timings", { NULL, 0 }, mi_cmd_enable_timings},
0cc7d26f 57 { "enable-pretty-printing", { NULL, 0 }, mi_cmd_enable_pretty_printing},
9e22b03a
VP
58 { "environment-cd", { NULL, 0 }, mi_cmd_env_cd},
59 { "environment-directory", { NULL, 0 }, mi_cmd_env_dir},
60 { "environment-path", { NULL, 0 }, mi_cmd_env_path},
61 { "environment-pwd", { NULL, 0 }, mi_cmd_env_pwd},
9e22b03a 62 { "exec-arguments", { "set args", 1 }, NULL },
b2af646b
AC
63 { "exec-continue", { NULL, 0 }, mi_cmd_exec_continue},
64 { "exec-finish", { NULL, 0 }, mi_cmd_exec_finish},
143260c9 65 { "exec-jump", { NULL, 0 }, mi_cmd_exec_jump},
b2af646b
AC
66 { "exec-interrupt", { NULL, 0 }, mi_cmd_exec_interrupt},
67 { "exec-next", { NULL, 0 }, mi_cmd_exec_next},
68 { "exec-next-instruction", { NULL, 0 }, mi_cmd_exec_next_instruction},
69 { "exec-return", { NULL, 0 }, mi_cmd_exec_return},
115d30f9 70 { "exec-run", { NULL, 0}, mi_cmd_exec_run},
b2af646b
AC
71 { "exec-step", { NULL, 0 }, mi_cmd_exec_step},
72 { "exec-step-instruction", { NULL, 0 }, mi_cmd_exec_step_instruction},
1b98914a 73 { "exec-until", { "until", 1 }, NULL},
9e22b03a
VP
74 { "file-exec-and-symbols", { "file", 1 }, NULL },
75 { "file-exec-file", { "exec-file", 1 }, NULL },
9e22b03a
VP
76 { "file-list-exec-source-file", { NULL, 0 }, mi_cmd_file_list_exec_source_file},
77 { "file-list-exec-source-files", { NULL, 0 }, mi_cmd_file_list_exec_source_files },
9e22b03a 78 { "file-symbol-file", { "symbol-file", 1 }, NULL },
9e22b03a
VP
79 { "gdb-exit", { NULL, 0 }, mi_cmd_gdb_exit},
80 { "gdb-set", { "set", 1 }, NULL },
81 { "gdb-show", { "show", 1 }, NULL },
b2af646b 82 { "gdb-version", { "show version", 0 }, 0 },
9e22b03a
VP
83 { "inferior-tty-set", { NULL, 0 }, mi_cmd_inferior_tty_set},
84 { "inferior-tty-show", { NULL, 0 }, mi_cmd_inferior_tty_show},
85 { "interpreter-exec", { NULL, 0 }, mi_cmd_interpreter_exec},
86 { "list-features", { NULL, 0 }, mi_cmd_list_features},
c6ebd6cf 87 { "list-target-features", { NULL, 0 }, mi_cmd_list_target_features},
3ee1c036 88 { "list-thread-groups", { NULL, 0 }, mi_cmd_list_thread_groups },
a79b8f6e 89 { "remove-inferior", { NULL, 0 }, mi_cmd_remove_inferior },
9e22b03a
VP
90 { "stack-info-depth", { NULL, 0 }, mi_cmd_stack_info_depth},
91 { "stack-info-frame", { NULL, 0 }, mi_cmd_stack_info_frame},
92 { "stack-list-arguments", { NULL, 0 }, mi_cmd_stack_list_args},
9e22b03a
VP
93 { "stack-list-frames", { NULL, 0 }, mi_cmd_stack_list_frames},
94 { "stack-list-locals", { NULL, 0 }, mi_cmd_stack_list_locals},
daf3c977 95 { "stack-list-variables", { NULL, 0 }, mi_cmd_stack_list_variables},
9e22b03a 96 { "stack-select-frame", { NULL, 0 }, mi_cmd_stack_select_frame},
9e22b03a 97 { "symbol-list-lines", { NULL, 0 }, mi_cmd_symbol_list_lines},
711eabed 98 { "target-attach", { "attach", 1 }, NULL },
6418d433 99 { "target-detach", { NULL, 0 }, mi_cmd_target_detach },
b2af646b 100 { "target-disconnect", { "disconnect", 0 }, 0 },
1b98914a 101 { "target-download", { "load", 1 }, NULL},
9e22b03a
VP
102 { "target-file-delete", { NULL, 0 }, mi_cmd_target_file_delete },
103 { "target-file-get", { NULL, 0 }, mi_cmd_target_file_get },
104 { "target-file-put", { NULL, 0 }, mi_cmd_target_file_put },
1b98914a 105 { "target-select", { "target", 1 }, NULL},
9e22b03a
VP
106 { "thread-info", { NULL, 0 }, mi_cmd_thread_info },
107 { "thread-list-ids", { NULL, 0 }, mi_cmd_thread_list_ids},
108 { "thread-select", { NULL, 0 }, mi_cmd_thread_select},
40e1c229
VP
109 { "trace-define-variable", { NULL, 0 }, mi_cmd_trace_define_variable },
110 { "trace-list-variables", { NULL, 0 }, mi_cmd_trace_list_variables },
f224b49d
VP
111 { "trace-start", { NULL, 0 }, mi_cmd_trace_start },
112 { "trace-status", { NULL, 0 }, mi_cmd_trace_status },
113 { "trace-stop", { NULL, 0 }, mi_cmd_trace_stop },
9e22b03a
VP
114 { "var-assign", { NULL, 0 }, mi_cmd_var_assign},
115 { "var-create", { NULL, 0 }, mi_cmd_var_create},
116 { "var-delete", { NULL, 0 }, mi_cmd_var_delete},
117 { "var-evaluate-expression", { NULL, 0 }, mi_cmd_var_evaluate_expression},
118 { "var-info-path-expression", { NULL, 0 }, mi_cmd_var_info_path_expression},
119 { "var-info-expression", { NULL, 0 }, mi_cmd_var_info_expression},
120 { "var-info-num-children", { NULL, 0 }, mi_cmd_var_info_num_children},
121 { "var-info-type", { NULL, 0 }, mi_cmd_var_info_type},
122 { "var-list-children", { NULL, 0 }, mi_cmd_var_list_children},
123 { "var-set-format", { NULL, 0 }, mi_cmd_var_set_format},
124 { "var-set-frozen", { NULL, 0 }, mi_cmd_var_set_frozen},
0cc7d26f 125 { "var-set-update-range", { NULL, 0 }, mi_cmd_var_set_update_range },
b6313243 126 { "var-set-visualizer", { NULL, 0 }, mi_cmd_var_set_visualizer},
9e22b03a
VP
127 { "var-show-attributes", { NULL, 0 }, mi_cmd_var_show_attributes},
128 { "var-show-format", { NULL, 0 }, mi_cmd_var_show_format},
129 { "var-update", { NULL, 0 }, mi_cmd_var_update},
b2af646b 130 { NULL, }
fb40c209
AC
131};
132
133/* Pointer to the mi command table (built at run time) */
134
135static struct mi_cmd **mi_table;
136
137/* A prime large enough to accomodate the entire command table */
138enum
139 {
140 MI_TABLE_SIZE = 227
141 };
142
143/* Exported function used to obtain info from the table */
144struct mi_cmd *
145mi_lookup (const char *command)
146{
147 return *lookup_table (command);
148}
149
150/* stat collecting */
151struct mi_cmd_stats
152{
153 int hit;
154 int miss;
155 int rehash;
156};
157struct mi_cmd_stats stats;
158
159/* our lookup function */
160static struct mi_cmd **
161lookup_table (const char *command)
162{
163 const char *chp;
164 unsigned int index = 0;
165 /* compute our hash */
166 for (chp = command; *chp; chp++)
167 {
168 /* some what arbitrary */
169 index = ((index << 6) + (unsigned int) *chp) % MI_TABLE_SIZE;
170 }
171 /* look it up */
172 while (1)
173 {
174 struct mi_cmd **entry = &mi_table[index];
175 if ((*entry) == 0)
176 {
177 /* not found, return pointer to next free. */
178 stats.miss++;
179 return entry;
180 }
181 if (strcmp (command, (*entry)->name) == 0)
182 {
183 stats.hit++;
184 return entry; /* found */
185 }
186 index = (index + 1) % MI_TABLE_SIZE;
187 stats.rehash++;
188 }
189}
190
191static void
192build_table (struct mi_cmd *commands)
193{
194 int nr_rehash = 0;
195 int nr_entries = 0;
196 struct mi_cmd *command;
197 int sizeof_table = sizeof (struct mi_cmd **) * MI_TABLE_SIZE;
198
199 mi_table = xmalloc (sizeof_table);
200 memset (mi_table, 0, sizeof_table);
201 for (command = commands; command->name != 0; command++)
202 {
203 struct mi_cmd **entry = lookup_table (command->name);
204 if (*entry)
8e65ff28 205 internal_error (__FILE__, __LINE__,
e2e0b3e5 206 _("command `%s' appears to be duplicated"),
fb40c209
AC
207 command->name);
208 *entry = command;
209 if (0)
210 {
211 fprintf_unfiltered (gdb_stdlog, "%-30s %2d\n",
212 command->name, stats.rehash - nr_rehash);
213 }
214 nr_entries++;
215 nr_rehash = stats.rehash;
216 }
217 if (0)
218 {
219 fprintf_filtered (gdb_stdlog, "Average %3.1f\n",
220 (double) nr_rehash / (double) nr_entries);
221 }
222}
223
224void
fba45db2 225_initialize_mi_cmds (void)
fb40c209
AC
226{
227 build_table (mi_cmds);
228 memset (&stats, 0, sizeof (stats));
229}
This page took 0.795376 seconds and 4 git commands to generate.