From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-lf1-x132.google.com (mail-lf1-x132.google.com [IPv6:2a00:1450:4864:20::132]) by sourceware.org (Postfix) with ESMTPS id 7AC043858C2C for ; Tue, 21 Dec 2021 14:20:40 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 7AC043858C2C Received: by mail-lf1-x132.google.com with SMTP id k21so11550399lfu.0 for ; Tue, 21 Dec 2021 06:20:40 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:subject:from:in-reply-to:date:cc :content-transfer-encoding:message-id:references:to; bh=vAVdG5V9IZ2b5UnNe+EIlQE6xi9nlP3d17PDuEXn76o=; b=dwzNpwRRT7qpXVkwbLam4y46MzAlhdHPzHILrjdoBImEHM44QPge3HmE9Yy4O8AAzL bGaaWUROvmN3MDR03jFVBF9gKZcWxNE/cbIThtFfVnEQO8nXO20hxJqrvIpzZNXYRdo3 5aFSKtQUvBUU7y3czsv3Zrb/67eH3/GsqfzJyhFcV13EhVX7a1oAhY7sNkxeLoRJk4s/ YT6CF4NWMwp6P/dxuk5fagAZZC9bKdVEg6zto87HK2gXGXNtVs5LFOFCe0uhOrOtL16y OI6yHbE1zoez3A+jR6aZymFMne2O3WGayJJFS6Z5zSueuOI6Q6zZwF5tB7DYjqDXzsHI WK+A== X-Gm-Message-State: AOAM531CbEzkLezAsTQLtrHj+p/e9ji5ZHs3PSeR1szjH6EiA7pH8k+7 45BIpMeU1CGdYg/8shhsNNY6GZoR5rNs X-Google-Smtp-Source: ABdhPJyDHOlIGs/jEfcJ2Ax0AJm4c8bPEzz2i4IX0jY1azz5BhglvzRCwSzc88jTTfNIYs64YBiwlQ== X-Received: by 2002:ac2:5e85:: with SMTP id b5mr3319407lfq.33.1640096439078; Tue, 21 Dec 2021 06:20:39 -0800 (PST) Received: from [192.168.0.135] ([185.30.228.158]) by smtp.gmail.com with ESMTPSA id e17sm2725261lfr.296.2021.12.21.06.20.38 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 21 Dec 2021 06:20:38 -0800 (PST) Content-Type: text/plain; charset=us-ascii Mime-Version: 1.0 (Mac OS X Mail 13.4 \(3608.120.23.2.7\)) Subject: Re: [TCWG CI] Regression caused by binutils: gdb/mi: use std::map for MI commands in mi-cmds.c From: Maxim Kuvyrkov In-Reply-To: <1748574309.6162.1639959243064@jenkins.jenkins> Date: Tue, 21 Dec 2021 17:20:38 +0300 Cc: gcc-regression@gcc.gnu.org Content-Transfer-Encoding: quoted-printable Message-Id: <7B4663FD-F5A1-4CBE-9B58-733A824C33B5@linaro.org> References: <1748574309.6162.1639959243064@jenkins.jenkins> To: Jan Vrany X-Mailer: Apple Mail (2.3608.120.23.2.7) X-Spam-Status: No, score=-11.2 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_LOTSOFHASH, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-regression@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-regression mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 21 Dec 2021 14:20:44 -0000 Hi Jan, This was sent out due to a bug in our CI. Sorry for the noise. Regards, -- Maxim Kuvyrkov https://www.linaro.org > On 20 Dec 2021, at 03:14, ci_notify@linaro.org wrote: >=20 > [TCWG CI] Regression caused by binutils: gdb/mi: use std::map for MI = commands in mi-cmds.c: > commit f76d800be844dd2aa4aa8f189a3ace16c5e931bc > Author: Jan Vrany >=20 > gdb/mi: use std::map for MI commands in mi-cmds.c >=20 > Results regressed to > # reset_artifacts: > -10 > # build_abe binutils: > -9 > # build_abe stage1 -- --set = gcc_override_configure=3D--disable-libsanitizer --set = gcc_override_configure=3D--disable-multilib --set = gcc_override_configure=3D--with-cpu=3Dcortex-m4 --set = gcc_override_configure=3D--with-mode=3Dthumb --set = gcc_override_configure=3D--with-float=3Dhard: > -8 > # build_abe newlib: > -6 > # build_abe stage2 -- --set = gcc_override_configure=3D--disable-libsanitizer --set = gcc_override_configure=3D--disable-multilib --set = gcc_override_configure=3D--with-cpu=3Dcortex-m4 --set = gcc_override_configure=3D--with-mode=3Dthumb --set = gcc_override_configure=3D--with-float=3Dhard: > -5 > # benchmark -- -O3_mthumb = artifacts/build-f76d800be844dd2aa4aa8f189a3ace16c5e931bc/results_id: > 1 >=20 > from > # reset_artifacts: > -10 > # build_abe binutils: > -9 > # build_abe stage1 -- --set = gcc_override_configure=3D--disable-libsanitizer --set = gcc_override_configure=3D--disable-multilib --set = gcc_override_configure=3D--with-cpu=3Dcortex-m4 --set = gcc_override_configure=3D--with-mode=3Dthumb --set = gcc_override_configure=3D--with-float=3Dhard: > -8 > # build_abe newlib: > -6 > # build_abe stage2 -- --set = gcc_override_configure=3D--disable-libsanitizer --set = gcc_override_configure=3D--disable-multilib --set = gcc_override_configure=3D--with-cpu=3Dcortex-m4 --set = gcc_override_configure=3D--with-mode=3Dthumb --set = gcc_override_configure=3D--with-float=3Dhard: > -5 > # benchmark -- -O3_mthumb artifacts/build-baseline/results_id: > 1 >=20 > THIS IS THE END OF INTERESTING STUFF. BELOW ARE LINKS TO BUILDS, = REPRODUCTION INSTRUCTIONS, AND THE RAW COMMIT. >=20 > This commit has regressed these CI configurations: > - tcwg_bmk_gnu_eabi_stm32/gnu_eabi-master-arm_eabi-coremark-O3 >=20 > First_bad build: = https://ci.linaro.org/job/tcwg_bmk_ci_gnu_eabi-bisect-tcwg_bmk_stm32-gnu_e= abi-master-arm_eabi-coremark-O3/14/artifact/artifacts/build-f76d800be844dd= 2aa4aa8f189a3ace16c5e931bc/ > Last_good build: = https://ci.linaro.org/job/tcwg_bmk_ci_gnu_eabi-bisect-tcwg_bmk_stm32-gnu_e= abi-master-arm_eabi-coremark-O3/14/artifact/artifacts/build-3524a83e595057= 6a807134dde6c180211219e655/ > Baseline build: = https://ci.linaro.org/job/tcwg_bmk_ci_gnu_eabi-bisect-tcwg_bmk_stm32-gnu_e= abi-master-arm_eabi-coremark-O3/14/artifact/artifacts/build-baseline/ > Even more details: = https://ci.linaro.org/job/tcwg_bmk_ci_gnu_eabi-bisect-tcwg_bmk_stm32-gnu_e= abi-master-arm_eabi-coremark-O3/14/artifact/artifacts/ >=20 > Reproduce builds: > > mkdir investigate-binutils-f76d800be844dd2aa4aa8f189a3ace16c5e931bc > cd investigate-binutils-f76d800be844dd2aa4aa8f189a3ace16c5e931bc >=20 > # Fetch scripts > git clone https://git.linaro.org/toolchain/jenkins-scripts >=20 > # Fetch manifests and test.sh script > mkdir -p artifacts/manifests > curl -o artifacts/manifests/build-baseline.sh = https://ci.linaro.org/job/tcwg_bmk_ci_gnu_eabi-bisect-tcwg_bmk_stm32-gnu_e= abi-master-arm_eabi-coremark-O3/14/artifact/artifacts/manifests/build-base= line.sh --fail > curl -o artifacts/manifests/build-parameters.sh = https://ci.linaro.org/job/tcwg_bmk_ci_gnu_eabi-bisect-tcwg_bmk_stm32-gnu_e= abi-master-arm_eabi-coremark-O3/14/artifact/artifacts/manifests/build-para= meters.sh --fail > curl -o artifacts/test.sh = https://ci.linaro.org/job/tcwg_bmk_ci_gnu_eabi-bisect-tcwg_bmk_stm32-gnu_e= abi-master-arm_eabi-coremark-O3/14/artifact/artifacts/test.sh --fail > chmod +x artifacts/test.sh >=20 > # Reproduce the baseline build (build all pre-requisites) > ./jenkins-scripts/tcwg_bmk-build.sh @@ = artifacts/manifests/build-baseline.sh >=20 > # Save baseline build state (which is then restored in = artifacts/test.sh) > mkdir -p ./bisect > rsync -a --del --delete-excluded --exclude /bisect/ --exclude = /artifacts/ --exclude /binutils/ ./ ./bisect/baseline/ >=20 > cd binutils >=20 > # Reproduce first_bad build > git checkout --detach f76d800be844dd2aa4aa8f189a3ace16c5e931bc > ../artifacts/test.sh >=20 > # Reproduce last_good build > git checkout --detach 3524a83e5950576a807134dde6c180211219e655 > ../artifacts/test.sh >=20 > cd .. > >=20 > Full commit (up to 1000 lines): > > commit f76d800be844dd2aa4aa8f189a3ace16c5e931bc > Author: Jan Vrany > Date: Tue Jun 23 14:45:38 2020 +0100 >=20 > gdb/mi: use std::map for MI commands in mi-cmds.c >=20 > This changes the hashmap used in mi-cmds.c from a custom structure = to > std::map. Not only is replacing a custom container with a standard > one an improvement, but using std::map will make it easier to > dynamically add commands; which is something that is planned for a > later series, where we will allow MI commands to be implemented in > Python. >=20 > There should be no user visible changes after this commit. > --- > gdb/mi/mi-cmds.c | 478 = ++++++++++++++++++++++++++----------------------------- > 1 file changed, 230 insertions(+), 248 deletions(-) >=20 > diff --git a/gdb/mi/mi-cmds.c b/gdb/mi/mi-cmds.c > index 8899fdd3a1e..e0eba0bfa67 100644 > --- a/gdb/mi/mi-cmds.c > +++ b/gdb/mi/mi-cmds.c > @@ -22,283 +22,265 @@ > #include "top.h" > #include "mi-cmds.h" > #include "mi-main.h" > +#include > +#include >=20 > -struct mi_cmd; > -static struct mi_cmd **lookup_table (const char *command); > -static void build_table (struct mi_cmd *commands); > +/* A command held in the MI_CMD_TABLE. */ >=20 > -static struct mi_cmd mi_cmds[] =3D > -{ > -/* Define a MI command of NAME, and its corresponding CLI command is > - CLI_NAME. */ > -#define DEF_MI_CMD_CLI_1(NAME, CLI_NAME, ARGS_P, CALLED) \ > - { NAME, { CLI_NAME, ARGS_P}, NULL, CALLED } > -#define DEF_MI_CMD_CLI(NAME, CLI_NAME, ARGS_P) \ > - DEF_MI_CMD_CLI_1(NAME, CLI_NAME, ARGS_P, NULL) > +using mi_cmd_up =3D std::unique_ptr; >=20 > -/* Define a MI command of NAME, and implemented by function MI_FUNC. = */ > -#define DEF_MI_CMD_MI_1(NAME, MI_FUNC, CALLED) \ > - { NAME, {NULL, 0}, MI_FUNC, CALLED } > -#define DEF_MI_CMD_MI(NAME, MI_FUNC) DEF_MI_CMD_MI_1(NAME, MI_FUNC, = NULL) > +/* MI command table (built at run time). */ >=20 > - DEF_MI_CMD_MI ("ada-task-info", mi_cmd_ada_task_info), > - DEF_MI_CMD_MI ("add-inferior", mi_cmd_add_inferior), > - DEF_MI_CMD_CLI_1 ("break-after", "ignore", 1, > - &mi_suppress_notification.breakpoint), > - DEF_MI_CMD_MI_1 ("break-condition", mi_cmd_break_condition, > - &mi_suppress_notification.breakpoint), > - DEF_MI_CMD_MI_1 ("break-commands", mi_cmd_break_commands, > - &mi_suppress_notification.breakpoint), > - DEF_MI_CMD_CLI_1 ("break-delete", "delete breakpoint", 1, > - &mi_suppress_notification.breakpoint), > - DEF_MI_CMD_CLI_1 ("break-disable", "disable breakpoint", 1, > - &mi_suppress_notification.breakpoint), > - DEF_MI_CMD_CLI_1 ("break-enable", "enable breakpoint", 1, > - &mi_suppress_notification.breakpoint), > - DEF_MI_CMD_CLI ("break-info", "info break", 1), > - DEF_MI_CMD_MI_1 ("break-insert", mi_cmd_break_insert, > - &mi_suppress_notification.breakpoint), > - DEF_MI_CMD_MI_1 ("dprintf-insert", mi_cmd_dprintf_insert, > - &mi_suppress_notification.breakpoint), > - DEF_MI_CMD_CLI ("break-list", "info break", 0), > - DEF_MI_CMD_MI_1 ("break-passcount", mi_cmd_break_passcount, > - &mi_suppress_notification.breakpoint), > - DEF_MI_CMD_MI_1 ("break-watch", mi_cmd_break_watch, > - &mi_suppress_notification.breakpoint), > - DEF_MI_CMD_MI_1 ("catch-assert", mi_cmd_catch_assert, > - &mi_suppress_notification.breakpoint), > - DEF_MI_CMD_MI_1 ("catch-exception", mi_cmd_catch_exception, > - &mi_suppress_notification.breakpoint), > - DEF_MI_CMD_MI_1 ("catch-handlers", mi_cmd_catch_handlers, > - &mi_suppress_notification.breakpoint), > - DEF_MI_CMD_MI_1 ("catch-load", mi_cmd_catch_load, > - &mi_suppress_notification.breakpoint), > - DEF_MI_CMD_MI_1 ("catch-unload", mi_cmd_catch_unload, > - &mi_suppress_notification.breakpoint), > - DEF_MI_CMD_MI_1 ("catch-throw", mi_cmd_catch_throw, > - &mi_suppress_notification.breakpoint), > - DEF_MI_CMD_MI_1 ("catch-rethrow", mi_cmd_catch_rethrow, > - &mi_suppress_notification.breakpoint), > - DEF_MI_CMD_MI_1 ("catch-catch", mi_cmd_catch_catch, > - &mi_suppress_notification.breakpoint), > - DEF_MI_CMD_MI ("complete", mi_cmd_complete), > - DEF_MI_CMD_MI ("data-disassemble", mi_cmd_disassemble), > - DEF_MI_CMD_MI ("data-evaluate-expression", = mi_cmd_data_evaluate_expression), > - DEF_MI_CMD_MI ("data-list-changed-registers", > - mi_cmd_data_list_changed_registers), > - DEF_MI_CMD_MI ("data-list-register-names", = mi_cmd_data_list_register_names), > - DEF_MI_CMD_MI ("data-list-register-values", = mi_cmd_data_list_register_values), > - DEF_MI_CMD_MI ("data-read-memory", mi_cmd_data_read_memory), > - DEF_MI_CMD_MI ("data-read-memory-bytes", = mi_cmd_data_read_memory_bytes), > - DEF_MI_CMD_MI_1 ("data-write-memory", mi_cmd_data_write_memory, > - &mi_suppress_notification.memory), > - DEF_MI_CMD_MI_1 ("data-write-memory-bytes", = mi_cmd_data_write_memory_bytes, > - &mi_suppress_notification.memory), > - DEF_MI_CMD_MI ("data-write-register-values", > - mi_cmd_data_write_register_values), > - DEF_MI_CMD_MI ("enable-timings", mi_cmd_enable_timings), > - DEF_MI_CMD_MI ("enable-pretty-printing", = mi_cmd_enable_pretty_printing), > - DEF_MI_CMD_MI ("enable-frame-filters", = mi_cmd_enable_frame_filters), > - DEF_MI_CMD_MI ("environment-cd", mi_cmd_env_cd), > - DEF_MI_CMD_MI ("environment-directory", mi_cmd_env_dir), > - DEF_MI_CMD_MI ("environment-path", mi_cmd_env_path), > - DEF_MI_CMD_MI ("environment-pwd", mi_cmd_env_pwd), > - DEF_MI_CMD_CLI_1 ("exec-arguments", "set args", 1, > - &mi_suppress_notification.cmd_param_changed), > - DEF_MI_CMD_MI ("exec-continue", mi_cmd_exec_continue), > - DEF_MI_CMD_MI ("exec-finish", mi_cmd_exec_finish), > - DEF_MI_CMD_MI ("exec-jump", mi_cmd_exec_jump), > - DEF_MI_CMD_MI ("exec-interrupt", mi_cmd_exec_interrupt), > - DEF_MI_CMD_MI ("exec-next", mi_cmd_exec_next), > - DEF_MI_CMD_MI ("exec-next-instruction", = mi_cmd_exec_next_instruction), > - DEF_MI_CMD_MI ("exec-return", mi_cmd_exec_return), > - DEF_MI_CMD_MI ("exec-run", mi_cmd_exec_run), > - DEF_MI_CMD_MI ("exec-step", mi_cmd_exec_step), > - DEF_MI_CMD_MI ("exec-step-instruction", = mi_cmd_exec_step_instruction), > - DEF_MI_CMD_CLI ("exec-until", "until", 1), > - DEF_MI_CMD_CLI ("file-exec-and-symbols", "file", 1), > - DEF_MI_CMD_CLI ("file-exec-file", "exec-file", 1), > - DEF_MI_CMD_MI ("file-list-exec-source-file", > - mi_cmd_file_list_exec_source_file), > - DEF_MI_CMD_MI ("file-list-exec-source-files", > - mi_cmd_file_list_exec_source_files), > - DEF_MI_CMD_MI ("file-list-shared-libraries", > - mi_cmd_file_list_shared_libraries), > - DEF_MI_CMD_CLI ("file-symbol-file", "symbol-file", 1), > - DEF_MI_CMD_MI ("fix-multi-location-breakpoint-output", > - mi_cmd_fix_multi_location_breakpoint_output), > - DEF_MI_CMD_MI ("gdb-exit", mi_cmd_gdb_exit), > - DEF_MI_CMD_CLI_1 ("gdb-set", "set", 1, > - &mi_suppress_notification.cmd_param_changed), > - DEF_MI_CMD_CLI ("gdb-show", "show", 1), > - DEF_MI_CMD_CLI ("gdb-version", "show version", 0), > - DEF_MI_CMD_MI ("inferior-tty-set", mi_cmd_inferior_tty_set), > - DEF_MI_CMD_MI ("inferior-tty-show", mi_cmd_inferior_tty_show), > - DEF_MI_CMD_MI ("info-ada-exceptions", mi_cmd_info_ada_exceptions), > - DEF_MI_CMD_MI ("info-gdb-mi-command", mi_cmd_info_gdb_mi_command), > - DEF_MI_CMD_MI ("info-os", mi_cmd_info_os), > - DEF_MI_CMD_MI ("interpreter-exec", mi_cmd_interpreter_exec), > - DEF_MI_CMD_MI ("list-features", mi_cmd_list_features), > - DEF_MI_CMD_MI ("list-target-features", = mi_cmd_list_target_features), > - DEF_MI_CMD_MI ("list-thread-groups", mi_cmd_list_thread_groups), > - DEF_MI_CMD_MI ("remove-inferior", mi_cmd_remove_inferior), > - DEF_MI_CMD_MI ("stack-info-depth", mi_cmd_stack_info_depth), > - DEF_MI_CMD_MI ("stack-info-frame", mi_cmd_stack_info_frame), > - DEF_MI_CMD_MI ("stack-list-arguments", mi_cmd_stack_list_args), > - DEF_MI_CMD_MI ("stack-list-frames", mi_cmd_stack_list_frames), > - DEF_MI_CMD_MI ("stack-list-locals", mi_cmd_stack_list_locals), > - DEF_MI_CMD_MI ("stack-list-variables", = mi_cmd_stack_list_variables), > - DEF_MI_CMD_MI_1 ("stack-select-frame", mi_cmd_stack_select_frame, > - &mi_suppress_notification.user_selected_context), > - DEF_MI_CMD_MI ("symbol-list-lines", mi_cmd_symbol_list_lines), > - DEF_MI_CMD_MI ("symbol-info-functions", = mi_cmd_symbol_info_functions), > - DEF_MI_CMD_MI ("symbol-info-variables", = mi_cmd_symbol_info_variables), > - DEF_MI_CMD_MI ("symbol-info-types", mi_cmd_symbol_info_types), > - DEF_MI_CMD_MI ("symbol-info-modules", mi_cmd_symbol_info_modules), > - DEF_MI_CMD_MI ("symbol-info-module-functions", > - mi_cmd_symbol_info_module_functions), > - DEF_MI_CMD_MI ("symbol-info-module-variables", > - mi_cmd_symbol_info_module_variables), > - DEF_MI_CMD_CLI ("target-attach", "attach", 1), > - DEF_MI_CMD_MI ("target-detach", mi_cmd_target_detach), > - DEF_MI_CMD_CLI ("target-disconnect", "disconnect", 0), > - DEF_MI_CMD_CLI ("target-download", "load", 1), > - DEF_MI_CMD_MI ("target-file-delete", mi_cmd_target_file_delete), > - DEF_MI_CMD_MI ("target-file-get", mi_cmd_target_file_get), > - DEF_MI_CMD_MI ("target-file-put", mi_cmd_target_file_put), > - DEF_MI_CMD_MI ("target-flash-erase", mi_cmd_target_flash_erase), > - DEF_MI_CMD_CLI ("target-select", "target", 1), > - DEF_MI_CMD_MI ("thread-info", mi_cmd_thread_info), > - DEF_MI_CMD_MI ("thread-list-ids", mi_cmd_thread_list_ids), > - DEF_MI_CMD_MI_1 ("thread-select", mi_cmd_thread_select, > - &mi_suppress_notification.user_selected_context), > - DEF_MI_CMD_MI ("trace-define-variable", = mi_cmd_trace_define_variable), > - DEF_MI_CMD_MI_1 ("trace-find", mi_cmd_trace_find, > - &mi_suppress_notification.traceframe), > - DEF_MI_CMD_MI ("trace-frame-collected", > - mi_cmd_trace_frame_collected), > - DEF_MI_CMD_MI ("trace-list-variables", = mi_cmd_trace_list_variables), > - DEF_MI_CMD_MI ("trace-save", mi_cmd_trace_save), > - DEF_MI_CMD_MI ("trace-start", mi_cmd_trace_start), > - DEF_MI_CMD_MI ("trace-status", mi_cmd_trace_status), > - DEF_MI_CMD_MI ("trace-stop", mi_cmd_trace_stop), > - DEF_MI_CMD_MI ("var-assign", mi_cmd_var_assign), > - DEF_MI_CMD_MI ("var-create", mi_cmd_var_create), > - DEF_MI_CMD_MI ("var-delete", mi_cmd_var_delete), > - DEF_MI_CMD_MI ("var-evaluate-expression", = mi_cmd_var_evaluate_expression), > - DEF_MI_CMD_MI ("var-info-path-expression", = mi_cmd_var_info_path_expression), > - DEF_MI_CMD_MI ("var-info-expression", mi_cmd_var_info_expression), > - DEF_MI_CMD_MI ("var-info-num-children", = mi_cmd_var_info_num_children), > - DEF_MI_CMD_MI ("var-info-type", mi_cmd_var_info_type), > - DEF_MI_CMD_MI ("var-list-children", mi_cmd_var_list_children), > - DEF_MI_CMD_MI ("var-set-format", mi_cmd_var_set_format), > - DEF_MI_CMD_MI ("var-set-frozen", mi_cmd_var_set_frozen), > - DEF_MI_CMD_MI ("var-set-update-range", = mi_cmd_var_set_update_range), > - DEF_MI_CMD_MI ("var-set-visualizer", mi_cmd_var_set_visualizer), > - DEF_MI_CMD_MI ("var-show-attributes", mi_cmd_var_show_attributes), > - DEF_MI_CMD_MI ("var-show-format", mi_cmd_var_show_format), > - DEF_MI_CMD_MI ("var-update", mi_cmd_var_update), > - { NULL, } > -}; > +static std::map mi_cmd_table; >=20 > -/* Pointer to the mi command table (built at run time). */ > +/* Insert COMMAND into the global mi_cmd_table. Return false if > + COMMAND->name already exists in mi_cmd_table, in which case = COMMAND will > + not have been added to mi_cmd_table. Otherwise, return true, and > + COMMAND was added to mi_cmd_table. */ >=20 > -static struct mi_cmd **mi_table; > +static bool > +insert_mi_cmd_entry (mi_cmd_up command) > +{ > + gdb_assert (command !=3D nullptr); > + gdb_assert (command->name !=3D nullptr); >=20 > -/* A prime large enough to accomodate the entire command table. */ > -enum > - { > - MI_TABLE_SIZE =3D 227 > - }; > + std::string name (command->name); >=20 > -/* See mi-cmds.h. */ > + if (mi_cmd_table.find (name) !=3D mi_cmd_table.end ()) > + return false; >=20 > -struct mi_cmd * > -mi_cmd_lookup (const char *command) > + mi_cmd_table[name] =3D std::move (command); > + return true; > +} > + > +/* Create an mi_cmd structure with name NAME. */ > + > +static mi_cmd_up > +create_mi_cmd (const char *name) > { > - return *lookup_table (command); > + mi_cmd_up cmd (new mi_cmd ()); > + cmd->name =3D name; > + return cmd; > } >=20 > -/* Used for collecting hash hit/miss statistics. */ > +/* Create and register a new MI command with an MI specific = implementation. > + NAME must name an MI command that does not already exist, = otherwise an > + assertion will trigger. */ >=20 > -static struct > +static void > +add_mi_cmd_mi (const char *name, mi_cmd_argv_ftype function, > + int *suppress_notification =3D nullptr) > { > - int hit; > - int miss; > - int rehash; > -} stats; > + mi_cmd_up cmd_up =3D create_mi_cmd (name); > + > + cmd_up->cli.cmd =3D nullptr; > + cmd_up->cli.args_p =3D 0; > + cmd_up->argv_func =3D function; > + cmd_up->suppress_notification =3D suppress_notification; >=20 > -/* Look up a command. */ > + bool success =3D insert_mi_cmd_entry (std::move (cmd_up)); > + gdb_assert (success); > +} > + > +/* Create and register a new MI command implemented on top of a CLI > + command. NAME must name an MI command that does not already = exist, > + otherwise an assertion will trigger. */ >=20 > -static struct mi_cmd ** > -lookup_table (const char *command) > +static void > +add_mi_cmd_cli (const char *name, const char *cli_name, int args_p, > + int *suppress_notification =3D nullptr) > { > - const char *chp; > - unsigned int index =3D 0; > + mi_cmd_up cmd_up =3D create_mi_cmd (name); >=20 > - /* Compute our hash. */ > - for (chp =3D command; *chp; chp++) > - { > - /* We use a somewhat arbitrary formula. */ > - index =3D ((index << 6) + (unsigned int) *chp) % MI_TABLE_SIZE; > - } > + cmd_up->cli.cmd =3D cli_name; > + cmd_up->cli.args_p =3D args_p; > + cmd_up->argv_func =3D nullptr; > + cmd_up->suppress_notification =3D suppress_notification; >=20 > - while (1) > - { > - struct mi_cmd **entry =3D &mi_table[index]; > - if ((*entry) =3D=3D 0) > - { > - /* not found, return pointer to next free. */ > - stats.miss++; > - return entry; > - } > - if (strcmp (command, (*entry)->name) =3D=3D 0) > - { > - stats.hit++; > - return entry; /* found */ > - } > - index =3D (index + 1) % MI_TABLE_SIZE; > - stats.rehash++; > - } > + bool success =3D insert_mi_cmd_entry (std::move (cmd_up)); > + gdb_assert (success); > } >=20 > +/* Initialize MI_CMD_TABLE, the global map of MI commands. */ > + > static void > -build_table (struct mi_cmd *commands) > +build_table () > { > - int nr_rehash =3D 0; > - int nr_entries =3D 0; > - struct mi_cmd *command; > + add_mi_cmd_mi ("ada-task-info", mi_cmd_ada_task_info); > + add_mi_cmd_mi ("add-inferior", mi_cmd_add_inferior); > + add_mi_cmd_cli ("break-after", "ignore", 1, > + &mi_suppress_notification.breakpoint); > + add_mi_cmd_mi ("break-condition",mi_cmd_break_condition, > + &mi_suppress_notification.breakpoint); > + add_mi_cmd_mi ("break-commands", mi_cmd_break_commands, > + &mi_suppress_notification.breakpoint); > + add_mi_cmd_cli ("break-delete", "delete breakpoint", 1, > + &mi_suppress_notification.breakpoint); > + add_mi_cmd_cli ("break-disable", "disable breakpoint", 1, > + &mi_suppress_notification.breakpoint); > + add_mi_cmd_cli ("break-enable", "enable breakpoint", 1, > + &mi_suppress_notification.breakpoint); > + add_mi_cmd_cli ("break-info", "info break", 1); > + add_mi_cmd_mi ("break-insert", mi_cmd_break_insert, > + &mi_suppress_notification.breakpoint); > + add_mi_cmd_mi ("dprintf-insert", mi_cmd_dprintf_insert, > + &mi_suppress_notification.breakpoint); > + add_mi_cmd_cli ("break-list", "info break", 0); > + add_mi_cmd_mi ("break-passcount", mi_cmd_break_passcount, > + &mi_suppress_notification.breakpoint); > + add_mi_cmd_mi ("break-watch", mi_cmd_break_watch, > + &mi_suppress_notification.breakpoint); > + add_mi_cmd_mi ("catch-assert", mi_cmd_catch_assert, > + &mi_suppress_notification.breakpoint); > + add_mi_cmd_mi ("catch-exception", mi_cmd_catch_exception, > + &mi_suppress_notification.breakpoint); > + add_mi_cmd_mi ("catch-handlers", mi_cmd_catch_handlers, > + &mi_suppress_notification.breakpoint); > + add_mi_cmd_mi ("catch-load", mi_cmd_catch_load, > + &mi_suppress_notification.breakpoint); > + add_mi_cmd_mi ("catch-unload", mi_cmd_catch_unload, > + &mi_suppress_notification.breakpoint); > + add_mi_cmd_mi ("catch-throw", mi_cmd_catch_throw, > + &mi_suppress_notification.breakpoint), > + add_mi_cmd_mi ("catch-rethrow", mi_cmd_catch_rethrow, > + &mi_suppress_notification.breakpoint), > + add_mi_cmd_mi ("catch-catch", mi_cmd_catch_catch, > + &mi_suppress_notification.breakpoint), > + add_mi_cmd_mi ("complete", mi_cmd_complete); > + add_mi_cmd_mi ("data-disassemble", mi_cmd_disassemble); > + add_mi_cmd_mi ("data-evaluate-expression", = mi_cmd_data_evaluate_expression); > + add_mi_cmd_mi ("data-list-changed-registers", > + mi_cmd_data_list_changed_registers); > + add_mi_cmd_mi ("data-list-register-names", = mi_cmd_data_list_register_names); > + add_mi_cmd_mi ("data-list-register-values", > + mi_cmd_data_list_register_values); > + add_mi_cmd_mi ("data-read-memory", mi_cmd_data_read_memory); > + add_mi_cmd_mi ("data-read-memory-bytes", = mi_cmd_data_read_memory_bytes); > + add_mi_cmd_mi ("data-write-memory", mi_cmd_data_write_memory, > + &mi_suppress_notification.memory); > + add_mi_cmd_mi ("data-write-memory-bytes", = mi_cmd_data_write_memory_bytes, > + &mi_suppress_notification.memory); > + add_mi_cmd_mi ("data-write-register-values", > + mi_cmd_data_write_register_values); > + add_mi_cmd_mi ("enable-timings", mi_cmd_enable_timings); > + add_mi_cmd_mi ("enable-pretty-printing", = mi_cmd_enable_pretty_printing); > + add_mi_cmd_mi ("enable-frame-filters", = mi_cmd_enable_frame_filters); > + add_mi_cmd_mi ("environment-cd", mi_cmd_env_cd); > + add_mi_cmd_mi ("environment-directory", mi_cmd_env_dir); > + add_mi_cmd_mi ("environment-path", mi_cmd_env_path); > + add_mi_cmd_mi ("environment-pwd", mi_cmd_env_pwd); > + add_mi_cmd_cli ("exec-arguments", "set args", 1, > + &mi_suppress_notification.cmd_param_changed); > + add_mi_cmd_mi ("exec-continue", mi_cmd_exec_continue); > + add_mi_cmd_mi ("exec-finish", mi_cmd_exec_finish); > + add_mi_cmd_mi ("exec-jump", mi_cmd_exec_jump); > + add_mi_cmd_mi ("exec-interrupt", mi_cmd_exec_interrupt); > + add_mi_cmd_mi ("exec-next", mi_cmd_exec_next); > + add_mi_cmd_mi ("exec-next-instruction", = mi_cmd_exec_next_instruction); > + add_mi_cmd_mi ("exec-return", mi_cmd_exec_return); > + add_mi_cmd_mi ("exec-run", mi_cmd_exec_run); > + add_mi_cmd_mi ("exec-step", mi_cmd_exec_step); > + add_mi_cmd_mi ("exec-step-instruction", = mi_cmd_exec_step_instruction); > + add_mi_cmd_cli ("exec-until", "until", 1); > + add_mi_cmd_cli ("file-exec-and-symbols", "file", 1); > + add_mi_cmd_cli ("file-exec-file", "exec-file", 1); > + add_mi_cmd_mi ("file-list-exec-source-file", > + mi_cmd_file_list_exec_source_file); > + add_mi_cmd_mi ("file-list-exec-source-files", > + mi_cmd_file_list_exec_source_files); > + add_mi_cmd_mi ("file-list-shared-libraries", > + mi_cmd_file_list_shared_libraries), > + add_mi_cmd_cli ("file-symbol-file", "symbol-file", 1); > + add_mi_cmd_mi ("fix-multi-location-breakpoint-output", > + mi_cmd_fix_multi_location_breakpoint_output), > + add_mi_cmd_mi ("gdb-exit", mi_cmd_gdb_exit); > + add_mi_cmd_cli ("gdb-set", "set", 1, > + &mi_suppress_notification.cmd_param_changed); > + add_mi_cmd_cli ("gdb-show", "show", 1); > + add_mi_cmd_cli ("gdb-version", "show version", 0); > + add_mi_cmd_mi ("inferior-tty-set", mi_cmd_inferior_tty_set); > + add_mi_cmd_mi ("inferior-tty-show", mi_cmd_inferior_tty_show); > + add_mi_cmd_mi ("info-ada-exceptions", mi_cmd_info_ada_exceptions); > + add_mi_cmd_mi ("info-gdb-mi-command", mi_cmd_info_gdb_mi_command); > + add_mi_cmd_mi ("info-os", mi_cmd_info_os); > + add_mi_cmd_mi ("interpreter-exec", mi_cmd_interpreter_exec); > + add_mi_cmd_mi ("list-features", mi_cmd_list_features); > + add_mi_cmd_mi ("list-target-features", = mi_cmd_list_target_features); > + add_mi_cmd_mi ("list-thread-groups", mi_cmd_list_thread_groups); > + add_mi_cmd_mi ("remove-inferior", mi_cmd_remove_inferior); > + add_mi_cmd_mi ("stack-info-depth", mi_cmd_stack_info_depth); > + add_mi_cmd_mi ("stack-info-frame", mi_cmd_stack_info_frame); > + add_mi_cmd_mi ("stack-list-arguments", mi_cmd_stack_list_args); > + add_mi_cmd_mi ("stack-list-frames", mi_cmd_stack_list_frames); > + add_mi_cmd_mi ("stack-list-locals", mi_cmd_stack_list_locals); > + add_mi_cmd_mi ("stack-list-variables", = mi_cmd_stack_list_variables); > + add_mi_cmd_mi ("stack-select-frame", mi_cmd_stack_select_frame, > + &mi_suppress_notification.user_selected_context); > + add_mi_cmd_mi ("symbol-list-lines", mi_cmd_symbol_list_lines); > + add_mi_cmd_mi ("symbol-info-functions", = mi_cmd_symbol_info_functions); > + add_mi_cmd_mi ("symbol-info-variables", = mi_cmd_symbol_info_variables); > + add_mi_cmd_mi ("symbol-info-types", mi_cmd_symbol_info_types); > + add_mi_cmd_mi ("symbol-info-modules", mi_cmd_symbol_info_modules); > + add_mi_cmd_mi ("symbol-info-module-functions", > + mi_cmd_symbol_info_module_functions); > + add_mi_cmd_mi ("symbol-info-module-variables", > + mi_cmd_symbol_info_module_variables); > + add_mi_cmd_cli ("target-attach", "attach", 1); > + add_mi_cmd_mi ("target-detach", mi_cmd_target_detach); > + add_mi_cmd_cli ("target-disconnect", "disconnect", 0); > + add_mi_cmd_cli ("target-download", "load", 1); > + add_mi_cmd_mi ("target-file-delete", mi_cmd_target_file_delete); > + add_mi_cmd_mi ("target-file-get", mi_cmd_target_file_get); > + add_mi_cmd_mi ("target-file-put", mi_cmd_target_file_put); > + add_mi_cmd_mi ("target-flash-erase", mi_cmd_target_flash_erase); > + add_mi_cmd_cli ("target-select", "target", 1); > + add_mi_cmd_mi ("thread-info", mi_cmd_thread_info); > + add_mi_cmd_mi ("thread-list-ids", mi_cmd_thread_list_ids); > + add_mi_cmd_mi ("thread-select", mi_cmd_thread_select, > + &mi_suppress_notification.user_selected_context); > + add_mi_cmd_mi ("trace-define-variable", = mi_cmd_trace_define_variable); > + add_mi_cmd_mi ("trace-find", mi_cmd_trace_find, > + &mi_suppress_notification.traceframe); > + add_mi_cmd_mi ("trace-frame-collected", = mi_cmd_trace_frame_collected); > + add_mi_cmd_mi ("trace-list-variables", = mi_cmd_trace_list_variables); > + add_mi_cmd_mi ("trace-save", mi_cmd_trace_save); > + add_mi_cmd_mi ("trace-start", mi_cmd_trace_start); > + add_mi_cmd_mi ("trace-status", mi_cmd_trace_status); > + add_mi_cmd_mi ("trace-stop", mi_cmd_trace_stop); > + add_mi_cmd_mi ("var-assign", mi_cmd_var_assign); > + add_mi_cmd_mi ("var-create", mi_cmd_var_create); > + add_mi_cmd_mi ("var-delete", mi_cmd_var_delete); > + add_mi_cmd_mi ("var-evaluate-expression", = mi_cmd_var_evaluate_expression); > + add_mi_cmd_mi ("var-info-path-expression", = mi_cmd_var_info_path_expression); > + add_mi_cmd_mi ("var-info-expression", mi_cmd_var_info_expression); > + add_mi_cmd_mi ("var-info-num-children", = mi_cmd_var_info_num_children); > + add_mi_cmd_mi ("var-info-type", mi_cmd_var_info_type); > + add_mi_cmd_mi ("var-list-children", mi_cmd_var_list_children); > + add_mi_cmd_mi ("var-set-format", mi_cmd_var_set_format); > + add_mi_cmd_mi ("var-set-frozen", mi_cmd_var_set_frozen); > + add_mi_cmd_mi ("var-set-update-range", = mi_cmd_var_set_update_range); > + add_mi_cmd_mi ("var-set-visualizer", mi_cmd_var_set_visualizer); > + add_mi_cmd_mi ("var-show-attributes", mi_cmd_var_show_attributes); > + add_mi_cmd_mi ("var-show-format", mi_cmd_var_show_format); > + add_mi_cmd_mi ("var-update", mi_cmd_var_update); > +} >=20 > - mi_table =3D XCNEWVEC (struct mi_cmd *, MI_TABLE_SIZE); > - for (command =3D commands; command->name !=3D 0; command++) > - { > - struct mi_cmd **entry =3D lookup_table (command->name); > +/* See mi-cmds.h. */ > + > +struct mi_cmd * > +mi_cmd_lookup (const char *command) > +{ > + gdb_assert (command !=3D nullptr); >=20 > - if (*entry) > - internal_error (__FILE__, __LINE__, > - _("command `%s' appears to be duplicated"), > - command->name); > - *entry =3D command; > - /* FIXME lose these prints */ > - if (0) > - { > - fprintf_unfiltered (gdb_stdlog, "%-30s %2d\n", > - command->name, stats.rehash - nr_rehash); > - } > - nr_entries++; > - nr_rehash =3D stats.rehash; > - } > - if (0) > - { > - fprintf_filtered (gdb_stdlog, "Average %3.1f\n", > - (double) nr_rehash / (double) nr_entries); > - } > + auto it =3D mi_cmd_table.find (command); > + if (it =3D=3D mi_cmd_table.end ()) > + return nullptr; > + return it->second.get (); > } >=20 > void _initialize_mi_cmds (); > void > _initialize_mi_cmds () > { > - build_table (mi_cmds); > - memset (&stats, 0, sizeof (stats)); > + build_table (); > } >