mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-01-06 12:09:26 +08:00
b4be1b0648
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.
71 lines
2.2 KiB
C
71 lines
2.2 KiB
C
/* MI Internal Functions for GDB, the GNU debugger.
|
|
|
|
Copyright (C) 2003-2019 Free Software Foundation, Inc.
|
|
|
|
This file is part of GDB.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
|
|
#ifndef MI_MI_MAIN_H
|
|
#define MI_MI_MAIN_H
|
|
|
|
struct ui_file;
|
|
|
|
extern void mi_load_progress (const char *section_name,
|
|
unsigned long sent_so_far,
|
|
unsigned long total_section,
|
|
unsigned long total_sent,
|
|
unsigned long grand_total);
|
|
|
|
extern void mi_print_timing_maybe (struct ui_file *file);
|
|
|
|
/* Whether MI is in async mode. */
|
|
|
|
extern int mi_async_p (void);
|
|
|
|
extern char *current_token;
|
|
|
|
extern int running_result_record_printed;
|
|
extern int mi_proceeded;
|
|
|
|
struct mi_suppress_notification
|
|
{
|
|
/* Breakpoint notification suppressed? */
|
|
int breakpoint;
|
|
/* Command param changed notification suppressed? */
|
|
int cmd_param_changed;
|
|
/* Traceframe changed notification suppressed? */
|
|
int traceframe;
|
|
/* Memory changed notification suppressed? */
|
|
int memory;
|
|
/* User selected context changed notification suppressed? */
|
|
int user_selected_context;
|
|
};
|
|
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 */
|