diff options
author | Simon Marchi <simon.marchi@ericsson.com> | 2019-03-13 15:13:03 -0400 |
---|---|---|
committer | Simon Marchi <simon.marchi@efficios.com> | 2019-03-13 15:14:36 -0400 |
commit | b4be1b0648608a2578bbed39841c8ee411773edd (patch) | |
tree | e1ed7575ff16e451a9076c7cabcf057c17d43b51 /gdb/mi | |
parent | Factor out mi_ui_out instantiation logic (diff) | |
download | binutils-gdb-b4be1b0648608a2578bbed39841c8ee411773edd.tar.gz binutils-gdb-b4be1b0648608a2578bbed39841c8ee411773edd.tar.bz2 binutils-gdb-b4be1b0648608a2578bbed39841c8ee411773edd.zip |
Fix MI output for multi-location breakpoints
New in v2:
- Addressed comments about doc, updated the MI version table
- New doc for the Breakpoint information format
- New -fix-multi-location-breakpoint-output command, with associated
doc, test and NEWS updated accordingly
- Fixed the output, the locations list is now actually in the tuple
representing the breakpoint.
Various MI commands or events related to breakpoints output invalid MI
records when printing information about a multi-location breakpoint.
For example:
-break-insert allo
^done,bkpt={...,addr="<MULTIPLE>",...},{number="1.1",...},{number="1.2",...}
The problem is that according to the syntax [1], the top-level elements
are of type "result" and should be of the form "variable=value".
This patch changes the output to wrap the locations in a list:
^done,bkpt={...,addr="<MULTIPLE>",locations=[{number="1.1",...},{number="1.2",...}]}
The events =breakpoint-created, =breakpoint-modified, as well as the
-break-info command also suffer from this (and maybe others I didn't
find).
Since this is a breaking change for MI, we have to deal somehow with
backwards compatibility. The approach taken by this patch is to bump
the MI version, use the new syntax in MI3 while retaining the old syntax
in MI2. Frontends are expected to use a precise MI version (-i=mi2), so
if they do that they should be unaffected.
The patch also adds the command -fix-multi-location-breakpoint-output,
which front ends can use to enable this behavior with MI <= 2.
[1] https://sourceware.org/gdb/onlinedocs/gdb/GDB_002fMI-Output-Syntax.html#GDB_002fMI-Output-Syntax
gdb/ChangeLog:
* NEWS: Mention that the new default MI version is 3. Mention
changes to the output of commands and events that deal with
multi-location breakpoints.
* breakpoint.c: Include "mi/mi-out.h".
(print_one_breakpoint): Change output syntax if using MI version
>= 3.
* mi/mi-main.h (mi_cmd_fix_multi_location_breakpoint_output):
New.
(mi_multi_location_breakpoint_output_fixed): New.
* mi/mi-main.c (fix_multi_location_breakpoint_output): New.
(mi_cmd_fix_multi_location_breakpoint_output): New.
(mi_multi_location_breakpoint_output_fixed): New.
* mi/mi-cmds.c (mi_cmds): Register command
-fix-multi-location-breakpoint-output.
* mi/mi-out.c (mi_out_new): Instantiate version 3 when using
interpreter "mi".
gdb/testsuite/ChangeLog:
* mi-breakpoint-location-ena-dis.exp: Rename to ...
* mi-breakpoint-multiple-locations.exp: ... this.
(make_breakpoints_pattern): New proc.
(do_test): Add mi_version parameter, test -break-insert,
-break-info and =breakpoint-created.
gdb/doc/ChangeLog:
* gdb.texinfo (Mode Options): Mention mi3.
(Interpreters): Likewise.
(GDB/MI Development and Front Ends): Add entry for MI 3 in
version table. Document -fix-multi-location-breakpoint-output.
(GDB/MI Breakpoint Information): Document format of breakpoint
location output.
Diffstat (limited to 'gdb/mi')
-rw-r--r-- | gdb/mi/mi-cmds.c | 2 | ||||
-rw-r--r-- | gdb/mi/mi-main.c | 27 | ||||
-rw-r--r-- | gdb/mi/mi-main.h | 13 | ||||
-rw-r--r-- | gdb/mi/mi-out.c | 4 |
4 files changed, 44 insertions, 2 deletions
diff --git a/gdb/mi/mi-cmds.c b/gdb/mi/mi-cmds.c index bb7c20c777b..fe30ac2e822 100644 --- a/gdb/mi/mi-cmds.c +++ b/gdb/mi/mi-cmds.c @@ -118,6 +118,8 @@ static struct mi_cmd mi_cmds[] = 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), diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c index f4e5e48bc22..06559851745 100644 --- a/gdb/mi/mi-main.c +++ b/gdb/mi/mi-main.c @@ -2701,6 +2701,33 @@ mi_cmd_trace_frame_collected (const char *command, char **argv, int argc) } } +/* Whether to use the fixed output when printing information about a + multi-location breakpoint (see PR 9659). */ + +static bool fix_multi_location_breakpoint_output = false; + +/* See mi/mi-main.h. */ + +void +mi_cmd_fix_multi_location_breakpoint_output (const char *command, char **argv, + int argc) +{ + fix_multi_location_breakpoint_output = true; +} + +/* See mi/mi-main.h. */ + +bool +mi_multi_location_breakpoint_output_fixed (ui_out *uiout) +{ + mi_ui_out *mi_uiout = dynamic_cast<mi_ui_out *> (uiout); + + if (mi_uiout == nullptr) + return false; + + return mi_uiout->version () >= 3 || fix_multi_location_breakpoint_output; +} + void _initialize_mi_main (void) { diff --git a/gdb/mi/mi-main.h b/gdb/mi/mi-main.h index 72ddab9427c..72c4e594287 100644 --- a/gdb/mi/mi-main.h +++ b/gdb/mi/mi-main.h @@ -54,4 +54,17 @@ struct mi_suppress_notification }; extern struct mi_suppress_notification mi_suppress_notification; +/* Implementation of -fix-multi-location-breakpoint-output. */ + +extern void mi_cmd_fix_multi_location_breakpoint_output (const char *command, + char **argv, int argc); + +/* Return whether -break-list, -break-insert, =breakpoint-created and + =breakpoint-modified should use the "fixed" output format (see PR + 9659). + + Return false if UIOUT is not an MI UI. */ + +extern bool mi_multi_location_breakpoint_output_fixed (ui_out *uiout); + #endif /* MI_MI_MAIN_H */ diff --git a/gdb/mi/mi-out.c b/gdb/mi/mi-out.c index 4f8c9bff8e5..e485beef69c 100644 --- a/gdb/mi/mi-out.c +++ b/gdb/mi/mi-out.c @@ -297,10 +297,10 @@ mi_ui_out::~mi_ui_out () mi_ui_out * mi_out_new (const char *mi_version) { - if (streq (mi_version, INTERP_MI3)) + if (streq (mi_version, INTERP_MI3) || streq (mi_version, INTERP_MI)) return new mi_ui_out (3); - if (streq (mi_version, INTERP_MI2) || streq (mi_version, INTERP_MI)) + if (streq (mi_version, INTERP_MI2)) return new mi_ui_out (2); if (streq (mi_version, INTERP_MI1)) |