gdb/mi/mi-cmds.c - gdb

Global variables defined

Data types defined

Functions defined

Macros defined

Source code

  1. /* MI Command Set for GDB, the GNU debugger.
  2.    Copyright (C) 2000-2015 Free Software Foundation, Inc.

  3.    Contributed by Cygnus Solutions (a Red Hat company).

  4.    This file is part of GDB.

  5.    This program is free software; you can redistribute it and/or modify
  6.    it under the terms of the GNU General Public License as published by
  7.    the Free Software Foundation; either version 3 of the License, or
  8.    (at your option) any later version.

  9.    This program is distributed in the hope that it will be useful,
  10.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.    GNU General Public License for more details.

  13.    You should have received a copy of the GNU General Public License
  14.    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

  15. #include "defs.h"
  16. #include "top.h"
  17. #include "mi-cmds.h"
  18. #include "mi-main.h"

  19. extern void _initialize_mi_cmds (void);

  20. struct mi_cmd;
  21. static struct mi_cmd **lookup_table (const char *command);
  22. static void build_table (struct mi_cmd *commands);

  23. static struct mi_cmd mi_cmds[] =
  24. {
  25. /* Define a MI command of NAME, and its corresponding CLI command is
  26.    CLI_NAME.  */
  27. #define DEF_MI_CMD_CLI_1(NAME, CLI_NAME, ARGS_P, CALLED)        \
  28.   { NAME, { CLI_NAME, ARGS_P}, NULL, CALLED }
  29. #define DEF_MI_CMD_CLI(NAME, CLI_NAME, ARGS_P) \
  30.   DEF_MI_CMD_CLI_1(NAME, CLI_NAME, ARGS_P, NULL)

  31. /* Define a MI command of NAME, and implemented by function MI_FUNC.  */
  32. #define DEF_MI_CMD_MI_1(NAME, MI_FUNC, CALLED) \
  33.   { NAME, {NULL, 0}, MI_FUNC, CALLED }
  34. #define DEF_MI_CMD_MI(NAME, MI_FUNC) DEF_MI_CMD_MI_1(NAME, MI_FUNC, NULL)

  35.   DEF_MI_CMD_MI ("ada-task-info", mi_cmd_ada_task_info),
  36.   DEF_MI_CMD_MI ("add-inferior", mi_cmd_add_inferior),
  37.   DEF_MI_CMD_CLI_1 ("break-after", "ignore", 1,
  38.                     &mi_suppress_notification.breakpoint),
  39.   DEF_MI_CMD_CLI_1 ("break-condition","cond", 1,
  40.                   &mi_suppress_notification.breakpoint),
  41.   DEF_MI_CMD_MI_1 ("break-commands", mi_cmd_break_commands,
  42.                    &mi_suppress_notification.breakpoint),
  43.   DEF_MI_CMD_CLI_1 ("break-delete", "delete breakpoint", 1,
  44.                     &mi_suppress_notification.breakpoint),
  45.   DEF_MI_CMD_CLI_1 ("break-disable", "disable breakpoint", 1,
  46.                     &mi_suppress_notification.breakpoint),
  47.   DEF_MI_CMD_CLI_1 ("break-enable", "enable breakpoint", 1,
  48.                      &mi_suppress_notification.breakpoint),
  49.   DEF_MI_CMD_CLI ("break-info", "info break", 1),
  50.   DEF_MI_CMD_MI_1 ("break-insert", mi_cmd_break_insert,
  51.                    &mi_suppress_notification.breakpoint),
  52.   DEF_MI_CMD_MI_1 ("dprintf-insert", mi_cmd_dprintf_insert,
  53.                    &mi_suppress_notification.breakpoint),
  54.   DEF_MI_CMD_CLI ("break-list", "info break", 0),
  55.   DEF_MI_CMD_MI_1 ("break-passcount", mi_cmd_break_passcount,
  56.                    &mi_suppress_notification.breakpoint),
  57.   DEF_MI_CMD_MI_1 ("break-watch", mi_cmd_break_watch,
  58.                    &mi_suppress_notification.breakpoint),
  59.   DEF_MI_CMD_MI_1 ("catch-assert", mi_cmd_catch_assert,
  60.                    &mi_suppress_notification.breakpoint),
  61.   DEF_MI_CMD_MI_1 ("catch-exception", mi_cmd_catch_exception,
  62.                    &mi_suppress_notification.breakpoint),
  63.   DEF_MI_CMD_MI_1 ("catch-load", mi_cmd_catch_load,
  64.                    &mi_suppress_notification.breakpoint),
  65.   DEF_MI_CMD_MI_1 ("catch-unload", mi_cmd_catch_unload,
  66.                    &mi_suppress_notification.breakpoint),
  67.   DEF_MI_CMD_MI ("data-disassemble", mi_cmd_disassemble),
  68.   DEF_MI_CMD_MI ("data-evaluate-expression", mi_cmd_data_evaluate_expression),
  69.   DEF_MI_CMD_MI ("data-list-changed-registers",
  70.                  mi_cmd_data_list_changed_registers),
  71.   DEF_MI_CMD_MI ("data-list-register-names", mi_cmd_data_list_register_names),
  72.   DEF_MI_CMD_MI ("data-list-register-values", mi_cmd_data_list_register_values),
  73.   DEF_MI_CMD_MI ("data-read-memory", mi_cmd_data_read_memory),
  74.   DEF_MI_CMD_MI ("data-read-memory-bytes", mi_cmd_data_read_memory_bytes),
  75.   DEF_MI_CMD_MI_1 ("data-write-memory", mi_cmd_data_write_memory,
  76.                    &mi_suppress_notification.memory),
  77.   DEF_MI_CMD_MI_1 ("data-write-memory-bytes", mi_cmd_data_write_memory_bytes,
  78.                    &mi_suppress_notification.memory),
  79.   DEF_MI_CMD_MI ("data-write-register-values",
  80.                  mi_cmd_data_write_register_values),
  81.   DEF_MI_CMD_MI ("enable-timings", mi_cmd_enable_timings),
  82.   DEF_MI_CMD_MI ("enable-pretty-printing", mi_cmd_enable_pretty_printing),
  83.   DEF_MI_CMD_MI ("enable-frame-filters", mi_cmd_enable_frame_filters),
  84.   DEF_MI_CMD_MI ("environment-cd", mi_cmd_env_cd),
  85.   DEF_MI_CMD_MI ("environment-directory", mi_cmd_env_dir),
  86.   DEF_MI_CMD_MI ("environment-path", mi_cmd_env_path),
  87.   DEF_MI_CMD_MI ("environment-pwd", mi_cmd_env_pwd),
  88.   DEF_MI_CMD_CLI_1 ("exec-arguments", "set args", 1,
  89.                     &mi_suppress_notification.cmd_param_changed),
  90.   DEF_MI_CMD_MI ("exec-continue", mi_cmd_exec_continue),
  91.   DEF_MI_CMD_MI ("exec-finish", mi_cmd_exec_finish),
  92.   DEF_MI_CMD_MI ("exec-jump", mi_cmd_exec_jump),
  93.   DEF_MI_CMD_MI ("exec-interrupt", mi_cmd_exec_interrupt),
  94.   DEF_MI_CMD_MI ("exec-next", mi_cmd_exec_next),
  95.   DEF_MI_CMD_MI ("exec-next-instruction", mi_cmd_exec_next_instruction),
  96.   DEF_MI_CMD_MI ("exec-return", mi_cmd_exec_return),
  97.   DEF_MI_CMD_MI ("exec-run", mi_cmd_exec_run),
  98.   DEF_MI_CMD_MI ("exec-step", mi_cmd_exec_step),
  99.   DEF_MI_CMD_MI ("exec-step-instruction", mi_cmd_exec_step_instruction),
  100.   DEF_MI_CMD_CLI ("exec-until", "until", 1),
  101.   DEF_MI_CMD_CLI ("file-exec-and-symbols", "file", 1),
  102.   DEF_MI_CMD_CLI ("file-exec-file", "exec-file", 1),
  103.   DEF_MI_CMD_MI ("file-list-exec-source-file",
  104.                  mi_cmd_file_list_exec_source_file),
  105.   DEF_MI_CMD_MI ("file-list-exec-source-files",
  106.                  mi_cmd_file_list_exec_source_files),
  107.   DEF_MI_CMD_CLI ("file-symbol-file", "symbol-file", 1),
  108.   DEF_MI_CMD_MI ("gdb-exit", mi_cmd_gdb_exit),
  109.   DEF_MI_CMD_CLI_1 ("gdb-set", "set", 1,
  110.                     &mi_suppress_notification.cmd_param_changed),
  111.   DEF_MI_CMD_CLI ("gdb-show", "show", 1),
  112.   DEF_MI_CMD_CLI ("gdb-version", "show version", 0),
  113.   DEF_MI_CMD_MI ("inferior-tty-set", mi_cmd_inferior_tty_set),
  114.   DEF_MI_CMD_MI ("inferior-tty-show", mi_cmd_inferior_tty_show),
  115.   DEF_MI_CMD_MI ("info-ada-exceptions", mi_cmd_info_ada_exceptions),
  116.   DEF_MI_CMD_MI ("info-gdb-mi-command", mi_cmd_info_gdb_mi_command),
  117.   DEF_MI_CMD_MI ("info-os", mi_cmd_info_os),
  118.   DEF_MI_CMD_MI ("interpreter-exec", mi_cmd_interpreter_exec),
  119.   DEF_MI_CMD_MI ("list-features", mi_cmd_list_features),
  120.   DEF_MI_CMD_MI ("list-target-features", mi_cmd_list_target_features),
  121.   DEF_MI_CMD_MI ("list-thread-groups", mi_cmd_list_thread_groups),
  122.   DEF_MI_CMD_MI ("remove-inferior", mi_cmd_remove_inferior),
  123.   DEF_MI_CMD_MI ("stack-info-depth", mi_cmd_stack_info_depth),
  124.   DEF_MI_CMD_MI ("stack-info-frame", mi_cmd_stack_info_frame),
  125.   DEF_MI_CMD_MI ("stack-list-arguments", mi_cmd_stack_list_args),
  126.   DEF_MI_CMD_MI ("stack-list-frames", mi_cmd_stack_list_frames),
  127.   DEF_MI_CMD_MI ("stack-list-locals", mi_cmd_stack_list_locals),
  128.   DEF_MI_CMD_MI ("stack-list-variables", mi_cmd_stack_list_variables),
  129.   DEF_MI_CMD_MI ("stack-select-frame", mi_cmd_stack_select_frame),
  130.   DEF_MI_CMD_MI ("symbol-list-lines", mi_cmd_symbol_list_lines),
  131.   DEF_MI_CMD_CLI ("target-attach", "attach", 1),
  132.   DEF_MI_CMD_MI ("target-detach", mi_cmd_target_detach),
  133.   DEF_MI_CMD_CLI ("target-disconnect", "disconnect", 0),
  134.   DEF_MI_CMD_CLI ("target-download", "load", 1),
  135.   DEF_MI_CMD_MI ("target-file-delete", mi_cmd_target_file_delete),
  136.   DEF_MI_CMD_MI ("target-file-get", mi_cmd_target_file_get),
  137.   DEF_MI_CMD_MI ("target-file-put", mi_cmd_target_file_put),
  138.   DEF_MI_CMD_CLI ("target-select", "target", 1),
  139.   DEF_MI_CMD_MI ("thread-info", mi_cmd_thread_info),
  140.   DEF_MI_CMD_MI ("thread-list-ids", mi_cmd_thread_list_ids),
  141.   DEF_MI_CMD_MI ("thread-select", mi_cmd_thread_select),
  142.   DEF_MI_CMD_MI ("trace-define-variable", mi_cmd_trace_define_variable),
  143.   DEF_MI_CMD_MI_1 ("trace-find", mi_cmd_trace_find,
  144.                    &mi_suppress_notification.traceframe),
  145.   DEF_MI_CMD_MI ("trace-frame-collected",
  146.                  mi_cmd_trace_frame_collected),
  147.   DEF_MI_CMD_MI ("trace-list-variables", mi_cmd_trace_list_variables),
  148.   DEF_MI_CMD_MI ("trace-save", mi_cmd_trace_save),
  149.   DEF_MI_CMD_MI ("trace-start", mi_cmd_trace_start),
  150.   DEF_MI_CMD_MI ("trace-status", mi_cmd_trace_status),
  151.   DEF_MI_CMD_MI ("trace-stop", mi_cmd_trace_stop),
  152.   DEF_MI_CMD_MI ("var-assign", mi_cmd_var_assign),
  153.   DEF_MI_CMD_MI ("var-create", mi_cmd_var_create),
  154.   DEF_MI_CMD_MI ("var-delete", mi_cmd_var_delete),
  155.   DEF_MI_CMD_MI ("var-evaluate-expression", mi_cmd_var_evaluate_expression),
  156.   DEF_MI_CMD_MI ("var-info-path-expression", mi_cmd_var_info_path_expression),
  157.   DEF_MI_CMD_MI ("var-info-expression", mi_cmd_var_info_expression),
  158.   DEF_MI_CMD_MI ("var-info-num-children", mi_cmd_var_info_num_children),
  159.   DEF_MI_CMD_MI ("var-info-type", mi_cmd_var_info_type),
  160.   DEF_MI_CMD_MI ("var-list-children", mi_cmd_var_list_children),
  161.   DEF_MI_CMD_MI ("var-set-format", mi_cmd_var_set_format),
  162.   DEF_MI_CMD_MI ("var-set-frozen", mi_cmd_var_set_frozen),
  163.   DEF_MI_CMD_MI ("var-set-update-range", mi_cmd_var_set_update_range),
  164.   DEF_MI_CMD_MI ("var-set-visualizer", mi_cmd_var_set_visualizer),
  165.   DEF_MI_CMD_MI ("var-show-attributes", mi_cmd_var_show_attributes),
  166.   DEF_MI_CMD_MI ("var-show-format", mi_cmd_var_show_format),
  167.   DEF_MI_CMD_MI ("var-update", mi_cmd_var_update),
  168.   { NULL, }
  169. };

  170. /* Pointer to the mi command table (built at run time). */

  171. static struct mi_cmd **mi_table;

  172. /* A prime large enough to accomodate the entire command table.  */
  173. enum
  174.   {
  175.     MI_TABLE_SIZE = 227
  176.   };

  177. /* Exported function used to obtain info from the table.  */
  178. struct mi_cmd *
  179. mi_lookup (const char *command)
  180. {
  181.   return *lookup_table (command);
  182. }

  183. /* Used for collecting hash hit/miss statistics.  */

  184. struct mi_cmd_stats
  185. {
  186.   int hit;
  187.   int miss;
  188.   int rehash;
  189. };
  190. struct mi_cmd_stats stats;

  191. /* Look up a command.  */

  192. static struct mi_cmd **
  193. lookup_table (const char *command)
  194. {
  195.   const char *chp;
  196.   unsigned int index = 0;

  197.   /* Compute our hash.  */
  198.   for (chp = command; *chp; chp++)
  199.     {
  200.       /* We use a somewhat arbitrary formula.  */
  201.       index = ((index << 6) + (unsigned int) *chp) % MI_TABLE_SIZE;
  202.     }

  203.   while (1)
  204.     {
  205.       struct mi_cmd **entry = &mi_table[index];
  206.       if ((*entry) == 0)
  207.         {
  208.           /* not found, return pointer to next free. */
  209.           stats.miss++;
  210.           return entry;
  211.         }
  212.       if (strcmp (command, (*entry)->name) == 0)
  213.         {
  214.           stats.hit++;
  215.           return entry;                /* found */
  216.         }
  217.       index = (index + 1) % MI_TABLE_SIZE;
  218.       stats.rehash++;
  219.     }
  220. }

  221. static void
  222. build_table (struct mi_cmd *commands)
  223. {
  224.   int nr_rehash = 0;
  225.   int nr_entries = 0;
  226.   struct mi_cmd *command;

  227.   mi_table = XCNEWVEC (struct mi_cmd *, MI_TABLE_SIZE);
  228.   for (command = commands; command->name != 0; command++)
  229.     {
  230.       struct mi_cmd **entry = lookup_table (command->name);

  231.       if (*entry)
  232.         internal_error (__FILE__, __LINE__,
  233.                         _("command `%s' appears to be duplicated"),
  234.                         command->name);
  235.       *entry = command;
  236.       /* FIXME lose these prints */
  237.       if (0)
  238.         {
  239.           fprintf_unfiltered (gdb_stdlog, "%-30s %2d\n",
  240.                               command->name, stats.rehash - nr_rehash);
  241.         }
  242.       nr_entries++;
  243.       nr_rehash = stats.rehash;
  244.     }
  245.   if (0)
  246.     {
  247.       fprintf_filtered (gdb_stdlog, "Average %3.1f\n",
  248.                         (double) nr_rehash / (double) nr_entries);
  249.     }
  250. }

  251. void
  252. _initialize_mi_cmds (void)
  253. {
  254.   build_table (mi_cmds);
  255.   memset (&stats, 0, sizeof (stats));
  256. }