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