Regression notification from "TCWG CI"

Jan Vrany via Gdb <[email protected]>
Newsgroups gmane.comp.gdb.devel
Message-ID <[email protected]>
Hi there,

I've got two messages from "TCWG CI" about regression caused two
of "my" commits (see one such message below).

I looked around trying to figure out what's the problem but could not
find anything relevant. The closest indication of some error I found
is:

--
+ ./jenkins-scripts/../bmk-scripts/merge-metric-csvs.py /home/tcwg-
buildslave/workspace/tcwg_bmk_2/artifacts/build-
f76d800be844dd2aa4aa8f189a3ace16c5e931bc/09-check_regression/results-
perf-0.csv /home/tcwg-buildslave/workspace/tcwg_bmk_2/artifacts/build-
f76d800be844dd2aa4aa8f189a3ace16c5e931bc/09-check_regression/results-
vect-0.csv
Traceback (most recent call last):
  File "./jenkins-scripts/../bmk-scripts/merge-metric-csvs.py", line
17, in <module>
    main()
  File "./jenkins-scripts/../bmk-scripts/merge-metric-csvs.py", line
13, in main
    result = pd.merge(df1, df2, on=["benchmark", "symbol"])
...
--
in
https://ci.linaro.org/job/tcwg_bmk_ci_gnu_eabi-bisect-tcwg_bmk_stm32-gnu_eabi-master-arm_eabi-coremark-O3/14/artifact/artifacts/build-f76d800be844dd2aa4aa8f189a3ace16c5e931bc/09-check_regression/results.log

but this looks to me more like an error is CI job than error in the
commit itself.

When following "repoduce steps" from that email, I got another error:

--
ERROR: required parameter ssh_host not set
--


Could please someone point me to where I find out what's the
regression?

Thanks a lot!

Jan


On Mon, 2021-12-20 at 00:14 +0000, [email protected] wrote:
> [TCWG CI] Regression caused by binutils: gdb/mi: use std::map for MI
> commands in mi-cmds.c:
> commit f76d800be844dd2aa4aa8f189a3ace16c5e931bc
> Author: Jan Vrany <[email protected]>
>
>     gdb/mi: use std::map for MI commands in mi-cmds.c
>
> Results regressed to
> # reset_artifacts:
> -10
> # build_abe binutils:
> -9
> # build_abe stage1 -- --set gcc_override_configure=--disable-
> libsanitizer --set gcc_override_configure=--disable-multilib --set
> gcc_override_configure=--with-cpu=cortex-m4 --set
> gcc_override_configure=--with-mode=thumb --set
> gcc_override_configure=--with-float=hard:
> -8
> # build_abe newlib:
> -6
> # build_abe stage2 -- --set gcc_override_configure=--disable-
> libsanitizer --set gcc_override_configure=--disable-multilib --set
> gcc_override_configure=--with-cpu=cortex-m4 --set
> gcc_override_configure=--with-mode=thumb --set
> gcc_override_configure=--with-float=hard:
> -5
> # benchmark -- -O3_mthumb artifacts/build-
> f76d800be844dd2aa4aa8f189a3ace16c5e931bc/results_id:
> 1
>
> from
> # reset_artifacts:
> -10
> # build_abe binutils:
> -9
> # build_abe stage1 -- --set gcc_override_configure=--disable-
> libsanitizer --set gcc_override_configure=--disable-multilib --set
> gcc_override_configure=--with-cpu=cortex-m4 --set
> gcc_override_configure=--with-mode=thumb --set
> gcc_override_configure=--with-float=hard:
> -8
> # build_abe newlib:
> -6
> # build_abe stage2 -- --set gcc_override_configure=--disable-
> libsanitizer --set gcc_override_configure=--disable-multilib --set
> gcc_override_configure=--with-cpu=cortex-m4 --set
> gcc_override_configure=--with-mode=thumb --set
> gcc_override_configure=--with-float=hard:
> -5
> # benchmark -- -O3_mthumb artifacts/build-baseline/results_id:
> 1
>
> THIS IS THE END OF INTERESTING STUFF.  BELOW ARE LINKS TO BUILDS,
> REPRODUCTION INSTRUCTIONS, AND THE RAW COMMIT.
>
> This commit has regressed these CI configurations:
>  - tcwg_bmk_gnu_eabi_stm32/gnu_eabi-master-arm_eabi-coremark-O3
>
> First_bad build:
> https://urldefense.proofpoint.com/v2/url?u=https-3A__ci.linaro.org_job_tcwg-5Fbmk-5Fci-5Fgnu-5Feabi-2Dbisect-2Dtcwg-5Fbmk-5Fstm32-2Dgnu-5Feabi-2Dmaster-2Darm-5Feabi-2Dcoremark-2DO3_14_artifact_artifacts_build-2Df76d800be844dd2aa4aa8f189a3ace16c5e931bc_&d=DwICaQ&c=sPZ6DeHLiehUHQWKIrsNwWp3t7snrE-az24ztT0w7Jc&r=WpFFGgYa98Yp-c29WHTCwU1wAGFBvszA6a4RzgpMSqc&m=yPy1Q8DQorOZeUTtAs_Fd_zVq5HQvzzs4ve84wsXPDA&s=lezFCLobD_ObOLEDDy_IAdfDRCq2oZ8pkUaJGDGtaJw&e=
>  
> Last_good build:
> https://urldefense.proofpoint.com/v2/url?u=https-3A__ci.linaro.org_job_tcwg-5Fbmk-5Fci-5Fgnu-5Feabi-2Dbisect-2Dtcwg-5Fbmk-5Fstm32-2Dgnu-5Feabi-2Dmaster-2Darm-5Feabi-2Dcoremark-2DO3_14_artifact_artifacts_build-2D3524a83e5950576a807134dde6c180211219e655_&d=DwICaQ&c=sPZ6DeHLiehUHQWKIrsNwWp3t7snrE-az24ztT0w7Jc&r=WpFFGgYa98Yp-c29WHTCwU1wAGFBvszA6a4RzgpMSqc&m=yPy1Q8DQorOZeUTtAs_Fd_zVq5HQvzzs4ve84wsXPDA&s=MABjVGTzi29xTaCvfRHkduQMVEnKtFHJsxyJEZI-oX4&e=
>  
> Baseline build:
> https://urldefense.proofpoint.com/v2/url?u=https-3A__ci.linaro.org_job_tcwg-5Fbmk-5Fci-5Fgnu-5Feabi-2Dbisect-2Dtcwg-5Fbmk-5Fstm32-2Dgnu-5Feabi-2Dmaster-2Darm-5Feabi-2Dcoremark-2DO3_14_artifact_artifacts_build-2Dbaseline_&d=DwICaQ&c=sPZ6DeHLiehUHQWKIrsNwWp3t7snrE-az24ztT0w7Jc&r=WpFFGgYa98Yp-c29WHTCwU1wAGFBvszA6a4RzgpMSqc&m=yPy1Q8DQorOZeUTtAs_Fd_zVq5HQvzzs4ve84wsXPDA&s=Uu_h9Pb17NeBhfCESHmCIYIC4A9tDfHVwgpi6xvJqhQ&e=
>  
> Even more details:
> https://urldefense.proofpoint.com/v2/url?u=https-3A__ci.linaro.org_job_tcwg-5Fbmk-5Fci-5Fgnu-5Feabi-2Dbisect-2Dtcwg-5Fbmk-5Fstm32-2Dgnu-5Feabi-2Dmaster-2Darm-5Feabi-2Dcoremark-2DO3_14_artifact_artifacts_&d=DwICaQ&c=sPZ6DeHLiehUHQWKIrsNwWp3t7snrE-az24ztT0w7Jc&r=WpFFGgYa98Yp-c29WHTCwU1wAGFBvszA6a4RzgpMSqc&m=yPy1Q8DQorOZeUTtAs_Fd_zVq5HQvzzs4ve84wsXPDA&s=X1BiIl9FU59qW4vTB__RXw2l1KfOh_VmQOFT25s0uLI&e=
>  
>
> Reproduce builds:
> <cut>
> mkdir investigate-binutils-f76d800be844dd2aa4aa8f189a3ace16c5e931bc
> cd investigate-binutils-f76d800be844dd2aa4aa8f189a3ace16c5e931bc
>
> # Fetch scripts
> git clone
> https://urldefense.proofpoint.com/v2/url?u=https-3A__git.linaro.org_toolchain_jenkins-2Dscripts&d=DwICaQ&c=sPZ6DeHLiehUHQWKIrsNwWp3t7snrE-az24ztT0w7Jc&r=WpFFGgYa98Yp-c29WHTCwU1wAGFBvszA6a4RzgpMSqc&m=yPy1Q8DQorOZeUTtAs_Fd_zVq5HQvzzs4ve84wsXPDA&s=mP1EJUt6AC3nrKx2JcB2ZYswMTpcQSFmiywzX-gPrsE&e=
>  
>
> # Fetch manifests and test.sh script
> mkdir -p artifacts/manifests
> curl -o artifacts/manifests/build-baseline.sh
> https://urldefense.proofpoint.com/v2/url?u=https-3A__ci.linaro.org_job_tcwg-5Fbmk-5Fci-5Fgnu-5Feabi-2Dbisect-2Dtcwg-5Fbmk-5Fstm32-2Dgnu-5Feabi-2Dmaster-2Darm-5Feabi-2Dcoremark-2DO3_14_artifact_artifacts_manifests_build-2Dbaseline.sh&d=DwICaQ&c=sPZ6DeHLiehUHQWKIrsNwWp3t7snrE-az24ztT0w7Jc&r=WpFFGgYa98Yp-c29WHTCwU1wAGFBvszA6a4RzgpMSqc&m=yPy1Q8DQorOZeUTtAs_Fd_zVq5HQvzzs4ve84wsXPDA&s=ARdZzUnjkuI93rLscvXi61NAuqlEGKEKKNXl6rlbKAQ&e=
>   --fail
> curl -o artifacts/manifests/build-parameters.sh
> https://urldefense.proofpoint.com/v2/url?u=https-3A__ci.linaro.org_job_tcwg-5Fbmk-5Fci-5Fgnu-5Feabi-2Dbisect-2Dtcwg-5Fbmk-5Fstm32-2Dgnu-5Feabi-2Dmaster-2Darm-5Feabi-2Dcoremark-2DO3_14_artifact_artifacts_manifests_build-2Dparameters.sh&d=DwICaQ&c=sPZ6DeHLiehUHQWKIrsNwWp3t7snrE-az24ztT0w7Jc&r=WpFFGgYa98Yp-c29WHTCwU1wAGFBvszA6a4RzgpMSqc&m=yPy1Q8DQorOZeUTtAs_Fd_zVq5HQvzzs4ve84wsXPDA&s=mzabeG-94q2wQJwn6acq9K3bNKJ_8BpwTJe-hZZ3StA&e=
>   --fail
> curl -o artifacts/test.sh
> https://urldefense.proofpoint.com/v2/url?u=https-3A__ci.linaro.org_job_tcwg-5Fbmk-5Fci-5Fgnu-5Feabi-2Dbisect-2Dtcwg-5Fbmk-5Fstm32-2Dgnu-5Feabi-2Dmaster-2Darm-5Feabi-2Dcoremark-2DO3_14_artifact_artifacts_test.sh&d=DwICaQ&c=sPZ6DeHLiehUHQWKIrsNwWp3t7snrE-az24ztT0w7Jc&r=WpFFGgYa98Yp-c29WHTCwU1wAGFBvszA6a4RzgpMSqc&m=yPy1Q8DQorOZeUTtAs_Fd_zVq5HQvzzs4ve84wsXPDA&s=Rio2j8F-OUPNTlkh9wi9vle9N4o1YQeEBbt1N-hA0C8&e=
>   --fail
> chmod +x artifacts/test.sh
>
> # Reproduce the baseline build (build all pre-requisites)
> ./jenkins-scripts/tcwg_bmk-build.sh @@ artifacts/manifests/build-
> baseline.sh
>
> # 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/
>
> cd binutils
>
> # Reproduce first_bad build
> git checkout --detach f76d800be844dd2aa4aa8f189a3ace16c5e931bc
> ../artifacts/test.sh
>
> # Reproduce last_good build
> git checkout --detach 3524a83e5950576a807134dde6c180211219e655
> ../artifacts/test.sh
>
> cd ..
> </cut>
>
> Full commit (up to 1000 lines):
> <cut>
> commit f76d800be844dd2aa4aa8f189a3ace16c5e931bc
> Author: Jan Vrany <[email protected]>
> Date:   Tue Jun 23 14:45:38 2020 +0100
>
>     gdb/mi: use std::map for MI commands in mi-cmds.c
>    
>     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.
>    
>     There should be no user visible changes after this commit.
> ---
>  gdb/mi/mi-cmds.c | 478 ++++++++++++++++++++++++++-------------------
> ----------
>  1 file changed, 230 insertions(+), 248 deletions(-)
>
> 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 <map>
> +#include <string>
>  
> -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.  */
>  
> -static struct mi_cmd mi_cmds[] =
> -{
> -/* 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 = std::unique_ptr<struct mi_cmd>;
>  
> -/* 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). */
>  
> -  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<std::string, mi_cmd_up> mi_cmd_table;
>  
> -/* 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.  */
>  
> -static struct mi_cmd **mi_table;
> +static bool
> +insert_mi_cmd_entry (mi_cmd_up command)
> +{
> +  gdb_assert (command != nullptr);
> +  gdb_assert (command->name != nullptr);
>  
> -/* A prime large enough to accomodate the entire command table.  */
> -enum
> -  {
> -    MI_TABLE_SIZE = 227
> -  };
> +  std::string name (command->name);
>  
> -/* See mi-cmds.h.  */
> +  if (mi_cmd_table.find (name) != mi_cmd_table.end ())
> +    return false;
>  
> -struct mi_cmd *
> -mi_cmd_lookup (const char *command)
> +  mi_cmd_table[name] = 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 = name;
> +  return cmd;
>  }
>  
> -/* 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.  */
>  
> -static struct
> +static void
> +add_mi_cmd_mi (const char *name, mi_cmd_argv_ftype function,
> +              int *suppress_notification = nullptr)
>  {
> -  int hit;
> -  int miss;
> -  int rehash;
> -} stats;
> +  mi_cmd_up cmd_up = create_mi_cmd (name);
> +
> +  cmd_up->cli.cmd = nullptr;
> +  cmd_up->cli.args_p = 0;
> +  cmd_up->argv_func = function;
> +  cmd_up->suppress_notification = suppress_notification;
>  
> -/* Look up a command.  */
> +  bool success = 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.  */
>  
> -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 = nullptr)
>  {
> -  const char *chp;
> -  unsigned int index = 0;
> +  mi_cmd_up cmd_up = create_mi_cmd (name);
>  
> -  /* Compute our hash.  */
> -  for (chp = command; *chp; chp++)
> -    {
> -      /* We use a somewhat arbitrary formula.  */
> -      index = ((index << 6) + (unsigned int) *chp) % MI_TABLE_SIZE;
> -    }
> +  cmd_up->cli.cmd = cli_name;
> +  cmd_up->cli.args_p = args_p;
> +  cmd_up->argv_func = nullptr;
> +  cmd_up->suppress_notification = suppress_notification;
>  
> -  while (1)
> -    {
> -      struct mi_cmd **entry = &mi_table[index];
> -      if ((*entry) == 0)
> -       {
> -         /* not found, return pointer to next free. */
> -         stats.miss++;
> -         return entry;
> -       }
> -      if (strcmp (command, (*entry)->name) == 0)
> -       {
> -         stats.hit++;
> -         return entry;         /* found */
> -       }
> -      index = (index + 1) % MI_TABLE_SIZE;
> -      stats.rehash++;
> -    }
> +  bool success = insert_mi_cmd_entry (std::move (cmd_up));
> +  gdb_assert (success);
>  }
>  
> +/* Initialize MI_CMD_TABLE, the global map of MI commands.  */
> +
>  static void
> -build_table (struct mi_cmd *commands)
> +build_table ()
>  {
> -  int nr_rehash = 0;
> -  int nr_entries = 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);
> +}
>  
> -  mi_table = XCNEWVEC (struct mi_cmd *, MI_TABLE_SIZE);
> -  for (command = commands; command->name != 0; command++)
> -    {
> -      struct mi_cmd **entry = lookup_table (command->name);
> +/* See mi-cmds.h.  */
> +
> +struct mi_cmd *
> +mi_cmd_lookup (const char *command)
> +{
> +  gdb_assert (command != nullptr);
>  
> -      if (*entry)
> -       internal_error (__FILE__, __LINE__,
> -                       _("command `%s' appears to be duplicated"),
> -                       command->name);
> -      *entry = command;
> -      /* FIXME lose these prints */
> -      if (0)
> -       {
> -         fprintf_unfiltered (gdb_stdlog, "%-30s %2d\n",
> -                             command->name, stats.rehash -
> nr_rehash);
> -       }
> -      nr_entries++;
> -      nr_rehash = stats.rehash;
> -    }
> -  if (0)
> -    {
> -      fprintf_filtered (gdb_stdlog, "Average %3.1f\n",
> -                       (double) nr_rehash / (double) nr_entries);
> -    }
> +  auto it = mi_cmd_table.find (command);
> +  if (it == mi_cmd_table.end ())
> +    return nullptr;
> +  return it->second.get ();
>  }
>  
>  void _initialize_mi_cmds ();
>  void
>  _initialize_mi_cmds ()
>  {
> -  build_table (mi_cmds);
> -  memset (&stats, 0, sizeof (stats));
> +  build_table ();
>  }
> </cut>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.