From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-4317.proton.ch (mail-4317.proton.ch [185.70.43.17]) by sourceware.org (Postfix) with ESMTPS id BA90A3858006 for ; Mon, 20 Dec 2021 13:01:20 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org BA90A3858006 Date: Mon, 20 Dec 2021 13:01:04 +0000 To: gdb@sourceware.org From: Jan Vrany Reply-To: Jan Vrany Subject: Regression notification from "TCWG CI" Message-ID: <4f4a0ec6fbe147075630235c8b485c597ff8d6a1.camel@vrany.io> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Status: No, score=-11.1 required=5.0 tests=BAYES_00, BODY_8BITS, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_LOTSOFHASH, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, 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: gdb@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 20 Dec 2021 13:01:25 -0000 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 main() File "./jenkins-scripts/../bmk-scripts/merge-metric-csvs.py", line 13, in main result =3D pd.merge(df1, df2, on=3D["benchmark", "symbol"]) ... -- in https://ci.linaro.org/job/tcwg_bmk_ci_gnu_eabi-bisect-tcwg_bmk_stm32-gnu_ea= bi-master-arm_eabi-coremark-O3/14/artifact/artifacts/build-f76d800be844dd2a= a4aa8f189a3ace16c5e931bc/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, ci_notify@linaro.org wrote: > [TCWG CI] Regression caused by binutils: gdb/mi: use std::map for MI > commands in mi-cmds.c: > commit f76d800be844dd2aa4aa8f189a3ace16c5e931bc > Author: Jan Vrany > > =C2=A0=C2=A0=C2=A0 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=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 > > 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 > > THIS IS THE END OF INTERESTING STUFF.=C2=A0 BELOW ARE LINKS TO BUILDS, > REPRODUCTION INSTRUCTIONS, AND THE RAW COMMIT. > > This commit has regressed these CI configurations: > =C2=A0- tcwg_bmk_gnu_eabi_stm32/gnu_eabi-master-arm_eabi-coremark-O3 > > First_bad build: > https://urldefense.proofpoint.com/v2/url?u=3Dhttps-3A__ci.linaro.org_job_= tcwg-5Fbmk-5Fci-5Fgnu-5Feabi-2Dbisect-2Dtcwg-5Fbmk-5Fstm32-2Dgnu-5Feabi-2Dm= aster-2Darm-5Feabi-2Dcoremark-2DO3_14_artifact_artifacts_build-2Df76d800be8= 44dd2aa4aa8f189a3ace16c5e931bc_&d=3DDwICaQ&c=3DsPZ6DeHLiehUHQWKIrsNwWp3t7sn= rE-az24ztT0w7Jc&r=3DWpFFGgYa98Yp-c29WHTCwU1wAGFBvszA6a4RzgpMSqc&m=3DyPy1Q8D= QorOZeUTtAs_Fd_zVq5HQvzzs4ve84wsXPDA&s=3DlezFCLobD_ObOLEDDy_IAdfDRCq2oZ8pkU= aJGDGtaJw&e=3D > =C2=A0 > Last_good build: > https://urldefense.proofpoint.com/v2/url?u=3Dhttps-3A__ci.linaro.org_job_= tcwg-5Fbmk-5Fci-5Fgnu-5Feabi-2Dbisect-2Dtcwg-5Fbmk-5Fstm32-2Dgnu-5Feabi-2Dm= aster-2Darm-5Feabi-2Dcoremark-2DO3_14_artifact_artifacts_build-2D3524a83e59= 50576a807134dde6c180211219e655_&d=3DDwICaQ&c=3DsPZ6DeHLiehUHQWKIrsNwWp3t7sn= rE-az24ztT0w7Jc&r=3DWpFFGgYa98Yp-c29WHTCwU1wAGFBvszA6a4RzgpMSqc&m=3DyPy1Q8D= QorOZeUTtAs_Fd_zVq5HQvzzs4ve84wsXPDA&s=3DMABjVGTzi29xTaCvfRHkduQMVEnKtFHJsx= yJEZI-oX4&e=3D > =C2=A0 > Baseline build: > https://urldefense.proofpoint.com/v2/url?u=3Dhttps-3A__ci.linaro.org_job_= tcwg-5Fbmk-5Fci-5Fgnu-5Feabi-2Dbisect-2Dtcwg-5Fbmk-5Fstm32-2Dgnu-5Feabi-2Dm= aster-2Darm-5Feabi-2Dcoremark-2DO3_14_artifact_artifacts_build-2Dbaseline_&= d=3DDwICaQ&c=3DsPZ6DeHLiehUHQWKIrsNwWp3t7snrE-az24ztT0w7Jc&r=3DWpFFGgYa98Yp= -c29WHTCwU1wAGFBvszA6a4RzgpMSqc&m=3DyPy1Q8DQorOZeUTtAs_Fd_zVq5HQvzzs4ve84ws= XPDA&s=3DUu_h9Pb17NeBhfCESHmCIYIC4A9tDfHVwgpi6xvJqhQ&e=3D > =C2=A0 > Even more details: > https://urldefense.proofpoint.com/v2/url?u=3Dhttps-3A__ci.linaro.org_job_= tcwg-5Fbmk-5Fci-5Fgnu-5Feabi-2Dbisect-2Dtcwg-5Fbmk-5Fstm32-2Dgnu-5Feabi-2Dm= aster-2Darm-5Feabi-2Dcoremark-2DO3_14_artifact_artifacts_&d=3DDwICaQ&c=3DsP= Z6DeHLiehUHQWKIrsNwWp3t7snrE-az24ztT0w7Jc&r=3DWpFFGgYa98Yp-c29WHTCwU1wAGFBv= szA6a4RzgpMSqc&m=3DyPy1Q8DQorOZeUTtAs_Fd_zVq5HQvzzs4ve84wsXPDA&s=3DX1BiIl9F= U59qW4vTB__RXw2l1KfOh_VmQOFT25s0uLI&e=3D > =C2=A0 > > Reproduce builds: > > mkdir investigate-binutils-f76d800be844dd2aa4aa8f189a3ace16c5e931bc > cd investigate-binutils-f76d800be844dd2aa4aa8f189a3ace16c5e931bc > > # Fetch scripts > git clone > https://urldefense.proofpoint.com/v2/url?u=3Dhttps-3A__git.linaro.org_too= lchain_jenkins-2Dscripts&d=3DDwICaQ&c=3DsPZ6DeHLiehUHQWKIrsNwWp3t7snrE-az24= ztT0w7Jc&r=3DWpFFGgYa98Yp-c29WHTCwU1wAGFBvszA6a4RzgpMSqc&m=3DyPy1Q8DQorOZeU= TtAs_Fd_zVq5HQvzzs4ve84wsXPDA&s=3DmP1EJUt6AC3nrKx2JcB2ZYswMTpcQSFmiywzX-gPr= sE&e=3D > =C2=A0 > > # Fetch manifests and test.sh script > mkdir -p artifacts/manifests > curl -o artifacts/manifests/build-baseline.sh > https://urldefense.proofpoint.com/v2/url?u=3Dhttps-3A__ci.linaro.org_job_= tcwg-5Fbmk-5Fci-5Fgnu-5Feabi-2Dbisect-2Dtcwg-5Fbmk-5Fstm32-2Dgnu-5Feabi-2Dm= aster-2Darm-5Feabi-2Dcoremark-2DO3_14_artifact_artifacts_manifests_build-2D= baseline.sh&d=3DDwICaQ&c=3DsPZ6DeHLiehUHQWKIrsNwWp3t7snrE-az24ztT0w7Jc&r=3D= WpFFGgYa98Yp-c29WHTCwU1wAGFBvszA6a4RzgpMSqc&m=3DyPy1Q8DQorOZeUTtAs_Fd_zVq5H= Qvzzs4ve84wsXPDA&s=3DARdZzUnjkuI93rLscvXi61NAuqlEGKEKKNXl6rlbKAQ&e=3D > =C2=A0 --fail > curl -o artifacts/manifests/build-parameters.sh > https://urldefense.proofpoint.com/v2/url?u=3Dhttps-3A__ci.linaro.org_job_= tcwg-5Fbmk-5Fci-5Fgnu-5Feabi-2Dbisect-2Dtcwg-5Fbmk-5Fstm32-2Dgnu-5Feabi-2Dm= aster-2Darm-5Feabi-2Dcoremark-2DO3_14_artifact_artifacts_manifests_build-2D= parameters.sh&d=3DDwICaQ&c=3DsPZ6DeHLiehUHQWKIrsNwWp3t7snrE-az24ztT0w7Jc&r= =3DWpFFGgYa98Yp-c29WHTCwU1wAGFBvszA6a4RzgpMSqc&m=3DyPy1Q8DQorOZeUTtAs_Fd_zV= q5HQvzzs4ve84wsXPDA&s=3DmzabeG-94q2wQJwn6acq9K3bNKJ_8BpwTJe-hZZ3StA&e=3D > =C2=A0 --fail > curl -o artifacts/test.sh > https://urldefense.proofpoint.com/v2/url?u=3Dhttps-3A__ci.linaro.org_job_= tcwg-5Fbmk-5Fci-5Fgnu-5Feabi-2Dbisect-2Dtcwg-5Fbmk-5Fstm32-2Dgnu-5Feabi-2Dm= aster-2Darm-5Feabi-2Dcoremark-2DO3_14_artifact_artifacts_test.sh&d=3DDwICaQ= &c=3DsPZ6DeHLiehUHQWKIrsNwWp3t7snrE-az24ztT0w7Jc&r=3DWpFFGgYa98Yp-c29WHTCwU= 1wAGFBvszA6a4RzgpMSqc&m=3DyPy1Q8DQorOZeUTtAs_Fd_zVq5HQvzzs4ve84wsXPDA&s=3DR= io2j8F-OUPNTlkh9wi9vle9N4o1YQeEBbt1N-hA0C8&e=3D > =C2=A0 --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 .. > > > Full commit (up to 1000 lines): > > commit f76d800be844dd2aa4aa8f189a3ace16c5e931bc > Author: Jan Vrany > Date:=C2=A0=C2=A0 Tue Jun 23 14:45:38 2020 +0100 > > =C2=A0=C2=A0=C2=A0 gdb/mi: use std::map for MI commands in mi-cmds.c > =C2=A0=C2=A0=C2=A0 > =C2=A0=C2=A0=C2=A0 This changes the hashmap used in mi-cmds.c from a cust= om > structure to > =C2=A0=C2=A0=C2=A0 std::map.=C2=A0 Not only is replacing a custom contain= er with a > standard > =C2=A0=C2=A0=C2=A0 one an improvement, but using std::map will make it ea= sier to > =C2=A0=C2=A0=C2=A0 dynamically add commands; which is something that is p= lanned for > a > =C2=A0=C2=A0=C2=A0 later series, where we will allow MI commands to be im= plemented > in > =C2=A0=C2=A0=C2=A0 Python. > =C2=A0=C2=A0=C2=A0 > =C2=A0=C2=A0=C2=A0 There should be no user visible changes after this com= mit. > --- > =C2=A0gdb/mi/mi-cmds.c | 478 ++++++++++++++++++++++++++------------------= - > ---------- > =C2=A01 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 @@ > =C2=A0#include "top.h" > =C2=A0#include "mi-cmds.h" > =C2=A0#include "mi-main.h" > +#include > +#include > =C2=A0 > -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.=C2=A0 */ > =C2=A0 > -static struct mi_cmd mi_cmds[] =3D > -{ > -/* Define a MI command of NAME, and its corresponding CLI command is > -=C2=A0=C2=A0 CLI_NAME.=C2=A0 */ > -#define DEF_MI_CMD_CLI_1(NAME, CLI_NAME, ARGS_P, CALLED)=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ > -=C2=A0 { NAME, { CLI_NAME, ARGS_P}, NULL, CALLED } > -#define DEF_MI_CMD_CLI(NAME, CLI_NAME, ARGS_P) \ > -=C2=A0 DEF_MI_CMD_CLI_1(NAME, CLI_NAME, ARGS_P, NULL) > +using mi_cmd_up =3D std::unique_ptr; > =C2=A0 > -/* Define a MI command of NAME, and implemented by function > MI_FUNC.=C2=A0 */ > -#define DEF_MI_CMD_MI_1(NAME, MI_FUNC, CALLED) \ > -=C2=A0 { 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). */ > =C2=A0 > -=C2=A0 DEF_MI_CMD_MI ("ada-task-info", mi_cmd_ada_task_info), > -=C2=A0 DEF_MI_CMD_MI ("add-inferior", mi_cmd_add_inferior), > -=C2=A0 DEF_MI_CMD_CLI_1 ("break-after", "ignore", 1, > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.breakpoin= t), > -=C2=A0 DEF_MI_CMD_MI_1 ("break-condition", mi_cmd_break_condition, > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.breakpoint), > -=C2=A0 DEF_MI_CMD_MI_1 ("break-commands", mi_cmd_break_commands, > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.breakpoint), > -=C2=A0 DEF_MI_CMD_CLI_1 ("break-delete", "delete breakpoint", 1, > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.breakpoin= t), > -=C2=A0 DEF_MI_CMD_CLI_1 ("break-disable", "disable breakpoint", 1, > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.breakpoin= t), > -=C2=A0 DEF_MI_CMD_CLI_1 ("break-enable", "enable breakpoint", 1, > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.bre= akpoint), > -=C2=A0 DEF_MI_CMD_CLI ("break-info", "info break", 1), > -=C2=A0 DEF_MI_CMD_MI_1 ("break-insert", mi_cmd_break_insert, > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.breakpoint), > -=C2=A0 DEF_MI_CMD_MI_1 ("dprintf-insert", mi_cmd_dprintf_insert, > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.breakpoint), > -=C2=A0 DEF_MI_CMD_CLI ("break-list", "info break", 0), > -=C2=A0 DEF_MI_CMD_MI_1 ("break-passcount", mi_cmd_break_passcount, > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.breakpoint), > -=C2=A0 DEF_MI_CMD_MI_1 ("break-watch", mi_cmd_break_watch, > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.breakpoint), > -=C2=A0 DEF_MI_CMD_MI_1 ("catch-assert", mi_cmd_catch_assert, > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.breakpoint), > -=C2=A0 DEF_MI_CMD_MI_1 ("catch-exception", mi_cmd_catch_exception, > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.breakpoint), > -=C2=A0 DEF_MI_CMD_MI_1 ("catch-handlers", mi_cmd_catch_handlers, > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.breakpoint), > -=C2=A0 DEF_MI_CMD_MI_1 ("catch-load", mi_cmd_catch_load, > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.breakpoint), > -=C2=A0 DEF_MI_CMD_MI_1 ("catch-unload", mi_cmd_catch_unload, > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.breakpoint), > -=C2=A0 DEF_MI_CMD_MI_1 ("catch-throw", mi_cmd_catch_throw, > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.breakpoint), > -=C2=A0 DEF_MI_CMD_MI_1 ("catch-rethrow", mi_cmd_catch_rethrow, > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.breakpoint), > -=C2=A0 DEF_MI_CMD_MI_1 ("catch-catch", mi_cmd_catch_catch, > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.breakpoint), > -=C2=A0 DEF_MI_CMD_MI ("complete", mi_cmd_complete), > -=C2=A0 DEF_MI_CMD_MI ("data-disassemble", mi_cmd_disassemble), > -=C2=A0 DEF_MI_CMD_MI ("data-evaluate-expression", > mi_cmd_data_evaluate_expression), > -=C2=A0 DEF_MI_CMD_MI ("data-list-changed-registers", > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 mi_cmd_data_list_changed_registers), > -=C2=A0 DEF_MI_CMD_MI ("data-list-register-names", > mi_cmd_data_list_register_names), > -=C2=A0 DEF_MI_CMD_MI ("data-list-register-values", > mi_cmd_data_list_register_values), > -=C2=A0 DEF_MI_CMD_MI ("data-read-memory", mi_cmd_data_read_memory), > -=C2=A0 DEF_MI_CMD_MI ("data-read-memory-bytes", > mi_cmd_data_read_memory_bytes), > -=C2=A0 DEF_MI_CMD_MI_1 ("data-write-memory", mi_cmd_data_write_memory, > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.memory), > -=C2=A0 DEF_MI_CMD_MI_1 ("data-write-memory-bytes", > mi_cmd_data_write_memory_bytes, > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.memory), > -=C2=A0 DEF_MI_CMD_MI ("data-write-register-values", > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 mi_cmd_data_write_register_values), > -=C2=A0 DEF_MI_CMD_MI ("enable-timings", mi_cmd_enable_timings), > -=C2=A0 DEF_MI_CMD_MI ("enable-pretty-printing", > mi_cmd_enable_pretty_printing), > -=C2=A0 DEF_MI_CMD_MI ("enable-frame-filters", > mi_cmd_enable_frame_filters), > -=C2=A0 DEF_MI_CMD_MI ("environment-cd", mi_cmd_env_cd), > -=C2=A0 DEF_MI_CMD_MI ("environment-directory", mi_cmd_env_dir), > -=C2=A0 DEF_MI_CMD_MI ("environment-path", mi_cmd_env_path), > -=C2=A0 DEF_MI_CMD_MI ("environment-pwd", mi_cmd_env_pwd), > -=C2=A0 DEF_MI_CMD_CLI_1 ("exec-arguments", "set args", 1, > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.cmd_param= _changed), > -=C2=A0 DEF_MI_CMD_MI ("exec-continue", mi_cmd_exec_continue), > -=C2=A0 DEF_MI_CMD_MI ("exec-finish", mi_cmd_exec_finish), > -=C2=A0 DEF_MI_CMD_MI ("exec-jump", mi_cmd_exec_jump), > -=C2=A0 DEF_MI_CMD_MI ("exec-interrupt", mi_cmd_exec_interrupt), > -=C2=A0 DEF_MI_CMD_MI ("exec-next", mi_cmd_exec_next), > -=C2=A0 DEF_MI_CMD_MI ("exec-next-instruction", > mi_cmd_exec_next_instruction), > -=C2=A0 DEF_MI_CMD_MI ("exec-return", mi_cmd_exec_return), > -=C2=A0 DEF_MI_CMD_MI ("exec-run", mi_cmd_exec_run), > -=C2=A0 DEF_MI_CMD_MI ("exec-step", mi_cmd_exec_step), > -=C2=A0 DEF_MI_CMD_MI ("exec-step-instruction", > mi_cmd_exec_step_instruction), > -=C2=A0 DEF_MI_CMD_CLI ("exec-until", "until", 1), > -=C2=A0 DEF_MI_CMD_CLI ("file-exec-and-symbols", "file", 1), > -=C2=A0 DEF_MI_CMD_CLI ("file-exec-file", "exec-file", 1), > -=C2=A0 DEF_MI_CMD_MI ("file-list-exec-source-file", > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 mi_cmd_file_list_exec_source_file), > -=C2=A0 DEF_MI_CMD_MI ("file-list-exec-source-files", > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 mi_cmd_file_list_exec_source_files), > -=C2=A0 DEF_MI_CMD_MI ("file-list-shared-libraries", > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 mi_cmd_file_list_shared_libraries), > -=C2=A0 DEF_MI_CMD_CLI ("file-symbol-file", "symbol-file", 1), > -=C2=A0 DEF_MI_CMD_MI ("fix-multi-location-breakpoint-output", > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 mi_cmd_fix_multi_location_breakpoint_output), > -=C2=A0 DEF_MI_CMD_MI ("gdb-exit", mi_cmd_gdb_exit), > -=C2=A0 DEF_MI_CMD_CLI_1 ("gdb-set", "set", 1, > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.cmd_param= _changed), > -=C2=A0 DEF_MI_CMD_CLI ("gdb-show", "show", 1), > -=C2=A0 DEF_MI_CMD_CLI ("gdb-version", "show version", 0), > -=C2=A0 DEF_MI_CMD_MI ("inferior-tty-set", mi_cmd_inferior_tty_set), > -=C2=A0 DEF_MI_CMD_MI ("inferior-tty-show", mi_cmd_inferior_tty_show), > -=C2=A0 DEF_MI_CMD_MI ("info-ada-exceptions", mi_cmd_info_ada_exceptions)= , > -=C2=A0 DEF_MI_CMD_MI ("info-gdb-mi-command", mi_cmd_info_gdb_mi_command)= , > -=C2=A0 DEF_MI_CMD_MI ("info-os", mi_cmd_info_os), > -=C2=A0 DEF_MI_CMD_MI ("interpreter-exec", mi_cmd_interpreter_exec), > -=C2=A0 DEF_MI_CMD_MI ("list-features", mi_cmd_list_features), > -=C2=A0 DEF_MI_CMD_MI ("list-target-features", > mi_cmd_list_target_features), > -=C2=A0 DEF_MI_CMD_MI ("list-thread-groups", mi_cmd_list_thread_groups), > -=C2=A0 DEF_MI_CMD_MI ("remove-inferior", mi_cmd_remove_inferior), > -=C2=A0 DEF_MI_CMD_MI ("stack-info-depth", mi_cmd_stack_info_depth), > -=C2=A0 DEF_MI_CMD_MI ("stack-info-frame", mi_cmd_stack_info_frame), > -=C2=A0 DEF_MI_CMD_MI ("stack-list-arguments", mi_cmd_stack_list_args), > -=C2=A0 DEF_MI_CMD_MI ("stack-list-frames", mi_cmd_stack_list_frames), > -=C2=A0 DEF_MI_CMD_MI ("stack-list-locals", mi_cmd_stack_list_locals), > -=C2=A0 DEF_MI_CMD_MI ("stack-list-variables", > mi_cmd_stack_list_variables), > -=C2=A0 DEF_MI_CMD_MI_1 ("stack-select-frame", mi_cmd_stack_select_frame, > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.user_selected_c= ontext), > -=C2=A0 DEF_MI_CMD_MI ("symbol-list-lines", mi_cmd_symbol_list_lines), > -=C2=A0 DEF_MI_CMD_MI ("symbol-info-functions", > mi_cmd_symbol_info_functions), > -=C2=A0 DEF_MI_CMD_MI ("symbol-info-variables", > mi_cmd_symbol_info_variables), > -=C2=A0 DEF_MI_CMD_MI ("symbol-info-types", mi_cmd_symbol_info_types), > -=C2=A0 DEF_MI_CMD_MI ("symbol-info-modules", mi_cmd_symbol_info_modules)= , > -=C2=A0 DEF_MI_CMD_MI ("symbol-info-module-functions", > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 mi_cmd_symbol_info_module_functions), > -=C2=A0 DEF_MI_CMD_MI ("symbol-info-module-variables", > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 mi_cmd_symbol_info_module_variables), > -=C2=A0 DEF_MI_CMD_CLI ("target-attach", "attach", 1), > -=C2=A0 DEF_MI_CMD_MI ("target-detach", mi_cmd_target_detach), > -=C2=A0 DEF_MI_CMD_CLI ("target-disconnect", "disconnect", 0), > -=C2=A0 DEF_MI_CMD_CLI ("target-download", "load", 1), > -=C2=A0 DEF_MI_CMD_MI ("target-file-delete", mi_cmd_target_file_delete), > -=C2=A0 DEF_MI_CMD_MI ("target-file-get", mi_cmd_target_file_get), > -=C2=A0 DEF_MI_CMD_MI ("target-file-put", mi_cmd_target_file_put), > -=C2=A0 DEF_MI_CMD_MI ("target-flash-erase", mi_cmd_target_flash_erase), > -=C2=A0 DEF_MI_CMD_CLI ("target-select", "target", 1), > -=C2=A0 DEF_MI_CMD_MI ("thread-info", mi_cmd_thread_info), > -=C2=A0 DEF_MI_CMD_MI ("thread-list-ids", mi_cmd_thread_list_ids), > -=C2=A0 DEF_MI_CMD_MI_1 ("thread-select", mi_cmd_thread_select, > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.user_selected_c= ontext), > -=C2=A0 DEF_MI_CMD_MI ("trace-define-variable", > mi_cmd_trace_define_variable), > -=C2=A0 DEF_MI_CMD_MI_1 ("trace-find", mi_cmd_trace_find, > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.traceframe), > -=C2=A0 DEF_MI_CMD_MI ("trace-frame-collected", > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 mi_cmd_trace_frame_collected), > -=C2=A0 DEF_MI_CMD_MI ("trace-list-variables", > mi_cmd_trace_list_variables), > -=C2=A0 DEF_MI_CMD_MI ("trace-save", mi_cmd_trace_save), > -=C2=A0 DEF_MI_CMD_MI ("trace-start", mi_cmd_trace_start), > -=C2=A0 DEF_MI_CMD_MI ("trace-status", mi_cmd_trace_status), > -=C2=A0 DEF_MI_CMD_MI ("trace-stop", mi_cmd_trace_stop), > -=C2=A0 DEF_MI_CMD_MI ("var-assign", mi_cmd_var_assign), > -=C2=A0 DEF_MI_CMD_MI ("var-create", mi_cmd_var_create), > -=C2=A0 DEF_MI_CMD_MI ("var-delete", mi_cmd_var_delete), > -=C2=A0 DEF_MI_CMD_MI ("var-evaluate-expression", > mi_cmd_var_evaluate_expression), > -=C2=A0 DEF_MI_CMD_MI ("var-info-path-expression", > mi_cmd_var_info_path_expression), > -=C2=A0 DEF_MI_CMD_MI ("var-info-expression", mi_cmd_var_info_expression)= , > -=C2=A0 DEF_MI_CMD_MI ("var-info-num-children", > mi_cmd_var_info_num_children), > -=C2=A0 DEF_MI_CMD_MI ("var-info-type", mi_cmd_var_info_type), > -=C2=A0 DEF_MI_CMD_MI ("var-list-children", mi_cmd_var_list_children), > -=C2=A0 DEF_MI_CMD_MI ("var-set-format", mi_cmd_var_set_format), > -=C2=A0 DEF_MI_CMD_MI ("var-set-frozen", mi_cmd_var_set_frozen), > -=C2=A0 DEF_MI_CMD_MI ("var-set-update-range", > mi_cmd_var_set_update_range), > -=C2=A0 DEF_MI_CMD_MI ("var-set-visualizer", mi_cmd_var_set_visualizer), > -=C2=A0 DEF_MI_CMD_MI ("var-show-attributes", mi_cmd_var_show_attributes)= , > -=C2=A0 DEF_MI_CMD_MI ("var-show-format", mi_cmd_var_show_format), > -=C2=A0 DEF_MI_CMD_MI ("var-update", mi_cmd_var_update), > -=C2=A0 { NULL, } > -}; > +static std::map mi_cmd_table; > =C2=A0 > -/* Pointer to the mi command table (built at run time). */ > +/* Insert COMMAND into the global mi_cmd_table.=C2=A0 Return false if > +=C2=A0=C2=A0 COMMAND->name already exists in mi_cmd_table, in which case > COMMAND will > +=C2=A0=C2=A0 not have been added to mi_cmd_table.=C2=A0 Otherwise, retur= n true, and > +=C2=A0=C2=A0 COMMAND was added to mi_cmd_table.=C2=A0 */ > =C2=A0 > -static struct mi_cmd **mi_table; > +static bool > +insert_mi_cmd_entry (mi_cmd_up command) > +{ > +=C2=A0 gdb_assert (command !=3D nullptr); > +=C2=A0 gdb_assert (command->name !=3D nullptr); > =C2=A0 > -/* A prime large enough to accomodate the entire command table.=C2=A0 */ > -enum > -=C2=A0 { > -=C2=A0=C2=A0=C2=A0 MI_TABLE_SIZE =3D 227 > -=C2=A0 }; > +=C2=A0 std::string name (command->name); > =C2=A0 > -/* See mi-cmds.h.=C2=A0 */ > +=C2=A0 if (mi_cmd_table.find (name) !=3D mi_cmd_table.end ()) > +=C2=A0=C2=A0=C2=A0 return false; > =C2=A0 > -struct mi_cmd * > -mi_cmd_lookup (const char *command) > +=C2=A0 mi_cmd_table[name] =3D std::move (command); > +=C2=A0 return true; > +} > + > +/* Create an mi_cmd structure with name NAME.=C2=A0 */ > + > +static mi_cmd_up > +create_mi_cmd (const char *name) > =C2=A0{ > -=C2=A0 return *lookup_table (command); > +=C2=A0 mi_cmd_up cmd (new mi_cmd ()); > +=C2=A0 cmd->name =3D name; > +=C2=A0 return cmd; > =C2=A0} > =C2=A0 > -/* Used for collecting hash hit/miss statistics.=C2=A0 */ > +/* Create and register a new MI command with an MI specific > implementation. > +=C2=A0=C2=A0 NAME must name an MI command that does not already exist, > otherwise an > +=C2=A0=C2=A0 assertion will trigger.=C2=A0 */ > =C2=A0 > -static struct > +static void > +add_mi_cmd_mi (const char *name, mi_cmd_argv_ftype function, > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 int *suppress_notification =3D nullptr) > =C2=A0{ > -=C2=A0 int hit; > -=C2=A0 int miss; > -=C2=A0 int rehash; > -} stats; > +=C2=A0 mi_cmd_up cmd_up =3D create_mi_cmd (name); > + > +=C2=A0 cmd_up->cli.cmd =3D nullptr; > +=C2=A0 cmd_up->cli.args_p =3D 0; > +=C2=A0 cmd_up->argv_func =3D function; > +=C2=A0 cmd_up->suppress_notification =3D suppress_notification; > =C2=A0 > -/* Look up a command.=C2=A0 */ > +=C2=A0 bool success =3D insert_mi_cmd_entry (std::move (cmd_up)); > +=C2=A0 gdb_assert (success); > +} > + > +/* Create and register a new MI command implemented on top of a CLI > +=C2=A0=C2=A0 command.=C2=A0 NAME must name an MI command that does not a= lready > exist, > +=C2=A0=C2=A0 otherwise an assertion will trigger.=C2=A0 */ > =C2=A0 > -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, > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0int *suppress_notification =3D nullptr) > =C2=A0{ > -=C2=A0 const char *chp; > -=C2=A0 unsigned int index =3D 0; > +=C2=A0 mi_cmd_up cmd_up =3D create_mi_cmd (name); > =C2=A0 > -=C2=A0 /* Compute our hash.=C2=A0 */ > -=C2=A0 for (chp =3D command; *chp; chp++) > -=C2=A0=C2=A0=C2=A0 { > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 /* We use a somewhat arbitrary formula.= =C2=A0 */ > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 index =3D ((index << 6) + (unsigned int) = *chp) % MI_TABLE_SIZE; > -=C2=A0=C2=A0=C2=A0 } > +=C2=A0 cmd_up->cli.cmd =3D cli_name; > +=C2=A0 cmd_up->cli.args_p =3D args_p; > +=C2=A0 cmd_up->argv_func =3D nullptr; > +=C2=A0 cmd_up->suppress_notification =3D suppress_notification; > =C2=A0 > -=C2=A0 while (1) > -=C2=A0=C2=A0=C2=A0 { > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 struct mi_cmd **entry =3D &mi_table[index= ]; > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if ((*entry) =3D=3D 0) > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 /* not found, return po= inter to next free. */ > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 stats.miss++; > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 return entry; > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (strcmp (command, (*entry)->name) =3D= =3D 0) > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 stats.hit++; > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 return entry;=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* found */ > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 index =3D (index + 1) % MI_TABLE_SIZE; > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 stats.rehash++; > -=C2=A0=C2=A0=C2=A0 } > +=C2=A0 bool success =3D insert_mi_cmd_entry (std::move (cmd_up)); > +=C2=A0 gdb_assert (success); > =C2=A0} > =C2=A0 > +/* Initialize MI_CMD_TABLE, the global map of MI commands.=C2=A0 */ > + > =C2=A0static void > -build_table (struct mi_cmd *commands) > +build_table () > =C2=A0{ > -=C2=A0 int nr_rehash =3D 0; > -=C2=A0 int nr_entries =3D 0; > -=C2=A0 struct mi_cmd *command; > +=C2=A0 add_mi_cmd_mi ("ada-task-info", mi_cmd_ada_task_info); > +=C2=A0 add_mi_cmd_mi ("add-inferior", mi_cmd_add_inferior); > +=C2=A0 add_mi_cmd_cli ("break-after", "ignore", 1, > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.breakpoint); > +=C2=A0 add_mi_cmd_mi ("break-condition",mi_cmd_break_condition, > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.breakpoint); > +=C2=A0 add_mi_cmd_mi ("break-commands", mi_cmd_break_commands, > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.breakpoint); > +=C2=A0 add_mi_cmd_cli ("break-delete", "delete breakpoint", 1, > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.breakpoint); > +=C2=A0 add_mi_cmd_cli ("break-disable", "disable breakpoint", 1, > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.breakpoint); > +=C2=A0 add_mi_cmd_cli ("break-enable", "enable breakpoint", 1, > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.breakpoint); > +=C2=A0 add_mi_cmd_cli ("break-info", "info break", 1); > +=C2=A0 add_mi_cmd_mi ("break-insert", mi_cmd_break_insert, > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.breakpoint); > +=C2=A0 add_mi_cmd_mi ("dprintf-insert", mi_cmd_dprintf_insert, > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.breakpoint); > +=C2=A0 add_mi_cmd_cli ("break-list", "info break", 0); > +=C2=A0 add_mi_cmd_mi ("break-passcount", mi_cmd_break_passcount, > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.breakpoint); > +=C2=A0 add_mi_cmd_mi ("break-watch", mi_cmd_break_watch, > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.breakpoint); > +=C2=A0 add_mi_cmd_mi ("catch-assert", mi_cmd_catch_assert, > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.breakpoint); > +=C2=A0 add_mi_cmd_mi ("catch-exception", mi_cmd_catch_exception, > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.breakpoint); > +=C2=A0 add_mi_cmd_mi ("catch-handlers", mi_cmd_catch_handlers, > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.breakpoint); > +=C2=A0 add_mi_cmd_mi ("catch-load", mi_cmd_catch_load, > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.breakpoint); > +=C2=A0 add_mi_cmd_mi ("catch-unload", mi_cmd_catch_unload, > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.breakpoint); > +=C2=A0 add_mi_cmd_mi ("catch-throw", mi_cmd_catch_throw, > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.breakpoint), > +=C2=A0 add_mi_cmd_mi ("catch-rethrow", mi_cmd_catch_rethrow, > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.breakpoint), > +=C2=A0 add_mi_cmd_mi ("catch-catch", mi_cmd_catch_catch, > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.breakpoint), > +=C2=A0 add_mi_cmd_mi ("complete", mi_cmd_complete); > +=C2=A0 add_mi_cmd_mi ("data-disassemble", mi_cmd_disassemble); > +=C2=A0 add_mi_cmd_mi ("data-evaluate-expression", > mi_cmd_data_evaluate_expression); > +=C2=A0 add_mi_cmd_mi ("data-list-changed-registers", > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 mi_cmd_data_list_changed_registers); > +=C2=A0 add_mi_cmd_mi ("data-list-register-names", > mi_cmd_data_list_register_names); > +=C2=A0 add_mi_cmd_mi ("data-list-register-values", > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 mi_cmd_data_list_register_values); > +=C2=A0 add_mi_cmd_mi ("data-read-memory", mi_cmd_data_read_memory); > +=C2=A0 add_mi_cmd_mi ("data-read-memory-bytes", > mi_cmd_data_read_memory_bytes); > +=C2=A0 add_mi_cmd_mi ("data-write-memory", mi_cmd_data_write_memory, > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.memory); > +=C2=A0 add_mi_cmd_mi ("data-write-memory-bytes", > mi_cmd_data_write_memory_bytes, > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.memory); > +=C2=A0 add_mi_cmd_mi ("data-write-register-values", > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 mi_cmd_data_write_register_values); > +=C2=A0 add_mi_cmd_mi ("enable-timings", mi_cmd_enable_timings); > +=C2=A0 add_mi_cmd_mi ("enable-pretty-printing", > mi_cmd_enable_pretty_printing); > +=C2=A0 add_mi_cmd_mi ("enable-frame-filters", > mi_cmd_enable_frame_filters); > +=C2=A0 add_mi_cmd_mi ("environment-cd", mi_cmd_env_cd); > +=C2=A0 add_mi_cmd_mi ("environment-directory", mi_cmd_env_dir); > +=C2=A0 add_mi_cmd_mi ("environment-path", mi_cmd_env_path); > +=C2=A0 add_mi_cmd_mi ("environment-pwd", mi_cmd_env_pwd); > +=C2=A0 add_mi_cmd_cli ("exec-arguments", "set args", 1, > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.cmd_param_changed); > +=C2=A0 add_mi_cmd_mi ("exec-continue", mi_cmd_exec_continue); > +=C2=A0 add_mi_cmd_mi ("exec-finish", mi_cmd_exec_finish); > +=C2=A0 add_mi_cmd_mi ("exec-jump", mi_cmd_exec_jump); > +=C2=A0 add_mi_cmd_mi ("exec-interrupt", mi_cmd_exec_interrupt); > +=C2=A0 add_mi_cmd_mi ("exec-next", mi_cmd_exec_next); > +=C2=A0 add_mi_cmd_mi ("exec-next-instruction", > mi_cmd_exec_next_instruction); > +=C2=A0 add_mi_cmd_mi ("exec-return", mi_cmd_exec_return); > +=C2=A0 add_mi_cmd_mi ("exec-run", mi_cmd_exec_run); > +=C2=A0 add_mi_cmd_mi ("exec-step", mi_cmd_exec_step); > +=C2=A0 add_mi_cmd_mi ("exec-step-instruction", > mi_cmd_exec_step_instruction); > +=C2=A0 add_mi_cmd_cli ("exec-until", "until", 1); > +=C2=A0 add_mi_cmd_cli ("file-exec-and-symbols", "file", 1); > +=C2=A0 add_mi_cmd_cli ("file-exec-file", "exec-file", 1); > +=C2=A0 add_mi_cmd_mi ("file-list-exec-source-file", > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 mi_cmd_file_list_exec_source_file); > +=C2=A0 add_mi_cmd_mi ("file-list-exec-source-files", > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 mi_cmd_file_list_exec_source_files); > +=C2=A0 add_mi_cmd_mi ("file-list-shared-libraries", > +=C2=A0=C2=A0=C2=A0=C2=A0 mi_cmd_file_list_shared_libraries), > +=C2=A0 add_mi_cmd_cli ("file-symbol-file", "symbol-file", 1); > +=C2=A0 add_mi_cmd_mi ("fix-multi-location-breakpoint-output", > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 mi_cmd_fix_multi_location_breakpoint_output), > +=C2=A0 add_mi_cmd_mi ("gdb-exit", mi_cmd_gdb_exit); > +=C2=A0 add_mi_cmd_cli ("gdb-set", "set", 1, > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.cmd_param_changed); > +=C2=A0 add_mi_cmd_cli ("gdb-show", "show", 1); > +=C2=A0 add_mi_cmd_cli ("gdb-version", "show version", 0); > +=C2=A0 add_mi_cmd_mi ("inferior-tty-set", mi_cmd_inferior_tty_set); > +=C2=A0 add_mi_cmd_mi ("inferior-tty-show", mi_cmd_inferior_tty_show); > +=C2=A0 add_mi_cmd_mi ("info-ada-exceptions", mi_cmd_info_ada_exceptions)= ; > +=C2=A0 add_mi_cmd_mi ("info-gdb-mi-command", mi_cmd_info_gdb_mi_command)= ; > +=C2=A0 add_mi_cmd_mi ("info-os", mi_cmd_info_os); > +=C2=A0 add_mi_cmd_mi ("interpreter-exec", mi_cmd_interpreter_exec); > +=C2=A0 add_mi_cmd_mi ("list-features", mi_cmd_list_features); > +=C2=A0 add_mi_cmd_mi ("list-target-features", > mi_cmd_list_target_features); > +=C2=A0 add_mi_cmd_mi ("list-thread-groups", mi_cmd_list_thread_groups); > +=C2=A0 add_mi_cmd_mi ("remove-inferior", mi_cmd_remove_inferior); > +=C2=A0 add_mi_cmd_mi ("stack-info-depth", mi_cmd_stack_info_depth); > +=C2=A0 add_mi_cmd_mi ("stack-info-frame", mi_cmd_stack_info_frame); > +=C2=A0 add_mi_cmd_mi ("stack-list-arguments", mi_cmd_stack_list_args); > +=C2=A0 add_mi_cmd_mi ("stack-list-frames", mi_cmd_stack_list_frames); > +=C2=A0 add_mi_cmd_mi ("stack-list-locals", mi_cmd_stack_list_locals); > +=C2=A0 add_mi_cmd_mi ("stack-list-variables", > mi_cmd_stack_list_variables); > +=C2=A0 add_mi_cmd_mi ("stack-select-frame", mi_cmd_stack_select_frame, > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.user_selected_context); > +=C2=A0 add_mi_cmd_mi ("symbol-list-lines", mi_cmd_symbol_list_lines); > +=C2=A0 add_mi_cmd_mi ("symbol-info-functions", > mi_cmd_symbol_info_functions); > +=C2=A0 add_mi_cmd_mi ("symbol-info-variables", > mi_cmd_symbol_info_variables); > +=C2=A0 add_mi_cmd_mi ("symbol-info-types", mi_cmd_symbol_info_types); > +=C2=A0 add_mi_cmd_mi ("symbol-info-modules", mi_cmd_symbol_info_modules)= ; > +=C2=A0 add_mi_cmd_mi ("symbol-info-module-functions", > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 mi_cmd_symbol_info_module_functions); > +=C2=A0 add_mi_cmd_mi ("symbol-info-module-variables", > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 mi_cmd_symbol_info_module_variables); > +=C2=A0 add_mi_cmd_cli ("target-attach", "attach", 1); > +=C2=A0 add_mi_cmd_mi ("target-detach", mi_cmd_target_detach); > +=C2=A0 add_mi_cmd_cli ("target-disconnect", "disconnect", 0); > +=C2=A0 add_mi_cmd_cli ("target-download", "load", 1); > +=C2=A0 add_mi_cmd_mi ("target-file-delete", mi_cmd_target_file_delete); > +=C2=A0 add_mi_cmd_mi ("target-file-get", mi_cmd_target_file_get); > +=C2=A0 add_mi_cmd_mi ("target-file-put", mi_cmd_target_file_put); > +=C2=A0 add_mi_cmd_mi ("target-flash-erase", mi_cmd_target_flash_erase); > +=C2=A0 add_mi_cmd_cli ("target-select", "target", 1); > +=C2=A0 add_mi_cmd_mi ("thread-info", mi_cmd_thread_info); > +=C2=A0 add_mi_cmd_mi ("thread-list-ids", mi_cmd_thread_list_ids); > +=C2=A0 add_mi_cmd_mi ("thread-select", mi_cmd_thread_select, > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.user_selected_context); > +=C2=A0 add_mi_cmd_mi ("trace-define-variable", > mi_cmd_trace_define_variable); > +=C2=A0 add_mi_cmd_mi ("trace-find", mi_cmd_trace_find, > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 &mi_suppress_notification.traceframe); > +=C2=A0 add_mi_cmd_mi ("trace-frame-collected", > mi_cmd_trace_frame_collected); > +=C2=A0 add_mi_cmd_mi ("trace-list-variables", > mi_cmd_trace_list_variables); > +=C2=A0 add_mi_cmd_mi ("trace-save", mi_cmd_trace_save); > +=C2=A0 add_mi_cmd_mi ("trace-start", mi_cmd_trace_start); > +=C2=A0 add_mi_cmd_mi ("trace-status", mi_cmd_trace_status); > +=C2=A0 add_mi_cmd_mi ("trace-stop", mi_cmd_trace_stop); > +=C2=A0 add_mi_cmd_mi ("var-assign", mi_cmd_var_assign); > +=C2=A0 add_mi_cmd_mi ("var-create", mi_cmd_var_create); > +=C2=A0 add_mi_cmd_mi ("var-delete", mi_cmd_var_delete); > +=C2=A0 add_mi_cmd_mi ("var-evaluate-expression", > mi_cmd_var_evaluate_expression); > +=C2=A0 add_mi_cmd_mi ("var-info-path-expression", > mi_cmd_var_info_path_expression); > +=C2=A0 add_mi_cmd_mi ("var-info-expression", mi_cmd_var_info_expression)= ; > +=C2=A0 add_mi_cmd_mi ("var-info-num-children", > mi_cmd_var_info_num_children); > +=C2=A0 add_mi_cmd_mi ("var-info-type", mi_cmd_var_info_type); > +=C2=A0 add_mi_cmd_mi ("var-list-children", mi_cmd_var_list_children); > +=C2=A0 add_mi_cmd_mi ("var-set-format", mi_cmd_var_set_format); > +=C2=A0 add_mi_cmd_mi ("var-set-frozen", mi_cmd_var_set_frozen); > +=C2=A0 add_mi_cmd_mi ("var-set-update-range", > mi_cmd_var_set_update_range); > +=C2=A0 add_mi_cmd_mi ("var-set-visualizer", mi_cmd_var_set_visualizer); > +=C2=A0 add_mi_cmd_mi ("var-show-attributes", mi_cmd_var_show_attributes)= ; > +=C2=A0 add_mi_cmd_mi ("var-show-format", mi_cmd_var_show_format); > +=C2=A0 add_mi_cmd_mi ("var-update", mi_cmd_var_update); > +} > =C2=A0 > -=C2=A0 mi_table =3D XCNEWVEC (struct mi_cmd *, MI_TABLE_SIZE); > -=C2=A0 for (command =3D commands; command->name !=3D 0; command++) > -=C2=A0=C2=A0=C2=A0 { > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 struct mi_cmd **entry =3D lookup_table (c= ommand->name); > +/* See mi-cmds.h.=C2=A0 */ > + > +struct mi_cmd * > +mi_cmd_lookup (const char *command) > +{ > +=C2=A0 gdb_assert (command !=3D nullptr); > =C2=A0 > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (*entry) > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0internal_error (__FILE__, __LI= NE__, > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0_("com= mand `%s' appears to be duplicated"), > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0comman= d->name); > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 *entry =3D command; > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 /* FIXME lose these prints */ > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (0) > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 fprintf_unfiltered (gdb= _stdlog, "%-30s %2d\n", > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 command->name, stats.rehash - > nr_rehash); > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 nr_entries++; > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 nr_rehash =3D stats.rehash; > -=C2=A0=C2=A0=C2=A0 } > -=C2=A0 if (0) > -=C2=A0=C2=A0=C2=A0 { > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 fprintf_filtered (gdb_stdlog, "Average %3= .1f\n", > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0(doubl= e) nr_rehash / (double) nr_entries); > -=C2=A0=C2=A0=C2=A0 } > +=C2=A0 auto it =3D mi_cmd_table.find (command); > +=C2=A0 if (it =3D=3D mi_cmd_table.end ()) > +=C2=A0=C2=A0=C2=A0 return nullptr; > +=C2=A0 return it->second.get (); > =C2=A0} > =C2=A0 > =C2=A0void _initialize_mi_cmds (); > =C2=A0void > =C2=A0_initialize_mi_cmds () > =C2=A0{ > -=C2=A0 build_table (mi_cmds); > -=C2=A0 memset (&stats, 0, sizeof (stats)); > +=C2=A0 build_table (); > =C2=A0} >