binutils-gdb/gdb/mi/mi-main.h
Simon Marchi 9db0d8536d gdb/mi: fix breakpoint script field output
The "script" field, output whenever information about a breakpoint with
commands is output, uses wrong MI syntax.

    $ ./gdb -nx -q --data-directory=data-directory -x script -i mi
    =thread-group-added,id="i1"
    =breakpoint-created,bkpt={number="1",type="breakpoint",disp="keep",enabled="y",addr="0x000000000000111d",func="main",file="test.c",fullname="/home/simark/build/binutils-gdb-one-target/gdb/test.c",line="3",thread-groups=["i1"],times="0",original-location="main"}
    =breakpoint-modified,bkpt={number="1",type="breakpoint",disp="keep",enabled="y",addr="0x000000000000111d",func="main",file="test.c",fullname="/home/simark/build/binutils-gdb-one-target/gdb/test.c",line="3",thread-groups=["i1"],times="0",script={"aaa","bbb","ccc"},original-location="main"}
    (gdb)
    -break-info
    ^done,BreakpointTable={nr_rows="1",nr_cols="6",hdr=[{width="7",alignment="-1",col_name="number",colhdr="Num"},{width="14",alignment="-1",col_name="type",colhdr="Type"},{width="4",alignment="-1",col_name="disp",colhdr="Disp"},{width="3",alignment="-1",col_name="enabled",colhdr="Enb"},{width="18",alignment="-1",col_name="addr",colhdr="Address"},{width="40",alignment="2",col_name="what",colhdr="What"}],body=[bkpt={number="1",type="breakpoint",disp="keep",enabled="y",addr="0x000000000000111d",func="main",file="test.c",fullname="/home/simark/build/binutils-gdb-one-target/gdb/test.c",line="3",thread-groups=["i1"],times="0",script={"aaa","bbb","ccc"},original-location="main"}]}
    (gdb)

In both the =breakpoint-modified and -break-info output, we have:

     script={"aaa","bbb","ccc"}

According to the output syntax [1], curly braces means tuple, and a
tuple contains key=value pairs.  This looks like it should be a list,
but uses curly braces by mistake.  This would make more sense:

    script=["aaa","bbb","ccc"]

Fix it, keeping the backwards compatibility by introducing a new MI
version (MI4), in exactly the same way as was done when fixing
multi-locations breakpoint output in [2].

 - Add a fix_breakpoint_script_output uiout flag.  MI uiouts will use
   this flag if the version is >= 4.
 - Add a fix_breakpoint_script_output_globally variable and the
   -fix-breakpoint-script-output MI command to set it, if frontends want
   to use the fixed output for this without using the newer MI version.
 - When emitting the script field, use list instead of tuple, if we want
   the fixed output (depending on the two criteria above)
 -

[1] https://sourceware.org/gdb/onlinedocs/gdb/GDB_002fMI-Output-Syntax.html#GDB_002fMI-Output-Syntax
[2] b4be1b0648

Change-Id: I7113c6892832c8d6805badb06ce42496677e2242
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=24285
2022-08-10 15:38:19 -04:00

80 lines
2.6 KiB
C

/* MI Internal Functions for GDB, the GNU debugger.
Copyright (C) 2003-2022 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;
/* This is a hack so we can get some extra commands going, but has existed
within GDB for many years now. Ideally we don't want to channel things
through the CLI, but implement all commands as pure MI commands with
their own implementation.
Execute the CLI command CMD, if ARGS_P is true then ARGS should be a
non-nullptr string containing arguments to add after CMD. If ARGS_P is
false then ARGS must be nullptr. */
extern void mi_execute_cli_command (const char *cmd, bool args_p,
const char *args);
/* Implementation of -fix-multi-location-breakpoint-output. */
extern void mi_cmd_fix_multi_location_breakpoint_output (const char *command,
char **argv, int argc);
/* Implementation of -fix-breakpoint-script-output. */
extern void mi_cmd_fix_breakpoint_script_output (const char *command,
char **argv, int argc);
#endif /* MI_MI_MAIN_H */