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