diff options
Diffstat (limited to 'gdb')
21 files changed, 868 insertions, 725 deletions
@@ -3,6 +3,20 @@ *** Changes since GDB 13 +* Multi-target feature configuration + + GDB now supports the individual configuration of remote targets' feature + sets. Based on the current selection of a target, the commands 'set remote + <name>-packet (on|off|auto)' and 'show remote <name>-packet' can be used to + configure a target's feature packet and to display its configuration, + respectively. + + The configuration of the packet itself applies to the currently selected + target (if available). If no target is selected, it applies to future remote + connections. Similarly, the show commands print the configuration of the + currently selected target. If no remote target is selected, the default + configuration for future connections is shown. + * MI version 1 has been removed. * GDB has initial built-in support for the Debugger Adapter Protocol. diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index b5fad2c..afbb4de 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -23880,8 +23880,14 @@ in @value{GDBN}. You may want to report the problem to the @value{GDBN} developers. For each packet @var{name}, the command to enable or disable the -packet is @code{set remote @var{name}-packet}. The available settings -are: +packet is @code{set remote @var{name}-packet}. If you configure a packet, the +configuration will apply for all future remote targets if no target is selected. +In case there is a target selected, only the configuration of the current target +is changed. All other existing remote targets' features are not affected. +The command to print the current configuration of a packet is +@code{show remote @var{name}-packet}. It displays the current remote target's +configuration. If no remote target is selected, the default configuration for +future connections is shown. The available settings are: @multitable @columnfractions 0.28 0.32 0.25 @item Command Name diff --git a/gdb/remote.c b/gdb/remote.c index aaac434..e433329 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -70,12 +70,12 @@ #include "gdbsupport/agent.h" #include "btrace.h" #include "record-btrace.h" -#include <algorithm> #include "gdbsupport/scoped_restore.h" #include "gdbsupport/environ.h" #include "gdbsupport/byte-vector.h" #include "gdbsupport/search.h" #include <algorithm> +#include <iterator> #include <unordered_map> #include "async-event.h" #include "gdbsupport/selftest.h" @@ -116,6 +116,36 @@ enum packet_support PACKET_DISABLE }; +/* Convert the packet support auto_boolean to a name used for gdb printing. */ + +static const char * +get_packet_support_name (auto_boolean support) +{ + switch (support) + { + case AUTO_BOOLEAN_TRUE: + return "on"; + case AUTO_BOOLEAN_FALSE: + return "off"; + case AUTO_BOOLEAN_AUTO: + return "auto"; + default: + gdb_assert_not_reached ("invalid var_auto_boolean"); + } +} + +/* Convert the target type (future remote target or currently connected target) + to a name used for gdb printing. */ + +static const char * +get_target_type_name (bool target_connected) +{ + if (target_connected) + return _("on the current remote target"); + else + return _("on future remote targets"); +} + /* Analyze a packet's return value and update the packet config accordingly. */ @@ -126,6 +156,155 @@ enum packet_result PACKET_UNKNOWN }; +/* Enumeration of packets for a remote target. */ + +enum { + PACKET_vCont = 0, + PACKET_X, + PACKET_qSymbol, + PACKET_P, + PACKET_p, + PACKET_Z0, + PACKET_Z1, + PACKET_Z2, + PACKET_Z3, + PACKET_Z4, + PACKET_vFile_setfs, + PACKET_vFile_open, + PACKET_vFile_pread, + PACKET_vFile_pwrite, + PACKET_vFile_close, + PACKET_vFile_unlink, + PACKET_vFile_readlink, + PACKET_vFile_fstat, + PACKET_qXfer_auxv, + PACKET_qXfer_features, + PACKET_qXfer_exec_file, + PACKET_qXfer_libraries, + PACKET_qXfer_libraries_svr4, + PACKET_qXfer_memory_map, + PACKET_qXfer_osdata, + PACKET_qXfer_threads, + PACKET_qXfer_statictrace_read, + PACKET_qXfer_traceframe_info, + PACKET_qXfer_uib, + PACKET_qGetTIBAddr, + PACKET_qGetTLSAddr, + PACKET_qSupported, + PACKET_qTStatus, + PACKET_QPassSignals, + PACKET_QCatchSyscalls, + PACKET_QProgramSignals, + PACKET_QSetWorkingDir, + PACKET_QStartupWithShell, + PACKET_QEnvironmentHexEncoded, + PACKET_QEnvironmentReset, + PACKET_QEnvironmentUnset, + PACKET_qCRC, + PACKET_qSearch_memory, + PACKET_vAttach, + PACKET_vRun, + PACKET_QStartNoAckMode, + PACKET_vKill, + PACKET_qXfer_siginfo_read, + PACKET_qXfer_siginfo_write, + PACKET_qAttached, + + /* Support for conditional tracepoints. */ + PACKET_ConditionalTracepoints, + + /* Support for target-side breakpoint conditions. */ + PACKET_ConditionalBreakpoints, + + /* Support for target-side breakpoint commands. */ + PACKET_BreakpointCommands, + + /* Support for fast tracepoints. */ + PACKET_FastTracepoints, + + /* Support for static tracepoints. */ + PACKET_StaticTracepoints, + + /* Support for installing tracepoints while a trace experiment is + running. */ + PACKET_InstallInTrace, + + PACKET_bc, + PACKET_bs, + PACKET_TracepointSource, + PACKET_QAllow, + PACKET_qXfer_fdpic, + PACKET_QDisableRandomization, + PACKET_QAgent, + PACKET_QTBuffer_size, + PACKET_Qbtrace_off, + PACKET_Qbtrace_bts, + PACKET_Qbtrace_pt, + PACKET_qXfer_btrace, + + /* Support for the QNonStop packet. */ + PACKET_QNonStop, + + /* Support for the QThreadEvents packet. */ + PACKET_QThreadEvents, + + /* Support for multi-process extensions. */ + PACKET_multiprocess_feature, + + /* Support for enabling and disabling tracepoints while a trace + experiment is running. */ + PACKET_EnableDisableTracepoints_feature, + + /* Support for collecting strings using the tracenz bytecode. */ + PACKET_tracenz_feature, + + /* Support for continuing to run a trace experiment while GDB is + disconnected. */ + PACKET_DisconnectedTracing_feature, + + /* Support for qXfer:libraries-svr4:read with a non-empty annex. */ + PACKET_augmented_libraries_svr4_read_feature, + + /* Support for the qXfer:btrace-conf:read packet. */ + PACKET_qXfer_btrace_conf, + + /* Support for the Qbtrace-conf:bts:size packet. */ + PACKET_Qbtrace_conf_bts_size, + + /* Support for swbreak+ feature. */ + PACKET_swbreak_feature, + + /* Support for hwbreak+ feature. */ + PACKET_hwbreak_feature, + + /* Support for fork events. */ + PACKET_fork_event_feature, + + /* Support for vfork events. */ + PACKET_vfork_event_feature, + + /* Support for the Qbtrace-conf:pt:size packet. */ + PACKET_Qbtrace_conf_pt_size, + + /* Support for exec events. */ + PACKET_exec_event_feature, + + /* Support for query supported vCont actions. */ + PACKET_vContSupported, + + /* Support remote CTRL-C. */ + PACKET_vCtrlC, + + /* Support TARGET_WAITKIND_NO_RESUMED. */ + PACKET_no_resumed, + + /* Support for memory tagging, allocation tag fetch/store + packets and the tag violation stop replies. */ + PACKET_memory_tagging_feature, + + PACKET_MAX +}; + struct threads_listing_context; /* Stub vCont actions support. @@ -394,6 +573,96 @@ static const target_info remote_target_info = { remote_doc }; +/* Description of a remote packet. */ + +struct packet_description +{ + /* Name of the packet used for gdb output. */ + const char *name; + + /* Title of the packet, used by the set/show remote name-packet + commands to identify the individual packages and gdb output. */ + const char *title; +}; + +/* Configuration of a remote packet. */ + +struct packet_config +{ + /* If auto, GDB auto-detects support for this packet or feature, + either through qSupported, or by trying the packet and looking + at the response. If true, GDB assumes the target supports this + packet. If false, the packet is disabled. Configs that don't + have an associated command always have this set to auto. */ + enum auto_boolean detect; + + /* Does the target support this packet? */ + enum packet_support support; +}; + +/* This global array contains packet descriptions (name and title). */ +static packet_description packets_descriptions[PACKET_MAX]; +/* This global array contains the default configuration for every new + per-remote target array. */ +static packet_config remote_protocol_packets[PACKET_MAX]; + +/* Description of a remote target's features. It stores the configuration + and provides functions to determine supported features of the target. */ + +struct remote_features +{ + remote_features () + { + std::copy (std::begin (remote_protocol_packets), + std::end (remote_protocol_packets), + std::begin (m_protocol_packets)); + } + ~remote_features () = default; + + DISABLE_COPY_AND_ASSIGN (remote_features); + + /* Returns whether a given packet defined by its enum value is supported. */ + enum packet_support packet_support (int) const; + + /* Returns the packet's corresponding "set remote foo-packet" command + state. See struct packet_config for more details. */ + enum auto_boolean packet_set_cmd_state (int packet) const + { return m_protocol_packets[packet].detect; } + + /* Returns true if the multi-process extensions are in effect. */ + int remote_multi_process_p () const + { return packet_support (PACKET_multiprocess_feature) == PACKET_ENABLE; } + + /* Returns true if fork events are supported. */ + int remote_fork_event_p () const + { return packet_support (PACKET_fork_event_feature) == PACKET_ENABLE; } + + /* Returns true if vfork events are supported. */ + int remote_vfork_event_p () const + { return packet_support (PACKET_vfork_event_feature) == PACKET_ENABLE; } + + /* Returns true if exec events are supported. */ + int remote_exec_event_p () const + { return packet_support (PACKET_exec_event_feature) == PACKET_ENABLE; } + + /* Returns true if memory tagging is supported, false otherwise. */ + bool remote_memory_tagging_p () const + { return packet_support (PACKET_memory_tagging_feature) == PACKET_ENABLE; } + + /* Reset all packets back to "unknown support". Called when opening a + new connection to a remote target. */ + void reset_all_packet_configs_support (); + +/* Check result value in BUF for packet WHICH_PACKET and update the packet's + support configuration accordingly. */ + packet_result packet_ok (const char *buf, const int which_packet); + packet_result packet_ok (const gdb::char_vector &buf, const int which_packet); + + /* The per-remote target array which stores a remote's packet + configurations. */ + packet_config m_protocol_packets[PACKET_MAX]; +}; + class remote_target : public process_stratum_target { public: @@ -584,8 +853,16 @@ public: bool supports_string_tracing () override; + int remote_supports_cond_tracepoints (); + bool supports_evaluation_of_breakpoint_conditions () override; + int remote_supports_fast_tracepoints (); + + int remote_supports_static_tracepoints (); + + int remote_supports_install_in_trace (); + bool can_run_breakpoint_commands () override; void trace_init () override; @@ -932,19 +1209,21 @@ public: /* Remote specific methods. */ const gdb_byte *writebuf, ULONGEST offset, LONGEST len, ULONGEST *xfered_len, - struct packet_config *packet); + const unsigned int which_packet); target_xfer_status remote_read_qxfer (const char *object_name, const char *annex, gdb_byte *readbuf, ULONGEST offset, LONGEST len, ULONGEST *xfered_len, - struct packet_config *packet); + const unsigned int which_packet); void push_stop_reply (struct stop_reply *new_event); bool vcont_r_supported (); + remote_features m_features; + private: bool start_remote_1 (int from_tty, int extended_p); @@ -1067,7 +1346,12 @@ static CORE_ADDR remote_address_masked (CORE_ADDR); static int stub_unpack_int (const char *buff, int fieldlength); -struct packet_config; +static void set_remote_protocol_packet_cmd (const char *args, int from_tty, + cmd_list_element *c); + +static void show_packet_config_cmd (ui_file *file, + const unsigned int which_packet, + remote_target *remote); static void show_remote_protocol_packet_cmd (struct ui_file *file, int from_tty, @@ -1889,34 +2173,52 @@ remote_target::get_memory_read_packet_size () return size; } - +static enum packet_support packet_config_support (const packet_config *config); -struct packet_config - { - const char *name; - const char *title; - /* If auto, GDB auto-detects support for this packet or feature, - either through qSupported, or by trying the packet and looking - at the response. If true, GDB assumes the target supports this - packet. If false, the packet is disabled. Configs that don't - have an associated command always have this set to auto. */ - enum auto_boolean detect; +static void +set_remote_protocol_packet_cmd (const char *args, int from_tty, + cmd_list_element *c) +{ + remote_target *remote = get_current_remote_target (); + gdb_assert (c->var.has_value ()); - /* The "show remote foo-packet" command created for this packet. */ - cmd_list_element *show_cmd; + auto *default_config = static_cast<packet_config *> (c->context ()); + const int packet_idx = std::distance (remote_protocol_packets, + default_config); - /* Does the target support this packet? */ - enum packet_support support; - }; + if (packet_idx >= 0 && packet_idx < PACKET_MAX) + { + const char *name = packets_descriptions[packet_idx].name; + const auto_boolean value = c->var->get<auto_boolean> (); + const char *support = get_packet_support_name (value); + const char *target_type = get_target_type_name (remote != nullptr); -static enum packet_support packet_config_support (struct packet_config *config); -static enum packet_support packet_support (int packet); + if (remote != nullptr) + remote->m_features.m_protocol_packets[packet_idx].detect = value; + else + remote_protocol_packets[packet_idx].detect = value; + + gdb_printf (_("Support for the '%s' packet %s is set to \"%s\".\n"), name, + target_type, support); + return; + } + + internal_error (_("Could not find config for %s"), c->name); +} static void -show_packet_config_cmd (ui_file *file, struct packet_config *config) +show_packet_config_cmd (ui_file *file, const unsigned int which_packet, + remote_target *remote) { const char *support = "internal-error"; + const char *target_type = get_target_type_name (remote != nullptr); + + packet_config *config; + if (remote != nullptr) + config = &remote->m_features.m_protocol_packets[which_packet]; + else + config = &remote_protocol_packets[which_packet]; switch (packet_config_support (config)) { @@ -1934,25 +2236,30 @@ show_packet_config_cmd (ui_file *file, struct packet_config *config) { case AUTO_BOOLEAN_AUTO: gdb_printf (file, - _("Support for the `%s' packet " - "is auto-detected, currently %s.\n"), - config->name, support); + _("Support for the '%s' packet %s is \"auto\", " + "currently %s.\n"), + packets_descriptions[which_packet].name, target_type, + support); break; case AUTO_BOOLEAN_TRUE: case AUTO_BOOLEAN_FALSE: gdb_printf (file, - _("Support for the `%s' packet is currently %s.\n"), - config->name, support); + _("Support for the '%s' packet %s is \"%s\".\n"), + packets_descriptions[which_packet].name, target_type, + get_packet_support_name (config->detect)); break; } } static void -add_packet_config_cmd (struct packet_config *config, const char *name, +add_packet_config_cmd (const unsigned int which_packet, const char *name, const char *title, int legacy) { - config->name = name; - config->title = title; + packets_descriptions[which_packet].name = name; + packets_descriptions[which_packet].title = title; + + packet_config *config = &remote_protocol_packets[which_packet]; + gdb::unique_xmalloc_ptr<char> set_doc = xstrprintf ("Set use of remote protocol `%s' (%s) packet.", name, title); @@ -1965,10 +2272,11 @@ add_packet_config_cmd (struct packet_config *config, const char *name, = add_setshow_auto_boolean_cmd (cmd_name.release (), class_obscure, &config->detect, set_doc.get (), show_doc.get (), NULL, /* help_doc */ - NULL, + set_remote_protocol_packet_cmd, show_remote_protocol_packet_cmd, &remote_set_cmdlist, &remote_show_cmdlist); - config->show_cmd = cmds.show; + cmds.show->set_context (config); + cmds.set->set_context (config); /* set/show remote NAME-packet {auto,on,off} -- legacy. */ if (legacy) @@ -2019,9 +2327,12 @@ packet_check_result (const gdb::char_vector &buf) return packet_check_result (buf.data ()); } -static enum packet_result -packet_ok (const char *buf, struct packet_config *config) +packet_result +remote_features::packet_ok (const char *buf, const int which_packet) { + packet_config *config = &m_protocol_packets[which_packet]; + packet_description *descr = &packets_descriptions[which_packet]; + enum packet_result result; if (config->detect != AUTO_BOOLEAN_TRUE @@ -2037,7 +2348,7 @@ packet_ok (const char *buf, struct packet_config *config) if (config->support == PACKET_SUPPORT_UNKNOWN) { remote_debug_printf ("Packet %s (%s) is supported", - config->name, config->title); + descr->name, descr->title); config->support = PACKET_ENABLE; } break; @@ -2049,17 +2360,17 @@ packet_ok (const char *buf, struct packet_config *config) /* If the stub previously indicated that the packet was supported then there is a protocol error. */ error (_("Protocol error: %s (%s) conflicting enabled responses."), - config->name, config->title); + descr->name, descr->title); } else if (config->detect == AUTO_BOOLEAN_TRUE) { /* The user set it wrong. */ error (_("Enabled packet %s (%s) not recognized by stub"), - config->name, config->title); + descr->name, descr->title); } - remote_debug_printf ("Packet %s (%s) is NOT supported", - config->name, config->title); + remote_debug_printf ("Packet %s (%s) is NOT supported", descr->name, + descr->title); config->support = PACKET_DISABLE; break; } @@ -2067,171 +2378,10 @@ packet_ok (const char *buf, struct packet_config *config) return result; } -static enum packet_result -packet_ok (const gdb::char_vector &buf, struct packet_config *config) -{ - return packet_ok (buf.data (), config); -} - -enum { - PACKET_vCont = 0, - PACKET_X, - PACKET_qSymbol, - PACKET_P, - PACKET_p, - PACKET_Z0, - PACKET_Z1, - PACKET_Z2, - PACKET_Z3, - PACKET_Z4, - PACKET_vFile_setfs, - PACKET_vFile_open, - PACKET_vFile_pread, - PACKET_vFile_pwrite, - PACKET_vFile_close, - PACKET_vFile_unlink, - PACKET_vFile_readlink, - PACKET_vFile_fstat, - PACKET_qXfer_auxv, - PACKET_qXfer_features, - PACKET_qXfer_exec_file, - PACKET_qXfer_libraries, - PACKET_qXfer_libraries_svr4, - PACKET_qXfer_memory_map, - PACKET_qXfer_osdata, - PACKET_qXfer_threads, - PACKET_qXfer_statictrace_read, - PACKET_qXfer_traceframe_info, - PACKET_qXfer_uib, - PACKET_qGetTIBAddr, - PACKET_qGetTLSAddr, - PACKET_qSupported, - PACKET_qTStatus, - PACKET_QPassSignals, - PACKET_QCatchSyscalls, - PACKET_QProgramSignals, - PACKET_QSetWorkingDir, - PACKET_QStartupWithShell, - PACKET_QEnvironmentHexEncoded, - PACKET_QEnvironmentReset, - PACKET_QEnvironmentUnset, - PACKET_qCRC, - PACKET_qSearch_memory, - PACKET_vAttach, - PACKET_vRun, - PACKET_QStartNoAckMode, - PACKET_vKill, - PACKET_qXfer_siginfo_read, - PACKET_qXfer_siginfo_write, - PACKET_qAttached, - - /* Support for conditional tracepoints. */ - PACKET_ConditionalTracepoints, - - /* Support for target-side breakpoint conditions. */ - PACKET_ConditionalBreakpoints, - - /* Support for target-side breakpoint commands. */ - PACKET_BreakpointCommands, - - /* Support for fast tracepoints. */ - PACKET_FastTracepoints, - - /* Support for static tracepoints. */ - PACKET_StaticTracepoints, - - /* Support for installing tracepoints while a trace experiment is - running. */ - PACKET_InstallInTrace, - - PACKET_bc, - PACKET_bs, - PACKET_TracepointSource, - PACKET_QAllow, - PACKET_qXfer_fdpic, - PACKET_QDisableRandomization, - PACKET_QAgent, - PACKET_QTBuffer_size, - PACKET_Qbtrace_off, - PACKET_Qbtrace_bts, - PACKET_Qbtrace_pt, - PACKET_qXfer_btrace, - - /* Support for the QNonStop packet. */ - PACKET_QNonStop, - - /* Support for the QThreadEvents packet. */ - PACKET_QThreadEvents, - - /* Support for multi-process extensions. */ - PACKET_multiprocess_feature, - - /* Support for enabling and disabling tracepoints while a trace - experiment is running. */ - PACKET_EnableDisableTracepoints_feature, - - /* Support for collecting strings using the tracenz bytecode. */ - PACKET_tracenz_feature, - - /* Support for continuing to run a trace experiment while GDB is - disconnected. */ - PACKET_DisconnectedTracing_feature, - - /* Support for qXfer:libraries-svr4:read with a non-empty annex. */ - PACKET_augmented_libraries_svr4_read_feature, - - /* Support for the qXfer:btrace-conf:read packet. */ - PACKET_qXfer_btrace_conf, - - /* Support for the Qbtrace-conf:bts:size packet. */ - PACKET_Qbtrace_conf_bts_size, - - /* Support for swbreak+ feature. */ - PACKET_swbreak_feature, - - /* Support for hwbreak+ feature. */ - PACKET_hwbreak_feature, - - /* Support for fork events. */ - PACKET_fork_event_feature, - - /* Support for vfork events. */ - PACKET_vfork_event_feature, - - /* Support for the Qbtrace-conf:pt:size packet. */ - PACKET_Qbtrace_conf_pt_size, - - /* Support for exec events. */ - PACKET_exec_event_feature, - - /* Support for query supported vCont actions. */ - PACKET_vContSupported, - - /* Support remote CTRL-C. */ - PACKET_vCtrlC, - - /* Support TARGET_WAITKIND_NO_RESUMED. */ - PACKET_no_resumed, - - /* Support for memory tagging, allocation tag fetch/store - packets and the tag violation stop replies. */ - PACKET_memory_tagging_feature, - - PACKET_MAX -}; - -/* FIXME: needs to be per-remote-target. Ignoring this for now, - assuming all remote targets are the same server (thus all support - the same packets). */ -static struct packet_config remote_protocol_packets[PACKET_MAX]; - -/* Returns the packet's corresponding "set remote foo-packet" command - state. See struct packet_config for more details. */ - -static enum auto_boolean -packet_set_cmd_state (int packet) +packet_result +remote_features::packet_ok (const gdb::char_vector &buf, const int which_packet) { - return remote_protocol_packets[packet].detect; + return packet_ok (buf.data (), which_packet); } /* Returns whether a given packet or feature is supported. This takes @@ -2239,7 +2389,7 @@ packet_set_cmd_state (int packet) command, which may be used to bypass auto-detection. */ static enum packet_support -packet_config_support (struct packet_config *config) +packet_config_support (const packet_config *config) { switch (config->detect) { @@ -2254,14 +2404,10 @@ packet_config_support (struct packet_config *config) } } -/* Same as packet_config_support, but takes the packet's enum value as - argument. */ - -static enum packet_support -packet_support (int packet) +packet_support +remote_features::packet_support (int packet) const { - struct packet_config *config = &remote_protocol_packets[packet]; - + const packet_config *config = &m_protocol_packets[packet]; return packet_config_support (config); } @@ -2270,21 +2416,19 @@ show_remote_protocol_packet_cmd (struct ui_file *file, int from_tty, struct cmd_list_element *c, const char *value) { - struct packet_config *packet; + remote_target *remote = get_current_remote_target (); gdb_assert (c->var.has_value ()); - for (packet = remote_protocol_packets; - packet < &remote_protocol_packets[PACKET_MAX]; - packet++) + auto *default_config = static_cast<packet_config *> (c->context ()); + const int packet_idx = std::distance (remote_protocol_packets, + default_config); + + if (packet_idx >= 0 && packet_idx < PACKET_MAX) { - if (c == packet->show_cmd) - { - show_packet_config_cmd (file, packet); - return; - } + show_packet_config_cmd (file, packet_idx, remote); + return; } - internal_error (_("Could not find config for %s"), - c->name); + internal_error (_("Could not find config for %s"), c->name); } /* Should we try one of the 'Z' requests? */ @@ -2308,10 +2452,23 @@ static void set_remote_protocol_Z_packet_cmd (const char *args, int from_tty, struct cmd_list_element *c) { + remote_target *remote = get_current_remote_target (); int i; for (i = 0; i < NR_Z_PACKET_TYPES; i++) - remote_protocol_packets[PACKET_Z0 + i].detect = remote_Z_packet_detect; + { + if (remote != nullptr) + remote->m_features.m_protocol_packets[PACKET_Z0 + i].detect + = remote_Z_packet_detect; + else + remote_protocol_packets[PACKET_Z0 + i].detect = remote_Z_packet_detect; + } + + const char *support = get_packet_support_name (remote_Z_packet_detect); + const char *target_type = get_target_type_name (remote != nullptr); + gdb_printf (_("Use of Z packets %s is set to \"%s\".\n"), target_type, + support); + } static void @@ -2319,52 +2476,11 @@ show_remote_protocol_Z_packet_cmd (struct ui_file *file, int from_tty, struct cmd_list_element *c, const char *value) { + remote_target *remote = get_current_remote_target (); int i; for (i = 0; i < NR_Z_PACKET_TYPES; i++) - { - show_packet_config_cmd (file, &remote_protocol_packets[PACKET_Z0 + i]); - } -} - -/* Returns true if the multi-process extensions are in effect. */ - -static int -remote_multi_process_p (struct remote_state *rs) -{ - return packet_support (PACKET_multiprocess_feature) == PACKET_ENABLE; -} - -/* Returns true if fork events are supported. */ - -static int -remote_fork_event_p (struct remote_state *rs) -{ - return packet_support (PACKET_fork_event_feature) == PACKET_ENABLE; -} - -/* Returns true if vfork events are supported. */ - -static int -remote_vfork_event_p (struct remote_state *rs) -{ - return packet_support (PACKET_vfork_event_feature) == PACKET_ENABLE; -} - -/* Returns true if exec events are supported. */ - -static int -remote_exec_event_p (struct remote_state *rs) -{ - return packet_support (PACKET_exec_event_feature) == PACKET_ENABLE; -} - -/* Returns true if memory tagging is supported, false otherwise. */ - -static bool -remote_memory_tagging_p () -{ - return packet_support (PACKET_memory_tagging_feature) == PACKET_ENABLE; + show_packet_config_cmd (file, PACKET_Z0 + i, remote); } /* Insert fork catchpoint target routine. If fork events are enabled @@ -2373,9 +2489,7 @@ remote_memory_tagging_p () int remote_target::insert_fork_catchpoint (int pid) { - struct remote_state *rs = get_remote_state (); - - return !remote_fork_event_p (rs); + return !m_features.remote_fork_event_p (); } /* Remove fork catchpoint target routine. Nothing to do, just @@ -2393,9 +2507,7 @@ remote_target::remove_fork_catchpoint (int pid) int remote_target::insert_vfork_catchpoint (int pid) { - struct remote_state *rs = get_remote_state (); - - return !remote_vfork_event_p (rs); + return !m_features.remote_vfork_event_p (); } /* Remove vfork catchpoint target routine. Nothing to do, just @@ -2413,9 +2525,7 @@ remote_target::remove_vfork_catchpoint (int pid) int remote_target::insert_exec_catchpoint (int pid) { - struct remote_state *rs = get_remote_state (); - - return !remote_exec_event_p (rs); + return !m_features.remote_exec_event_p (); } /* Remove exec catchpoint target routine. Nothing to do, just @@ -2444,10 +2554,10 @@ remote_target::remote_query_attached (int pid) struct remote_state *rs = get_remote_state (); size_t size = get_remote_packet_size (); - if (packet_support (PACKET_qAttached) == PACKET_DISABLE) + if (m_features.packet_support (PACKET_qAttached) == PACKET_DISABLE) return 0; - if (remote_multi_process_p (rs)) + if (m_features.remote_multi_process_p ()) xsnprintf (rs->buf.data (), size, "qAttached:%x", pid); else xsnprintf (rs->buf.data (), size, "qAttached"); @@ -2455,8 +2565,7 @@ remote_target::remote_query_attached (int pid) putpkt (rs->buf); getpkt (&rs->buf, 0); - switch (packet_ok (rs->buf, - &remote_protocol_packets[PACKET_qAttached])) + switch (m_features.packet_ok (rs->buf, PACKET_qAttached)) { case PACKET_OK: if (strcmp (rs->buf.data (), "1") == 0) @@ -2656,8 +2765,7 @@ remote_target::remote_notice_new_inferior (ptid_t currthread, bool executing) thread, so notifications are emitted in a sensible order. */ if (find_inferior_pid (this, currthread.pid ()) == NULL) { - struct remote_state *rs = get_remote_state (); - bool fake_pid_p = !remote_multi_process_p (rs); + bool fake_pid_p = !m_features.remote_multi_process_p (); inf = remote_add_inferior (fake_pid_p, currthread.pid (), -1, 1); @@ -2720,7 +2828,7 @@ record_currthread (struct remote_state *rs, ptid_t currthread) void remote_target::pass_signals (gdb::array_view<const unsigned char> pass_signals) { - if (packet_support (PACKET_QPassSignals) != PACKET_DISABLE) + if (m_features.packet_support (PACKET_QPassSignals) != PACKET_DISABLE) { char *pass_packet, *p; int count = 0; @@ -2754,7 +2862,7 @@ remote_target::pass_signals (gdb::array_view<const unsigned char> pass_signals) { putpkt (pass_packet); getpkt (&rs->buf, 0); - packet_ok (rs->buf, &remote_protocol_packets[PACKET_QPassSignals]); + m_features.packet_ok (rs->buf, PACKET_QPassSignals); xfree (rs->last_pass_packet); rs->last_pass_packet = pass_packet; } @@ -2774,7 +2882,7 @@ remote_target::set_syscall_catchpoint (int pid, bool needed, int any_count, enum packet_result result; int n_sysno = 0; - if (packet_support (PACKET_QCatchSyscalls) == PACKET_DISABLE) + if (m_features.packet_support (PACKET_QCatchSyscalls) == PACKET_DISABLE) { /* Not supported. */ return 1; @@ -2827,7 +2935,7 @@ remote_target::set_syscall_catchpoint (int pid, bool needed, int any_count, putpkt (catch_packet); getpkt (&rs->buf, 0); - result = packet_ok (rs->buf, &remote_protocol_packets[PACKET_QCatchSyscalls]); + result = m_features.packet_ok (rs->buf, PACKET_QCatchSyscalls); if (result == PACKET_OK) return 0; else @@ -2840,7 +2948,7 @@ remote_target::set_syscall_catchpoint (int pid, bool needed, int any_count, void remote_target::program_signals (gdb::array_view<const unsigned char> signals) { - if (packet_support (PACKET_QProgramSignals) != PACKET_DISABLE) + if (m_features.packet_support (PACKET_QProgramSignals) != PACKET_DISABLE) { char *packet, *p; int count = 0; @@ -2875,7 +2983,7 @@ remote_target::program_signals (gdb::array_view<const unsigned char> signals) { putpkt (packet); getpkt (&rs->buf, 0); - packet_ok (rs->buf, &remote_protocol_packets[PACKET_QProgramSignals]); + m_features.packet_ok (rs->buf, PACKET_QProgramSignals); xfree (rs->last_program_signals_packet); rs->last_program_signals_packet = packet; } @@ -2941,12 +3049,12 @@ remote_target::set_continue_thread (ptid_t ptid) void remote_target::set_general_process () { - struct remote_state *rs = get_remote_state (); - /* If the remote can't handle multiple processes, don't bother. */ - if (!remote_multi_process_p (rs)) + if (!m_features.remote_multi_process_p ()) return; + remote_state *rs = get_remote_state (); + /* We only need to change the remote current thread if it's pointing at some other process. */ if (rs->general_thread.pid () != inferior_ptid.pid ()) @@ -3096,9 +3204,8 @@ char * remote_target::write_ptid (char *buf, const char *endbuf, ptid_t ptid) { int pid, tid; - struct remote_state *rs = get_remote_state (); - if (remote_multi_process_p (rs)) + if (m_features.remote_multi_process_p ()) { pid = ptid.pid (); if (pid < 0) @@ -3860,7 +3967,7 @@ int remote_target::remote_get_threads_with_qxfer (threads_listing_context *context) { #if defined(HAVE_LIBEXPAT) - if (packet_support (PACKET_qXfer_threads) == PACKET_ENABLE) + if (m_features.packet_support (PACKET_qXfer_threads) == PACKET_ENABLE) { gdb::optional<gdb::char_vector> xml = target_read_stralloc (this, TARGET_OBJECT_THREADS, NULL); @@ -4052,7 +4159,7 @@ remote_target::extra_thread_info (thread_info *tp) if (!extra.empty ()) return extra.c_str (); - if (packet_support (PACKET_qXfer_threads) == PACKET_ENABLE) + if (m_features.packet_support (PACKET_qXfer_threads) == PACKET_ENABLE) { /* If we're using qXfer:threads:read, then the extra info is included in the XML. So if we didn't have anything cached, @@ -4477,7 +4584,6 @@ remote_target::get_current_thread (const char *wait_status) thread_info * remote_target::add_current_inferior_and_thread (const char *wait_status) { - struct remote_state *rs = get_remote_state (); bool fake_pid_p = false; switch_to_no_thread (); @@ -4488,7 +4594,7 @@ remote_target::add_current_inferior_and_thread (const char *wait_status) if (curr_ptid != null_ptid) { - if (!remote_multi_process_p (rs)) + if (!m_features.remote_multi_process_p ()) fake_pid_p = true; } else @@ -4750,7 +4856,6 @@ remote_target::start_remote_1 (int from_tty, int extended_p) REMOTE_SCOPED_DEBUG_ENTER_EXIT; struct remote_state *rs = get_remote_state (); - struct packet_config *noack_config; /* Signal other parts that we're going through the initial setup, and so things may not be stable yet. E.g., we don't try to @@ -4774,7 +4879,7 @@ remote_target::start_remote_1 (int from_tty, int extended_p) remote_query_supported (); /* If the stub wants to get a QAllow, compose one and send it. */ - if (packet_support (PACKET_QAllow) != PACKET_DISABLE) + if (m_features.packet_support (PACKET_QAllow) != PACKET_DISABLE) set_permissions (); /* gdbserver < 7.7 (before its fix from 2013-12-11) did reply to any @@ -4790,7 +4895,10 @@ remote_target::start_remote_1 (int from_tty, int extended_p) putpkt (v_mustreplyempty); getpkt (&rs->buf, 0); if (strcmp (rs->buf.data (), "OK") == 0) - remote_protocol_packets[PACKET_vFile_setfs].support = PACKET_DISABLE; + { + m_features.m_protocol_packets[PACKET_vFile_setfs].support + = PACKET_DISABLE; + } else if (strcmp (rs->buf.data (), "") != 0) error (_("Remote replied unexpectedly to '%s': %s"), v_mustreplyempty, rs->buf.data ()); @@ -4809,12 +4917,11 @@ remote_target::start_remote_1 (int from_tty, int extended_p) If FALSE, then don't activate noack mode, regardless of what the stub claimed should be the default with qSupported. */ - noack_config = &remote_protocol_packets[PACKET_QStartNoAckMode]; - if (packet_config_support (noack_config) != PACKET_DISABLE) + if (m_features.packet_support (PACKET_QStartNoAckMode) != PACKET_DISABLE) { putpkt ("QStartNoAckMode"); getpkt (&rs->buf, 0); - if (packet_ok (rs->buf, noack_config) == PACKET_OK) + if (m_features.packet_ok (rs->buf, PACKET_QStartNoAckMode) == PACKET_OK) rs->noack_mode = 1; } @@ -4844,7 +4951,7 @@ remote_target::start_remote_1 (int from_tty, int extended_p) if (target_is_non_stop_p ()) { - if (packet_support (PACKET_QNonStop) != PACKET_ENABLE) + if (m_features.packet_support (PACKET_QNonStop) != PACKET_ENABLE) error (_("Non-stop mode requested, but remote " "does not support non-stop")); @@ -4861,7 +4968,7 @@ remote_target::start_remote_1 (int from_tty, int extended_p) stopped. */ this->update_thread_list (); } - else if (packet_support (PACKET_QNonStop) == PACKET_ENABLE) + else if (m_features.packet_support (PACKET_QNonStop) == PACKET_ENABLE) { /* Don't assume that the stub can operate in all-stop mode. Request it explicitly. */ @@ -5102,16 +5209,13 @@ extended_remote_target::open (const char *name, int from_tty) open_1 (name, from_tty, 1 /*extended_p */); } -/* Reset all packets back to "unknown support". Called when opening a - new connection to a remote target. */ - -static void -reset_all_packet_configs_support (void) +void +remote_features::reset_all_packet_configs_support () { int i; for (i = 0; i < PACKET_MAX; i++) - remote_protocol_packets[i].support = PACKET_SUPPORT_UNKNOWN; + m_protocol_packets[i].support = PACKET_SUPPORT_UNKNOWN; } /* Initialize all packet configs. */ @@ -5141,7 +5245,7 @@ remote_target::remote_check_symbols () inferiors without execution. */ gdb_assert (target_has_execution ()); - if (packet_support (PACKET_qSymbol) == PACKET_DISABLE) + if (m_features.packet_support (PACKET_qSymbol) == PACKET_DISABLE) return; /* Make sure the remote is pointing at the right process. Note @@ -5157,7 +5261,7 @@ remote_target::remote_check_symbols () putpkt ("qSymbol::"); getpkt (&reply, 0); - packet_ok (reply, &remote_protocol_packets[PACKET_qSymbol]); + m_features.packet_ok (reply, PACKET_qSymbol); while (startswith (reply.data (), "qSymbol:")) { @@ -5281,7 +5385,7 @@ remote_supported_packet (remote_target *remote, return; } - remote_protocol_packets[feature->packet].support = support; + remote->m_features.m_protocol_packets[feature->packet].support = support; } void @@ -5489,47 +5593,57 @@ remote_target::remote_query_supported () containing no features. */ rs->buf[0] = 0; - if (packet_support (PACKET_qSupported) != PACKET_DISABLE) + if (m_features.packet_support (PACKET_qSupported) != PACKET_DISABLE) { std::string q; - if (packet_set_cmd_state (PACKET_multiprocess_feature) != AUTO_BOOLEAN_FALSE) + if (m_features.packet_set_cmd_state (PACKET_multiprocess_feature) + != AUTO_BOOLEAN_FALSE) remote_query_supported_append (&q, "multiprocess+"); - if (packet_set_cmd_state (PACKET_swbreak_feature) != AUTO_BOOLEAN_FALSE) + if (m_features.packet_set_cmd_state (PACKET_swbreak_feature) + != AUTO_BOOLEAN_FALSE) remote_query_supported_append (&q, "swbreak+"); - if (packet_set_cmd_state (PACKET_hwbreak_feature) != AUTO_BOOLEAN_FALSE) + + if (m_features.packet_set_cmd_state (PACKET_hwbreak_feature) + != AUTO_BOOLEAN_FALSE) remote_query_supported_append (&q, "hwbreak+"); remote_query_supported_append (&q, "qRelocInsn+"); - if (packet_set_cmd_state (PACKET_fork_event_feature) + if (m_features.packet_set_cmd_state (PACKET_fork_event_feature) != AUTO_BOOLEAN_FALSE) remote_query_supported_append (&q, "fork-events+"); - if (packet_set_cmd_state (PACKET_vfork_event_feature) + + if (m_features.packet_set_cmd_state (PACKET_vfork_event_feature) != AUTO_BOOLEAN_FALSE) remote_query_supported_append (&q, "vfork-events+"); - if (packet_set_cmd_state (PACKET_exec_event_feature) + + if (m_features.packet_set_cmd_state (PACKET_exec_event_feature) != AUTO_BOOLEAN_FALSE) remote_query_supported_append (&q, "exec-events+"); - if (packet_set_cmd_state (PACKET_vContSupported) != AUTO_BOOLEAN_FALSE) + if (m_features.packet_set_cmd_state (PACKET_vContSupported) + != AUTO_BOOLEAN_FALSE) remote_query_supported_append (&q, "vContSupported+"); - if (packet_set_cmd_state (PACKET_QThreadEvents) != AUTO_BOOLEAN_FALSE) + if (m_features.packet_set_cmd_state (PACKET_QThreadEvents) + != AUTO_BOOLEAN_FALSE) remote_query_supported_append (&q, "QThreadEvents+"); - if (packet_set_cmd_state (PACKET_no_resumed) != AUTO_BOOLEAN_FALSE) + if (m_features.packet_set_cmd_state (PACKET_no_resumed) + != AUTO_BOOLEAN_FALSE) remote_query_supported_append (&q, "no-resumed+"); - if (packet_set_cmd_state (PACKET_memory_tagging_feature) + if (m_features.packet_set_cmd_state (PACKET_memory_tagging_feature) != AUTO_BOOLEAN_FALSE) remote_query_supported_append (&q, "memory-tagging+"); /* Keep this one last to work around a gdbserver <= 7.10 bug in the qSupported:xmlRegisters=i386 handling. */ if (remote_support_xml != NULL - && packet_support (PACKET_qXfer_features) != PACKET_DISABLE) + && (m_features.packet_support (PACKET_qXfer_features) + != PACKET_DISABLE)) remote_query_supported_append (&q, remote_support_xml); q = "qSupported:" + q; @@ -5539,8 +5653,7 @@ remote_target::remote_query_supported () /* If an error occured, warn, but do not return - just reset the buffer to empty and go on to disable features. */ - if (packet_ok (rs->buf, &remote_protocol_packets[PACKET_qSupported]) - == PACKET_ERROR) + if (m_features.packet_ok (rs->buf, PACKET_qSupported) == PACKET_ERROR) { warning (_("Remote failure reply: %s"), rs->buf.data ()); rs->buf[0] = 0; @@ -5817,7 +5930,7 @@ remote_target::open_1 (const char *name, int from_tty, int extended_p) /* Reset the target state; these things will be queried either by remote_query_supported or as they are needed. */ - reset_all_packet_configs_support (); + remote->m_features.reset_all_packet_configs_support (); rs->explicit_packet_size = 0; rs->noack_mode = 0; rs->extended = extended_p; @@ -5930,7 +6043,7 @@ remote_target::remote_detach_pid (int pid) GDBserver to select GDB's current process. */ set_general_process (); - if (remote_multi_process_p (rs)) + if (m_features.remote_multi_process_p ()) xsnprintf (rs->buf.data (), get_remote_packet_size (), "D;%x", pid); else strcpy (rs->buf.data (), "D"); @@ -6061,10 +6174,10 @@ remote_target::follow_fork (inferior *child_inf, ptid_t child_ptid, process_stratum_target::follow_fork (child_inf, child_ptid, fork_kind, follow_child, detach_fork); - struct remote_state *rs = get_remote_state (); - - if ((fork_kind == TARGET_WAITKIND_FORKED && remote_fork_event_p (rs)) - || (fork_kind == TARGET_WAITKIND_VFORKED && remote_vfork_event_p (rs))) + if ((fork_kind == TARGET_WAITKIND_FORKED + && m_features.remote_fork_event_p ()) + || (fork_kind == TARGET_WAITKIND_VFORKED + && m_features.remote_vfork_event_p ())) { /* When following the parent and detaching the child, we detach the child here. For the case of following the child and @@ -6130,7 +6243,7 @@ extended_remote_target::attach (const char *args, int from_tty) /* Remote PID can be freely equal to getpid, do not check it here the same way as in other targets. */ - if (packet_support (PACKET_vAttach) == PACKET_DISABLE) + if (m_features.packet_support (PACKET_vAttach) == PACKET_DISABLE) error (_("This target does not support attaching to a process")); target_announce_attach (from_tty, pid); @@ -6139,8 +6252,7 @@ extended_remote_target::attach (const char *args, int from_tty) putpkt (rs->buf); getpkt (&rs->buf, 0); - switch (packet_ok (rs->buf, - &remote_protocol_packets[PACKET_vAttach])) + switch (m_features.packet_ok (rs->buf, PACKET_vAttach)) { case PACKET_OK: if (!target_is_non_stop_p ()) @@ -6281,7 +6393,7 @@ remote_target::remote_vcont_probe () buf[0] = 0; } - packet_ok (rs->buf, &remote_protocol_packets[PACKET_vCont]); + m_features.packet_ok (rs->buf, PACKET_vCont); rs->supports_vCont_probed = true; } @@ -6311,7 +6423,7 @@ remote_target::append_resumption (char *p, char *endp, threads with a wildcard (though the protocol allows it, so stubs shouldn't make an active effort to forbid it). */ - && !(remote_multi_process_p (rs) && ptid.is_pid ())) + && !(m_features.remote_multi_process_p () && ptid.is_pid ())) { struct thread_info *tp; @@ -6345,7 +6457,7 @@ remote_target::append_resumption (char *p, char *endp, else p += xsnprintf (p, endp - p, ";c"); - if (remote_multi_process_p (rs) && ptid.is_pid ()) + if (m_features.remote_multi_process_p () && ptid.is_pid ()) { ptid_t nptid; @@ -6429,9 +6541,9 @@ remote_target::remote_resume_with_hc (ptid_t ptid, int step, warning (_(" - Can't pass signal %d to target in reverse: ignored."), siggnal); - if (step && packet_support (PACKET_bs) == PACKET_DISABLE) + if (step && m_features.packet_support (PACKET_bs) == PACKET_DISABLE) error (_("Remote reverse-step not supported.")); - if (!step && packet_support (PACKET_bc) == PACKET_DISABLE) + if (!step && m_features.packet_support (PACKET_bc) == PACKET_DISABLE) error (_("Remote reverse-continue not supported.")); strcpy (buf, step ? "bs" : "bc"); @@ -6468,10 +6580,10 @@ remote_target::remote_resume_with_vcont (ptid_t scope_ptid, int step, if (::execution_direction == EXEC_REVERSE) return 0; - if (packet_support (PACKET_vCont) == PACKET_SUPPORT_UNKNOWN) + if (m_features.packet_support (PACKET_vCont) == PACKET_SUPPORT_UNKNOWN) remote_vcont_probe (); - if (packet_support (PACKET_vCont) == PACKET_DISABLE) + if (m_features.packet_support (PACKET_vCont) == PACKET_DISABLE) return 0; p = rs->buf.data (); @@ -7006,7 +7118,7 @@ remote_target::remote_stop_ns (ptid_t ptid) /* FIXME: This supports_vCont_probed check is a workaround until packet_support is per-connection. */ - if (packet_support (PACKET_vCont) == PACKET_SUPPORT_UNKNOWN + if (m_features.packet_support (PACKET_vCont) == PACKET_SUPPORT_UNKNOWN || !rs->supports_vCont_probed) remote_vcont_probe (); @@ -7014,7 +7126,7 @@ remote_target::remote_stop_ns (ptid_t ptid) error (_("Remote server does not support stopping threads")); if (ptid == minus_one_ptid - || (!remote_multi_process_p (rs) && ptid.is_pid ())) + || (!m_features.remote_multi_process_p () && ptid.is_pid ())) p += xsnprintf (p, endp - p, "vCont;t"); else { @@ -7088,7 +7200,7 @@ remote_target::remote_interrupt_ns () putpkt (rs->buf); getpkt (&rs->buf, 0); - switch (packet_ok (rs->buf, &remote_protocol_packets[PACKET_vCtrlC])) + switch (m_features.packet_ok (rs->buf, PACKET_vCtrlC)) { case PACKET_OK: break; @@ -7596,7 +7708,8 @@ Packet: '%s'\n"), /* Make sure the stub doesn't forget to indicate support with qSupported. */ - if (packet_support (PACKET_swbreak_feature) != PACKET_ENABLE) + if (m_features.packet_support (PACKET_swbreak_feature) + != PACKET_ENABLE) error (_("Unexpected swbreak stop reason")); /* The value part is documented as "must be empty", @@ -7610,7 +7723,8 @@ Packet: '%s'\n"), /* Make sure the stub doesn't forget to indicate support with qSupported. */ - if (packet_support (PACKET_hwbreak_feature) != PACKET_ENABLE) + if (m_features.packet_support (PACKET_hwbreak_feature) + != PACKET_ENABLE) error (_("Unexpected hwbreak stop reason")); /* See above. */ @@ -8381,7 +8495,7 @@ remote_target::fetch_register_using_p (struct regcache *regcache, gdb_byte *regp = (gdb_byte *) alloca (register_size (gdbarch, reg->regnum)); int i; - if (packet_support (PACKET_p) == PACKET_DISABLE) + if (m_features.packet_support (PACKET_p) == PACKET_DISABLE) return 0; if (reg->pnum == -1) @@ -8396,7 +8510,7 @@ remote_target::fetch_register_using_p (struct regcache *regcache, buf = rs->buf.data (); - switch (packet_ok (rs->buf, &remote_protocol_packets[PACKET_p])) + switch (m_features.packet_ok (rs->buf, PACKET_p)) { case PACKET_OK: break; @@ -8661,7 +8775,7 @@ remote_target::prepare_to_store (struct regcache *regcache) int i; /* Make sure the entire registers array is valid. */ - switch (packet_support (PACKET_P)) + switch (m_features.packet_support (PACKET_P)) { case PACKET_DISABLE: case PACKET_SUPPORT_UNKNOWN: @@ -8689,7 +8803,7 @@ remote_target::store_register_using_P (const struct regcache *regcache, gdb_byte *regp = (gdb_byte *) alloca (register_size (gdbarch, reg->regnum)); char *p; - if (packet_support (PACKET_P) == PACKET_DISABLE) + if (m_features.packet_support (PACKET_P) == PACKET_DISABLE) return 0; if (reg->pnum == -1) @@ -8702,7 +8816,7 @@ remote_target::store_register_using_P (const struct regcache *regcache, putpkt (rs->buf); getpkt (&rs->buf, 0); - switch (packet_ok (rs->buf, &remote_protocol_packets[PACKET_P])) + switch (m_features.packet_ok (rs->buf, PACKET_P)) { case PACKET_OK: return 1; @@ -8885,7 +8999,7 @@ remote_target::check_binary_download (CORE_ADDR addr) { struct remote_state *rs = get_remote_state (); - switch (packet_support (PACKET_X)) + switch (m_features.packet_support (PACKET_X)) { case PACKET_DISABLE: break; @@ -8909,12 +9023,12 @@ remote_target::check_binary_download (CORE_ADDR addr) if (rs->buf[0] == '\0') { remote_debug_printf ("binary downloading NOT supported by target"); - remote_protocol_packets[PACKET_X].support = PACKET_DISABLE; + m_features.m_protocol_packets[PACKET_X].support = PACKET_DISABLE; } else { remote_debug_printf ("binary downloading supported by target"); - remote_protocol_packets[PACKET_X].support = PACKET_ENABLE; + m_features.m_protocol_packets[PACKET_X].support = PACKET_ENABLE; } break; } @@ -9139,7 +9253,7 @@ remote_target::remote_write_bytes (CORE_ADDR memaddr, const gdb_byte *myaddr, /* Check whether the target supports binary download. */ check_binary_download (memaddr); - switch (packet_support (PACKET_X)) + switch (m_features.packet_support (PACKET_X)) { case PACKET_ENABLE: packet_format = "X"; @@ -10103,11 +10217,10 @@ remote_target::kill () { int res = -1; inferior *inf = find_inferior_pid (this, inferior_ptid.pid ()); - struct remote_state *rs = get_remote_state (); gdb_assert (inf != nullptr); - if (packet_support (PACKET_vKill) != PACKET_DISABLE) + if (m_features.packet_support (PACKET_vKill) != PACKET_DISABLE) { /* If we're stopped while forking and we haven't followed yet, kill the child task. We need to do this before killing the @@ -10126,7 +10239,7 @@ remote_target::kill () /* If we are in 'target remote' mode and we are killing the only inferior, then we will tell gdbserver to exit and unpush the target. */ - if (res == -1 && !remote_multi_process_p (rs) + if (res == -1 && !m_features.remote_multi_process_p () && number_of_live_inferiors (this) == 1) { remote_kill_k (); @@ -10148,7 +10261,7 @@ remote_target::kill () int remote_target::remote_vkill (int pid) { - if (packet_support (PACKET_vKill) == PACKET_DISABLE) + if (m_features.packet_support (PACKET_vKill) == PACKET_DISABLE) return -1; remote_state *rs = get_remote_state (); @@ -10158,8 +10271,7 @@ remote_target::remote_vkill (int pid) putpkt (rs->buf); getpkt (&rs->buf, 0); - switch (packet_ok (rs->buf, - &remote_protocol_packets[PACKET_vKill])) + switch (m_features.packet_ok (rs->buf, PACKET_vKill)) { case PACKET_OK: return 0; @@ -10255,7 +10367,8 @@ remote_target::mourn_inferior () bool extended_remote_target::supports_disable_randomization () { - return packet_support (PACKET_QDisableRandomization) == PACKET_ENABLE; + return (m_features.packet_support (PACKET_QDisableRandomization) + == PACKET_ENABLE); } void @@ -10283,7 +10396,7 @@ remote_target::extended_remote_run (const std::string &args) /* If the user has disabled vRun support, or we have detected that support is not available, do not try it. */ - if (packet_support (PACKET_vRun) == PACKET_DISABLE) + if (m_features.packet_support (PACKET_vRun) == PACKET_DISABLE) return -1; strcpy (rs->buf.data (), "vRun;"); @@ -10314,7 +10427,7 @@ remote_target::extended_remote_run (const std::string &args) putpkt (rs->buf); getpkt (&rs->buf, 0); - switch (packet_ok (rs->buf, &remote_protocol_packets[PACKET_vRun])) + switch (m_features.packet_ok (rs->buf, PACKET_vRun)) { case PACKET_OK: /* We have a wait response. All is well. */ @@ -10367,7 +10480,7 @@ remote_target::extended_remote_environment_support () { remote_state *rs = get_remote_state (); - if (packet_support (PACKET_QEnvironmentReset) != PACKET_DISABLE) + if (m_features.packet_support (PACKET_QEnvironmentReset) != PACKET_DISABLE) { putpkt ("QEnvironmentReset"); getpkt (&rs->buf, 0); @@ -10377,12 +10490,16 @@ remote_target::extended_remote_environment_support () gdb_environ *e = ¤t_inferior ()->environment; - if (packet_support (PACKET_QEnvironmentHexEncoded) != PACKET_DISABLE) - for (const std::string &el : e->user_set_env ()) - send_environment_packet ("set", "QEnvironmentHexEncoded", - el.c_str ()); + if (m_features.packet_support (PACKET_QEnvironmentHexEncoded) + != PACKET_DISABLE) + { + for (const std::string &el : e->user_set_env ()) + send_environment_packet ("set", "QEnvironmentHexEncoded", + el.c_str ()); + } + - if (packet_support (PACKET_QEnvironmentUnset) != PACKET_DISABLE) + if (m_features.packet_support (PACKET_QEnvironmentUnset) != PACKET_DISABLE) for (const std::string &el : e->user_unset_env ()) send_environment_packet ("unset", "QEnvironmentUnset", el.c_str ()); } @@ -10393,7 +10510,7 @@ remote_target::extended_remote_environment_support () void remote_target::extended_remote_set_inferior_cwd () { - if (packet_support (PACKET_QSetWorkingDir) != PACKET_DISABLE) + if (m_features.packet_support (PACKET_QSetWorkingDir) != PACKET_DISABLE) { const std::string &inferior_cwd = current_inferior ()->cwd (); remote_state *rs = get_remote_state (); @@ -10417,9 +10534,7 @@ remote_target::extended_remote_set_inferior_cwd () putpkt (rs->buf); getpkt (&rs->buf, 0); - if (packet_ok (rs->buf, - &remote_protocol_packets[PACKET_QSetWorkingDir]) - != PACKET_OK) + if (m_features.packet_ok (rs->buf, PACKET_QSetWorkingDir) != PACKET_OK) error (_("\ Remote replied unexpectedly while setting the inferior's working\n\ directory: %s"), @@ -10455,7 +10570,7 @@ extended_remote_target::create_inferior (const char *exec_file, /* If startup-with-shell is on, we inform gdbserver to start the remote inferior using a shell. */ - if (packet_support (PACKET_QStartupWithShell) != PACKET_DISABLE) + if (m_features.packet_support (PACKET_QStartupWithShell) != PACKET_DISABLE) { xsnprintf (rs->buf.data (), get_remote_packet_size (), "QStartupWithShell:%d", startup_with_shell ? 1 : 0); @@ -10561,7 +10676,7 @@ remote_target::insert_breakpoint (struct gdbarch *gdbarch, fails, and the user has explicitly requested the Z support then report an error, otherwise, mark it disabled and go on. */ - if (packet_support (PACKET_Z0) != PACKET_DISABLE) + if (m_features.packet_support (PACKET_Z0) != PACKET_DISABLE) { CORE_ADDR addr = bp_tgt->reqstd_address; struct remote_state *rs; @@ -10592,7 +10707,7 @@ remote_target::insert_breakpoint (struct gdbarch *gdbarch, putpkt (rs->buf); getpkt (&rs->buf, 0); - switch (packet_ok (rs->buf, &remote_protocol_packets[PACKET_Z0])) + switch (m_features.packet_ok (rs->buf, PACKET_Z0)) { case PACKET_ERROR: return -1; @@ -10620,7 +10735,7 @@ remote_target::remove_breakpoint (struct gdbarch *gdbarch, CORE_ADDR addr = bp_tgt->placed_address; struct remote_state *rs = get_remote_state (); - if (packet_support (PACKET_Z0) != PACKET_DISABLE) + if (m_features.packet_support (PACKET_Z0) != PACKET_DISABLE) { char *p = rs->buf.data (); char *endbuf = p + get_remote_packet_size (); @@ -10675,7 +10790,7 @@ remote_target::insert_watchpoint (CORE_ADDR addr, int len, char *p; enum Z_packet_type packet = watchpoint_to_Z_packet (type); - if (packet_support (PACKET_Z0 + packet) == PACKET_DISABLE) + if (m_features.packet_support (PACKET_Z0 + packet) == PACKET_DISABLE) return 1; /* Make sure the remote is pointing at the right process, if @@ -10692,7 +10807,7 @@ remote_target::insert_watchpoint (CORE_ADDR addr, int len, putpkt (rs->buf); getpkt (&rs->buf, 0); - switch (packet_ok (rs->buf, &remote_protocol_packets[PACKET_Z0 + packet])) + switch (m_features.packet_ok (rs->buf, PACKET_Z0 + packet)) { case PACKET_ERROR: return -1; @@ -10723,7 +10838,7 @@ remote_target::remove_watchpoint (CORE_ADDR addr, int len, char *p; enum Z_packet_type packet = watchpoint_to_Z_packet (type); - if (packet_support (PACKET_Z0 + packet) == PACKET_DISABLE) + if (m_features.packet_support (PACKET_Z0 + packet) == PACKET_DISABLE) return -1; /* Make sure the remote is pointing at the right process, if @@ -10739,7 +10854,7 @@ remote_target::remove_watchpoint (CORE_ADDR addr, int len, putpkt (rs->buf); getpkt (&rs->buf, 0); - switch (packet_ok (rs->buf, &remote_protocol_packets[PACKET_Z0 + packet])) + switch (m_features.packet_ok (rs->buf, PACKET_Z0 + packet)) { case PACKET_ERROR: case PACKET_UNKNOWN: @@ -10812,7 +10927,7 @@ remote_target::stopped_by_sw_breakpoint () bool remote_target::supports_stopped_by_sw_breakpoint () { - return (packet_support (PACKET_swbreak_feature) == PACKET_ENABLE); + return (m_features.packet_support (PACKET_swbreak_feature) == PACKET_ENABLE); } /* The to_stopped_by_hw_breakpoint method of target remote. */ @@ -10833,7 +10948,7 @@ remote_target::stopped_by_hw_breakpoint () bool remote_target::supports_stopped_by_hw_breakpoint () { - return (packet_support (PACKET_hwbreak_feature) == PACKET_ENABLE); + return (m_features.packet_support (PACKET_hwbreak_feature) == PACKET_ENABLE); } bool @@ -10872,7 +10987,7 @@ remote_target::insert_hw_breakpoint (struct gdbarch *gdbarch, char *p, *endbuf; char *message; - if (packet_support (PACKET_Z1) == PACKET_DISABLE) + if (m_features.packet_support (PACKET_Z1) == PACKET_DISABLE) return -1; /* Make sure the remote is pointing at the right process, if @@ -10901,7 +11016,7 @@ remote_target::insert_hw_breakpoint (struct gdbarch *gdbarch, putpkt (rs->buf); getpkt (&rs->buf, 0); - switch (packet_ok (rs->buf, &remote_protocol_packets[PACKET_Z1])) + switch (m_features.packet_ok (rs->buf, PACKET_Z1)) { case PACKET_ERROR: if (rs->buf[1] == '.') @@ -10929,7 +11044,7 @@ remote_target::remove_hw_breakpoint (struct gdbarch *gdbarch, char *p = rs->buf.data (); char *endbuf = p + get_remote_packet_size (); - if (packet_support (PACKET_Z1) == PACKET_DISABLE) + if (m_features.packet_support (PACKET_Z1) == PACKET_DISABLE) return -1; /* Make sure the remote is pointing at the right process, if @@ -10948,7 +11063,7 @@ remote_target::remove_hw_breakpoint (struct gdbarch *gdbarch, putpkt (rs->buf); getpkt (&rs->buf, 0); - switch (packet_ok (rs->buf, &remote_protocol_packets[PACKET_Z1])) + switch (m_features.packet_ok (rs->buf, PACKET_Z1)) { case PACKET_ERROR: case PACKET_UNKNOWN: @@ -10971,7 +11086,7 @@ remote_target::verify_memory (const gdb_byte *data, CORE_ADDR lma, ULONGEST size /* It doesn't make sense to use qCRC if the remote target is connected but not running. */ if (target_has_execution () - && packet_support (PACKET_qCRC) != PACKET_DISABLE) + && m_features.packet_support (PACKET_qCRC) != PACKET_DISABLE) { enum packet_result result; @@ -10989,8 +11104,7 @@ remote_target::verify_memory (const gdb_byte *data, CORE_ADDR lma, ULONGEST size getpkt (&rs->buf, 0); - result = packet_ok (rs->buf, - &remote_protocol_packets[PACKET_qCRC]); + result = m_features.packet_ok (rs->buf, PACKET_qCRC); if (result == PACKET_ERROR) return -1; else if (result == PACKET_OK) @@ -11089,14 +11203,14 @@ remote_target::remote_write_qxfer (const char *object_name, const char *annex, const gdb_byte *writebuf, ULONGEST offset, LONGEST len, ULONGEST *xfered_len, - struct packet_config *packet) + const unsigned int which_packet) { int i, buf_len; ULONGEST n; struct remote_state *rs = get_remote_state (); int max_size = get_memory_write_packet_size (); - if (packet_config_support (packet) == PACKET_DISABLE) + if (m_features.packet_support (which_packet) == PACKET_DISABLE) return TARGET_XFER_E_IO; /* Insert header. */ @@ -11112,7 +11226,7 @@ remote_target::remote_write_qxfer (const char *object_name, if (putpkt_binary (rs->buf.data (), i + buf_len) < 0 || getpkt_sane (&rs->buf, 0) < 0 - || packet_ok (rs->buf, packet) != PACKET_OK) + || m_features.packet_ok (rs->buf, which_packet) != PACKET_OK) return TARGET_XFER_E_IO; unpack_varlen_hex (rs->buf.data (), &n); @@ -11134,12 +11248,12 @@ remote_target::remote_read_qxfer (const char *object_name, gdb_byte *readbuf, ULONGEST offset, LONGEST len, ULONGEST *xfered_len, - struct packet_config *packet) + const unsigned int which_packet) { struct remote_state *rs = get_remote_state (); LONGEST i, n, packet_len; - if (packet_config_support (packet) == PACKET_DISABLE) + if (m_features.packet_support (which_packet) == PACKET_DISABLE) return TARGET_XFER_E_IO; /* Check whether we've cached an end-of-object packet that matches @@ -11176,7 +11290,8 @@ remote_target::remote_read_qxfer (const char *object_name, rs->buf[0] = '\0'; packet_len = getpkt_sane (&rs->buf, 0); - if (packet_len < 0 || packet_ok (rs->buf, packet) != PACKET_OK) + if (packet_len < 0 + || m_features.packet_ok (rs->buf, which_packet) != PACKET_OK) return TARGET_XFER_E_IO; if (rs->buf[0] != 'l' && rs->buf[0] != 'm') @@ -11250,13 +11365,10 @@ remote_target::xfer_partial (enum target_object object, { if (readbuf) return remote_read_qxfer ("siginfo", annex, readbuf, offset, len, - xfered_len, &remote_protocol_packets - [PACKET_qXfer_siginfo_read]); + xfered_len, PACKET_qXfer_siginfo_read); else - return remote_write_qxfer ("siginfo", annex, - writebuf, offset, len, xfered_len, - &remote_protocol_packets - [PACKET_qXfer_siginfo_write]); + return remote_write_qxfer ("siginfo", annex, writebuf, offset, len, + xfered_len, PACKET_qXfer_siginfo_write); } if (object == TARGET_OBJECT_STATIC_TRACE_DATA) @@ -11264,8 +11376,7 @@ remote_target::xfer_partial (enum target_object object, if (readbuf) return remote_read_qxfer ("statictrace", annex, readbuf, offset, len, xfered_len, - &remote_protocol_packets - [PACKET_qXfer_statictrace_read]); + PACKET_qXfer_statictrace_read); else return TARGET_XFER_E_IO; } @@ -11294,74 +11405,71 @@ remote_target::xfer_partial (enum target_object object, case TARGET_OBJECT_AUXV: gdb_assert (annex == NULL); - return remote_read_qxfer ("auxv", annex, readbuf, offset, len, - xfered_len, - &remote_protocol_packets[PACKET_qXfer_auxv]); + return remote_read_qxfer + ("auxv", annex, readbuf, offset, len, xfered_len, PACKET_qXfer_auxv); case TARGET_OBJECT_AVAILABLE_FEATURES: return remote_read_qxfer ("features", annex, readbuf, offset, len, xfered_len, - &remote_protocol_packets[PACKET_qXfer_features]); + PACKET_qXfer_features); case TARGET_OBJECT_LIBRARIES: return remote_read_qxfer ("libraries", annex, readbuf, offset, len, xfered_len, - &remote_protocol_packets[PACKET_qXfer_libraries]); + PACKET_qXfer_libraries); case TARGET_OBJECT_LIBRARIES_SVR4: return remote_read_qxfer ("libraries-svr4", annex, readbuf, offset, len, xfered_len, - &remote_protocol_packets[PACKET_qXfer_libraries_svr4]); + PACKET_qXfer_libraries_svr4); case TARGET_OBJECT_MEMORY_MAP: gdb_assert (annex == NULL); - return remote_read_qxfer ("memory-map", annex, readbuf, offset, len, - xfered_len, - &remote_protocol_packets[PACKET_qXfer_memory_map]); + return remote_read_qxfer + ("memory-map", annex, readbuf, offset, len, xfered_len, + PACKET_qXfer_memory_map); case TARGET_OBJECT_OSDATA: /* Should only get here if we're connected. */ gdb_assert (rs->remote_desc); return remote_read_qxfer ("osdata", annex, readbuf, offset, len, xfered_len, - &remote_protocol_packets[PACKET_qXfer_osdata]); + PACKET_qXfer_osdata); case TARGET_OBJECT_THREADS: gdb_assert (annex == NULL); - return remote_read_qxfer ("threads", annex, readbuf, offset, len, - xfered_len, - &remote_protocol_packets[PACKET_qXfer_threads]); + return remote_read_qxfer + ("threads", annex, readbuf, offset, len, xfered_len, + PACKET_qXfer_threads); case TARGET_OBJECT_TRACEFRAME_INFO: gdb_assert (annex == NULL); return remote_read_qxfer ("traceframe-info", annex, readbuf, offset, len, xfered_len, - &remote_protocol_packets[PACKET_qXfer_traceframe_info]); + PACKET_qXfer_traceframe_info); case TARGET_OBJECT_FDPIC: - return remote_read_qxfer ("fdpic", annex, readbuf, offset, len, - xfered_len, - &remote_protocol_packets[PACKET_qXfer_fdpic]); + return remote_read_qxfer + ("fdpic", annex, readbuf, offset, len, xfered_len, PACKET_qXfer_fdpic); case TARGET_OBJECT_OPENVMS_UIB: - return remote_read_qxfer ("uib", annex, readbuf, offset, len, - xfered_len, - &remote_protocol_packets[PACKET_qXfer_uib]); + return remote_read_qxfer + ("uib", annex, readbuf, offset, len, xfered_len, PACKET_qXfer_uib); case TARGET_OBJECT_BTRACE: - return remote_read_qxfer ("btrace", annex, readbuf, offset, len, - xfered_len, - &remote_protocol_packets[PACKET_qXfer_btrace]); + return remote_read_qxfer + ("btrace", annex, readbuf, offset, len, xfered_len, + PACKET_qXfer_btrace); case TARGET_OBJECT_BTRACE_CONF: - return remote_read_qxfer ("btrace-conf", annex, readbuf, offset, - len, xfered_len, - &remote_protocol_packets[PACKET_qXfer_btrace_conf]); + return remote_read_qxfer + ("btrace-conf", annex, readbuf, offset, len, xfered_len, + PACKET_qXfer_btrace_conf); case TARGET_OBJECT_EXEC_FILE: - return remote_read_qxfer ("exec-file", annex, readbuf, offset, - len, xfered_len, - &remote_protocol_packets[PACKET_qXfer_exec_file]); + return remote_read_qxfer + ("exec-file", annex, readbuf, offset, len, xfered_len, + PACKET_qXfer_exec_file); default: return TARGET_XFER_E_IO; @@ -11427,8 +11535,7 @@ remote_target::search_memory (CORE_ADDR start_addr, ULONGEST search_space_len, int addr_size = gdbarch_addr_bit (target_gdbarch ()) / 8; struct remote_state *rs = get_remote_state (); int max_size = get_memory_write_packet_size (); - struct packet_config *packet = - &remote_protocol_packets[PACKET_qSearch_memory]; + /* Number of packet bytes used to encode the pattern; this could be more than PATTERN_LEN due to escape characters. */ int escaped_pattern_len; @@ -11445,9 +11552,8 @@ remote_target::search_memory (CORE_ADDR start_addr, ULONGEST search_space_len, }; /* Don't go to the target if we don't have to. This is done before - checking packet_config_support to avoid the possibility that a - success for this edge case means the facility works in - general. */ + checking packet_support to avoid the possibility that a success for this + edge case means the facility works in general. */ if (pattern_len > search_space_len) return 0; if (pattern_len == 0) @@ -11459,7 +11565,7 @@ remote_target::search_memory (CORE_ADDR start_addr, ULONGEST search_space_len, /* If we already know the packet isn't supported, fall back to the simple way of searching memory. */ - if (packet_config_support (packet) == PACKET_DISABLE) + if (m_features.packet_support (PACKET_qSearch_memory) == PACKET_DISABLE) { /* Target doesn't provided special support, fall back and use the standard support (copy memory and do the search here). */ @@ -11489,11 +11595,11 @@ remote_target::search_memory (CORE_ADDR start_addr, ULONGEST search_space_len, if (putpkt_binary (rs->buf.data (), i + escaped_pattern_len) < 0 || getpkt_sane (&rs->buf, 0) < 0 - || packet_ok (rs->buf, packet) != PACKET_OK) + || m_features.packet_ok (rs->buf, PACKET_qSearch_memory) != PACKET_OK) { /* The request may not have worked because the command is not supported. If so, fall back to the simple way. */ - if (packet_config_support (packet) == PACKET_DISABLE) + if (m_features.packet_support (PACKET_qSearch_memory) == PACKET_DISABLE) { return simple_search_memory (read_memory, start_addr, search_space_len, pattern, pattern_len, found_addrp); @@ -11836,8 +11942,6 @@ init_remote_threadtests (void) std::string remote_target::pid_to_str (ptid_t ptid) { - struct remote_state *rs = get_remote_state (); - if (ptid == null_ptid) return normal_pid_to_str (ptid); else if (ptid.is_pid ()) @@ -11853,7 +11957,7 @@ remote_target::pid_to_str (ptid_t ptid) connecting with extended-remote and the stub already being attached to a process, and reporting yes to qAttached, hence no smart special casing here. */ - if (!remote_multi_process_p (rs)) + if (!m_features.remote_multi_process_p ()) return "Remote target"; return normal_pid_to_str (ptid); @@ -11862,7 +11966,7 @@ remote_target::pid_to_str (ptid_t ptid) { if (magic_null_ptid == ptid) return "Thread <main>"; - else if (remote_multi_process_p (rs)) + else if (m_features.remote_multi_process_p ()) if (ptid.lwp () == 0) return normal_pid_to_str (ptid); else @@ -11880,7 +11984,7 @@ CORE_ADDR remote_target::get_thread_local_address (ptid_t ptid, CORE_ADDR lm, CORE_ADDR offset) { - if (packet_support (PACKET_qGetTLSAddr) != PACKET_DISABLE) + if (m_features.packet_support (PACKET_qGetTLSAddr) != PACKET_DISABLE) { struct remote_state *rs = get_remote_state (); char *p = rs->buf.data (); @@ -11898,8 +12002,7 @@ remote_target::get_thread_local_address (ptid_t ptid, CORE_ADDR lm, putpkt (rs->buf); getpkt (&rs->buf, 0); - result = packet_ok (rs->buf, - &remote_protocol_packets[PACKET_qGetTLSAddr]); + result = m_features.packet_ok (rs->buf, PACKET_qGetTLSAddr); if (result == PACKET_OK) { ULONGEST addr; @@ -11927,7 +12030,7 @@ remote_target::get_thread_local_address (ptid_t ptid, CORE_ADDR lm, bool remote_target::get_tib_address (ptid_t ptid, CORE_ADDR *addr) { - if (packet_support (PACKET_qGetTIBAddr) != PACKET_DISABLE) + if (m_features.packet_support (PACKET_qGetTIBAddr) != PACKET_DISABLE) { struct remote_state *rs = get_remote_state (); char *p = rs->buf.data (); @@ -11941,8 +12044,7 @@ remote_target::get_tib_address (ptid_t ptid, CORE_ADDR *addr) putpkt (rs->buf); getpkt (&rs->buf, 0); - result = packet_ok (rs->buf, - &remote_protocol_packets[PACKET_qGetTIBAddr]); + result = m_features.packet_ok (rs->buf, PACKET_qGetTIBAddr); if (result == PACKET_OK) { ULONGEST val; @@ -12193,7 +12295,7 @@ remote_target::remote_hostio_send_command (int command_bytes, int which_packet, int ret, bytes_read; const char *attachment_tmp; - if (packet_support (which_packet) == PACKET_DISABLE) + if (m_features.packet_support (which_packet) == PACKET_DISABLE) { *remote_errno = FILEIO_ENOSYS; return -1; @@ -12210,7 +12312,7 @@ remote_target::remote_hostio_send_command (int command_bytes, int which_packet, return -1; } - switch (packet_ok (rs->buf, &remote_protocol_packets[which_packet])) + switch (m_features.packet_ok (rs->buf, which_packet)) { case PACKET_ERROR: *remote_errno = FILEIO_EINVAL; @@ -12280,7 +12382,7 @@ remote_target::remote_hostio_set_filesystem (struct inferior *inf, char arg[9]; int ret; - if (packet_support (PACKET_vFile_setfs) == PACKET_DISABLE) + if (m_features.packet_support (PACKET_vFile_setfs) == PACKET_DISABLE) return 0; if (rs->fs_pid != -1 && required_pid == rs->fs_pid) @@ -12294,7 +12396,7 @@ remote_target::remote_hostio_set_filesystem (struct inferior *inf, ret = remote_hostio_send_command (p - rs->buf.data (), PACKET_vFile_setfs, remote_errno, NULL, NULL); - if (packet_support (PACKET_vFile_setfs) == PACKET_DISABLE) + if (m_features.packet_support (PACKET_vFile_setfs) == PACKET_DISABLE) return 0; if (ret == 0) @@ -12666,7 +12768,7 @@ remote_target::filesystem_is_local () does not support vFile:open. */ if (gdb_sysroot == TARGET_SYSROOT_PREFIX) { - enum packet_support ps = packet_support (PACKET_vFile_open); + packet_support ps = m_features.packet_support (PACKET_vFile_open); if (ps == PACKET_SUPPORT_UNKNOWN) { @@ -12683,7 +12785,7 @@ remote_target::filesystem_is_local () if (fd >= 0) remote_hostio_close (fd, &remote_errno); - ps = packet_support (PACKET_vFile_open); + ps = m_features.packet_support (PACKET_vFile_open); } if (ps == PACKET_DISABLE) @@ -12988,8 +13090,8 @@ remote_delete_command (const char *args, int from_tty) bool remote_target::can_execute_reverse () { - if (packet_support (PACKET_bs) == PACKET_ENABLE - || packet_support (PACKET_bc) == PACKET_ENABLE) + if (m_features.packet_support (PACKET_bs) == PACKET_ENABLE + || m_features.packet_support (PACKET_bc) == PACKET_ENABLE) return true; else return false; @@ -13011,58 +13113,58 @@ remote_target::supports_disable_randomization () bool remote_target::supports_multi_process () { - struct remote_state *rs = get_remote_state (); - - return remote_multi_process_p (rs); + return m_features.remote_multi_process_p (); } -static int -remote_supports_cond_tracepoints () +int +remote_target::remote_supports_cond_tracepoints () { - return packet_support (PACKET_ConditionalTracepoints) == PACKET_ENABLE; + return (m_features.packet_support (PACKET_ConditionalTracepoints) + == PACKET_ENABLE); } bool remote_target::supports_evaluation_of_breakpoint_conditions () { - return packet_support (PACKET_ConditionalBreakpoints) == PACKET_ENABLE; + return (m_features.packet_support (PACKET_ConditionalBreakpoints) + == PACKET_ENABLE); } -static int -remote_supports_fast_tracepoints () +int +remote_target::remote_supports_fast_tracepoints () { - return packet_support (PACKET_FastTracepoints) == PACKET_ENABLE; + return m_features.packet_support (PACKET_FastTracepoints) == PACKET_ENABLE; } -static int -remote_supports_static_tracepoints () +int +remote_target::remote_supports_static_tracepoints () { - return packet_support (PACKET_StaticTracepoints) == PACKET_ENABLE; + return m_features.packet_support (PACKET_StaticTracepoints) == PACKET_ENABLE; } -static int -remote_supports_install_in_trace () +int +remote_target::remote_supports_install_in_trace () { - return packet_support (PACKET_InstallInTrace) == PACKET_ENABLE; + return m_features.packet_support (PACKET_InstallInTrace) == PACKET_ENABLE; } bool remote_target::supports_enable_disable_tracepoint () { - return (packet_support (PACKET_EnableDisableTracepoints_feature) + return (m_features.packet_support (PACKET_EnableDisableTracepoints_feature) == PACKET_ENABLE); } bool remote_target::supports_string_tracing () { - return packet_support (PACKET_tracenz_feature) == PACKET_ENABLE; + return m_features.packet_support (PACKET_tracenz_feature) == PACKET_ENABLE; } bool remote_target::can_run_breakpoint_commands () { - return packet_support (PACKET_BreakpointCommands) == PACKET_ENABLE; + return m_features.packet_support (PACKET_BreakpointCommands) == PACKET_ENABLE; } void @@ -13306,7 +13408,7 @@ remote_target::download_tracepoint (struct bp_location *loc) error (_("Error on target while setting tracepoints.")); } - if (packet_support (PACKET_TracepointSource) == PACKET_ENABLE) + if (m_features.packet_support (PACKET_TracepointSource) == PACKET_ENABLE) { if (b->locspec != nullptr) { @@ -13463,7 +13565,8 @@ remote_target::trace_set_readonly_regions () sec_length = 1 + strlen (tmp1) + 1 + strlen (tmp2); if (offset + sec_length + 1 > rs->buf.size ()) { - if (packet_support (PACKET_qXfer_traceframe_info) != PACKET_ENABLE) + if (m_features.packet_support (PACKET_qXfer_traceframe_info) + != PACKET_ENABLE) warning (_("\ Too many sections for read-only sections definition packet.")); break; @@ -13500,7 +13603,7 @@ remote_target::get_trace_status (struct trace_status *ts) enum packet_result result; struct remote_state *rs = get_remote_state (); - if (packet_support (PACKET_qTStatus) == PACKET_DISABLE) + if (m_features.packet_support (PACKET_qTStatus) == PACKET_DISABLE) return -1; /* FIXME we need to get register block size some other way. */ @@ -13523,7 +13626,7 @@ remote_target::get_trace_status (struct trace_status *ts) throw; } - result = packet_ok (p, &remote_protocol_packets[PACKET_qTStatus]); + result = m_features.packet_ok (p, PACKET_qTStatus); /* If the remote target doesn't do tracing, flag it. */ if (result == PACKET_UNKNOWN) @@ -13778,7 +13881,8 @@ remote_target::set_disconnected_tracing (int val) { struct remote_state *rs = get_remote_state (); - if (packet_support (PACKET_DisconnectedTracing_feature) == PACKET_ENABLE) + if (m_features.packet_support (PACKET_DisconnectedTracing_feature) + == PACKET_ENABLE) { char *reply; @@ -13872,7 +13976,7 @@ remote_target::get_min_fast_tracepoint_insn_len () void remote_target::set_trace_buffer_size (LONGEST val) { - if (packet_support (PACKET_QTBuffer_size) != PACKET_DISABLE) + if (m_features.packet_support (PACKET_QTBuffer_size) != PACKET_DISABLE) { struct remote_state *rs = get_remote_state (); char *buf = rs->buf.data (); @@ -13892,8 +13996,7 @@ remote_target::set_trace_buffer_size (LONGEST val) putpkt (rs->buf); remote_get_noisy_reply (); - result = packet_ok (rs->buf, - &remote_protocol_packets[PACKET_QTBuffer_size]); + result = m_features.packet_ok (rs->buf, PACKET_QTBuffer_size); if (result != PACKET_OK) warning (_("Bogus reply from target: %s"), rs->buf.data ()); @@ -13949,7 +14052,7 @@ remote_target::set_trace_notes (const char *user, const char *notes, bool remote_target::use_agent (bool use) { - if (packet_support (PACKET_QAgent) != PACKET_DISABLE) + if (m_features.packet_support (PACKET_QAgent) != PACKET_DISABLE) { struct remote_state *rs = get_remote_state (); @@ -13971,7 +14074,7 @@ remote_target::use_agent (bool use) bool remote_target::can_use_agent () { - return (packet_support (PACKET_QAgent) != PACKET_DISABLE); + return (m_features.packet_support (PACKET_QAgent) != PACKET_DISABLE); } struct btrace_target_info @@ -13996,7 +14099,6 @@ remote_btrace_reset (remote_state *rs) void remote_target::btrace_sync_conf (const btrace_config *conf) { - struct packet_config *packet; struct remote_state *rs; char *buf, *pos, *endbuf; @@ -14004,18 +14106,19 @@ remote_target::btrace_sync_conf (const btrace_config *conf) buf = rs->buf.data (); endbuf = buf + get_remote_packet_size (); - packet = &remote_protocol_packets[PACKET_Qbtrace_conf_bts_size]; - if (packet_config_support (packet) == PACKET_ENABLE + if (m_features.packet_support (PACKET_Qbtrace_conf_bts_size) == PACKET_ENABLE && conf->bts.size != rs->btrace_config.bts.size) { pos = buf; - pos += xsnprintf (pos, endbuf - pos, "%s=0x%x", packet->name, + pos += xsnprintf (pos, endbuf - pos, "%s=0x%x", + packets_descriptions[PACKET_Qbtrace_conf_bts_size].name, conf->bts.size); putpkt (buf); getpkt (&rs->buf, 0); - if (packet_ok (buf, packet) == PACKET_ERROR) + if (m_features.packet_ok (buf, PACKET_Qbtrace_conf_bts_size) + == PACKET_ERROR) { if (buf[0] == 'E' && buf[1] == '.') error (_("Failed to configure the BTS buffer size: %s"), buf + 2); @@ -14026,18 +14129,19 @@ remote_target::btrace_sync_conf (const btrace_config *conf) rs->btrace_config.bts.size = conf->bts.size; } - packet = &remote_protocol_packets[PACKET_Qbtrace_conf_pt_size]; - if (packet_config_support (packet) == PACKET_ENABLE + if (m_features.packet_support (PACKET_Qbtrace_conf_pt_size) == PACKET_ENABLE && conf->pt.size != rs->btrace_config.pt.size) { pos = buf; - pos += xsnprintf (pos, endbuf - pos, "%s=0x%x", packet->name, + pos += xsnprintf (pos, endbuf - pos, "%s=0x%x", + packets_descriptions[PACKET_Qbtrace_conf_pt_size].name, conf->pt.size); putpkt (buf); getpkt (&rs->buf, 0); - if (packet_ok (buf, packet) == PACKET_ERROR) + if (m_features.packet_ok (buf, PACKET_Qbtrace_conf_pt_size) + == PACKET_ERROR) { if (buf[0] == 'E' && buf[1] == '.') error (_("Failed to configure the trace buffer size: %s"), buf + 2); @@ -14078,7 +14182,7 @@ remote_target::remote_btrace_maybe_reopen () /* Don't bother walking the entirety of the remote thread list when we know the feature isn't supported by the remote. */ - if (packet_support (PACKET_qXfer_btrace_conf) != PACKET_ENABLE) + if (m_features.packet_support (PACKET_qXfer_btrace_conf) != PACKET_ENABLE) return; for (thread_info *tp : all_non_exited_threads (this)) @@ -14132,17 +14236,21 @@ remote_target::enable_btrace (thread_info *tp, char *buf = rs->buf.data (); char *endbuf = buf + get_remote_packet_size (); + unsigned int which_packet; switch (conf->format) { case BTRACE_FORMAT_BTS: - packet = &remote_protocol_packets[PACKET_Qbtrace_bts]; + which_packet = PACKET_Qbtrace_bts; break; - case BTRACE_FORMAT_PT: - packet = &remote_protocol_packets[PACKET_Qbtrace_pt]; + which_packet = PACKET_Qbtrace_pt; break; + default: + internal_error (_("Bad branch btrace format: %u."), + (unsigned int) conf->format); } + packet = &m_features.m_protocol_packets[which_packet]; if (packet == NULL || packet_config_support (packet) != PACKET_ENABLE) error (_("Target does not support branch tracing.")); @@ -14151,11 +14259,12 @@ remote_target::enable_btrace (thread_info *tp, ptid_t ptid = tp->ptid; set_general_thread (ptid); - buf += xsnprintf (buf, endbuf - buf, "%s", packet->name); + buf += xsnprintf (buf, endbuf - buf, "%s", + packets_descriptions[which_packet].name); putpkt (rs->buf); getpkt (&rs->buf, 0); - if (packet_ok (rs->buf, packet) == PACKET_ERROR) + if (m_features.packet_ok (rs->buf, which_packet) == PACKET_ERROR) { if (rs->buf[0] == 'E' && rs->buf[1] == '.') error (_("Could not enable branch tracing for %s: %s"), @@ -14188,21 +14297,21 @@ remote_target::enable_btrace (thread_info *tp, void remote_target::disable_btrace (struct btrace_target_info *tinfo) { - struct packet_config *packet = &remote_protocol_packets[PACKET_Qbtrace_off]; struct remote_state *rs = get_remote_state (); char *buf = rs->buf.data (); char *endbuf = buf + get_remote_packet_size (); - if (packet_config_support (packet) != PACKET_ENABLE) + if (m_features.packet_support (PACKET_Qbtrace_off) != PACKET_ENABLE) error (_("Target does not support branch tracing.")); set_general_thread (tinfo->ptid); - buf += xsnprintf (buf, endbuf - buf, "%s", packet->name); + buf += xsnprintf (buf, endbuf - buf, "%s", + packets_descriptions[PACKET_Qbtrace_off].name); putpkt (rs->buf); getpkt (&rs->buf, 0); - if (packet_ok (rs->buf, packet) == PACKET_ERROR) + if (m_features.packet_ok (rs->buf, PACKET_Qbtrace_off) == PACKET_ERROR) { if (rs->buf[0] == 'E' && rs->buf[1] == '.') error (_("Could not disable branch tracing for %s: %s"), @@ -14231,10 +14340,9 @@ remote_target::read_btrace (struct btrace_data *btrace, struct btrace_target_info *tinfo, enum btrace_read_type type) { - struct packet_config *packet = &remote_protocol_packets[PACKET_qXfer_btrace]; const char *annex; - if (packet_config_support (packet) != PACKET_ENABLE) + if (m_features.packet_support (PACKET_qXfer_btrace) != PACKET_ENABLE) error (_("Target does not support branch tracing.")); #if !defined(HAVE_LIBEXPAT) @@ -14277,8 +14385,9 @@ remote_target::btrace_conf (const struct btrace_target_info *tinfo) bool remote_target::augmented_libraries_svr4_read () { - return (packet_support (PACKET_augmented_libraries_svr4_read_feature) - == PACKET_ENABLE); + return + (m_features.packet_support (PACKET_augmented_libraries_svr4_read_feature) + == PACKET_ENABLE); } /* Implementation of to_load. */ @@ -14299,7 +14408,7 @@ remote_target::pid_to_exec_file (int pid) static gdb::optional<gdb::char_vector> filename; char *annex = NULL; - if (packet_support (PACKET_qXfer_exec_file) != PACKET_ENABLE) + if (m_features.packet_support (PACKET_qXfer_exec_file) != PACKET_ENABLE) return NULL; inferior *inf = find_inferior_pid (this, pid); @@ -14330,11 +14439,11 @@ remote_target::can_do_single_step () feature. If the stub doesn't support vContSupported feature, we have conservatively to think target doesn't supports single step. */ - if (packet_support (PACKET_vContSupported) == PACKET_ENABLE) + if (m_features.packet_support (PACKET_vContSupported) == PACKET_ENABLE) { struct remote_state *rs = get_remote_state (); - if (packet_support (PACKET_vCont) == PACKET_SUPPORT_UNKNOWN) + if (m_features.packet_support (PACKET_vCont) == PACKET_SUPPORT_UNKNOWN) remote_vcont_probe (); return rs->supports_vCont.s && rs->supports_vCont.S; @@ -14474,15 +14583,14 @@ remote_target::thread_events (int enable) struct remote_state *rs = get_remote_state (); size_t size = get_remote_packet_size (); - if (packet_support (PACKET_QThreadEvents) == PACKET_DISABLE) + if (m_features.packet_support (PACKET_QThreadEvents) == PACKET_DISABLE) return; xsnprintf (rs->buf.data (), size, "QThreadEvents:%x", enable ? 1 : 0); putpkt (rs->buf); getpkt (&rs->buf, 0); - switch (packet_ok (rs->buf, - &remote_protocol_packets[PACKET_QThreadEvents])) + switch (m_features.packet_ok (rs->buf, PACKET_QThreadEvents)) { case PACKET_OK: if (strcmp (rs->buf.data (), "OK") != 0) @@ -14646,10 +14754,10 @@ show_range_stepping (struct ui_file *file, int from_tty, bool remote_target::vcont_r_supported () { - if (packet_support (PACKET_vCont) == PACKET_SUPPORT_UNKNOWN) + if (m_features.packet_support (PACKET_vCont) == PACKET_SUPPORT_UNKNOWN) remote_vcont_probe (); - return (packet_support (PACKET_vCont) == PACKET_ENABLE + return (m_features.packet_support (PACKET_vCont) == PACKET_ENABLE && get_remote_state ()->supports_vCont.r); } @@ -14692,7 +14800,7 @@ show_remote_timeout (struct ui_file *file, int from_tty, bool remote_target::supports_memory_tagging () { - return remote_memory_tagging_p (); + return m_features.remote_memory_tagging_p (); } /* Create the qMemTags packet given ADDRESS, LEN and TYPE. */ @@ -14758,7 +14866,7 @@ remote_target::fetch_memtags (CORE_ADDR address, size_t len, gdb::byte_vector &tags, int type) { /* Make sure the qMemTags packet is supported. */ - if (!remote_memory_tagging_p ()) + if (!m_features.remote_memory_tagging_p ()) gdb_assert_not_reached ("remote fetch_memtags called with packet disabled"); struct remote_state *rs = get_remote_state (); @@ -14778,7 +14886,7 @@ remote_target::store_memtags (CORE_ADDR address, size_t len, const gdb::byte_vector &tags, int type) { /* Make sure the QMemTags packet is supported. */ - if (!remote_memory_tagging_p ()) + if (!m_features.remote_memory_tagging_p ()) gdb_assert_not_reached ("remote store_memtags called with packet disabled"); struct remote_state *rs = get_remote_state (); @@ -14813,7 +14921,7 @@ test_memory_tagging_functions () remote_target remote; struct packet_config *config - = &remote_protocol_packets[PACKET_memory_tagging_feature]; + = &remote.m_features.m_protocol_packets[PACKET_memory_tagging_feature]; scoped_restore restore_memtag_support_ = make_scoped_restore (&config->support); @@ -15028,257 +15136,221 @@ Show the maximum size of the address (in bits) in a memory packet."), NULL, init_all_packet_configs (); - add_packet_config_cmd (&remote_protocol_packets[PACKET_X], - "X", "binary-download", 1); + add_packet_config_cmd (PACKET_X, "X", "binary-download", 1); - add_packet_config_cmd (&remote_protocol_packets[PACKET_vCont], - "vCont", "verbose-resume", 0); + add_packet_config_cmd (PACKET_vCont, "vCont", "verbose-resume", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_QPassSignals], - "QPassSignals", "pass-signals", 0); + add_packet_config_cmd (PACKET_QPassSignals, "QPassSignals", "pass-signals", + 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_QCatchSyscalls], - "QCatchSyscalls", "catch-syscalls", 0); + add_packet_config_cmd (PACKET_QCatchSyscalls, "QCatchSyscalls", + "catch-syscalls", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_QProgramSignals], - "QProgramSignals", "program-signals", 0); + add_packet_config_cmd (PACKET_QProgramSignals, "QProgramSignals", + "program-signals", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_QSetWorkingDir], - "QSetWorkingDir", "set-working-dir", 0); + add_packet_config_cmd (PACKET_QSetWorkingDir, "QSetWorkingDir", + "set-working-dir", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_QStartupWithShell], - "QStartupWithShell", "startup-with-shell", 0); + add_packet_config_cmd (PACKET_QStartupWithShell, "QStartupWithShell", + "startup-with-shell", 0); - add_packet_config_cmd (&remote_protocol_packets - [PACKET_QEnvironmentHexEncoded], - "QEnvironmentHexEncoded", "environment-hex-encoded", - 0); + add_packet_config_cmd (PACKET_QEnvironmentHexEncoded,"QEnvironmentHexEncoded", + "environment-hex-encoded", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_QEnvironmentReset], - "QEnvironmentReset", "environment-reset", - 0); + add_packet_config_cmd (PACKET_QEnvironmentReset, "QEnvironmentReset", + "environment-reset", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_QEnvironmentUnset], - "QEnvironmentUnset", "environment-unset", - 0); + add_packet_config_cmd (PACKET_QEnvironmentUnset, "QEnvironmentUnset", + "environment-unset", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_qSymbol], - "qSymbol", "symbol-lookup", 0); + add_packet_config_cmd (PACKET_qSymbol, "qSymbol", "symbol-lookup", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_P], - "P", "set-register", 1); + add_packet_config_cmd (PACKET_P, "P", "set-register", 1); - add_packet_config_cmd (&remote_protocol_packets[PACKET_p], - "p", "fetch-register", 1); + add_packet_config_cmd (PACKET_p, "p", "fetch-register", 1); - add_packet_config_cmd (&remote_protocol_packets[PACKET_Z0], - "Z0", "software-breakpoint", 0); + add_packet_config_cmd (PACKET_Z0, "Z0", "software-breakpoint", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_Z1], - "Z1", "hardware-breakpoint", 0); + add_packet_config_cmd (PACKET_Z1, "Z1", "hardware-breakpoint", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_Z2], - "Z2", "write-watchpoint", 0); + add_packet_config_cmd (PACKET_Z2, "Z2", "write-watchpoint", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_Z3], - "Z3", "read-watchpoint", 0); + add_packet_config_cmd (PACKET_Z3, "Z3", "read-watchpoint", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_Z4], - "Z4", "access-watchpoint", 0); + add_packet_config_cmd (PACKET_Z4, "Z4", "access-watchpoint", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_qXfer_auxv], - "qXfer:auxv:read", "read-aux-vector", 0); + add_packet_config_cmd (PACKET_qXfer_auxv, "qXfer:auxv:read", + "read-aux-vector", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_qXfer_exec_file], - "qXfer:exec-file:read", "pid-to-exec-file", 0); + add_packet_config_cmd (PACKET_qXfer_exec_file, "qXfer:exec-file:read", + "pid-to-exec-file", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_qXfer_features], + add_packet_config_cmd (PACKET_qXfer_features, "qXfer:features:read", "target-features", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_qXfer_libraries], - "qXfer:libraries:read", "library-info", 0); + add_packet_config_cmd (PACKET_qXfer_libraries, "qXfer:libraries:read", + "library-info", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_qXfer_libraries_svr4], + add_packet_config_cmd (PACKET_qXfer_libraries_svr4, "qXfer:libraries-svr4:read", "library-info-svr4", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_qXfer_memory_map], - "qXfer:memory-map:read", "memory-map", 0); + add_packet_config_cmd (PACKET_qXfer_memory_map, "qXfer:memory-map:read", + "memory-map", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_qXfer_osdata], - "qXfer:osdata:read", "osdata", 0); + add_packet_config_cmd (PACKET_qXfer_osdata, "qXfer:osdata:read", "osdata", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_qXfer_threads], - "qXfer:threads:read", "threads", 0); + add_packet_config_cmd (PACKET_qXfer_threads, "qXfer:threads:read", "threads", + 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_qXfer_siginfo_read], - "qXfer:siginfo:read", "read-siginfo-object", 0); + add_packet_config_cmd (PACKET_qXfer_siginfo_read, "qXfer:siginfo:read", + "read-siginfo-object", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_qXfer_siginfo_write], - "qXfer:siginfo:write", "write-siginfo-object", 0); + add_packet_config_cmd (PACKET_qXfer_siginfo_write, "qXfer:siginfo:write", + "write-siginfo-object", 0); - add_packet_config_cmd - (&remote_protocol_packets[PACKET_qXfer_traceframe_info], - "qXfer:traceframe-info:read", "traceframe-info", 0); + add_packet_config_cmd (PACKET_qXfer_traceframe_info, + "qXfer:traceframe-info:read", "traceframe-info", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_qXfer_uib], - "qXfer:uib:read", "unwind-info-block", 0); + add_packet_config_cmd (PACKET_qXfer_uib, "qXfer:uib:read", + "unwind-info-block", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_qGetTLSAddr], - "qGetTLSAddr", "get-thread-local-storage-address", - 0); + add_packet_config_cmd (PACKET_qGetTLSAddr, "qGetTLSAddr", + "get-thread-local-storage-address", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_qGetTIBAddr], - "qGetTIBAddr", "get-thread-information-block-address", - 0); + add_packet_config_cmd (PACKET_qGetTIBAddr, "qGetTIBAddr", + "get-thread-information-block-address", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_bc], - "bc", "reverse-continue", 0); + add_packet_config_cmd (PACKET_bc, "bc", "reverse-continue", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_bs], - "bs", "reverse-step", 0); + add_packet_config_cmd (PACKET_bs, "bs", "reverse-step", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_qSupported], - "qSupported", "supported-packets", 0); + add_packet_config_cmd (PACKET_qSupported, "qSupported", "supported-packets", + 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_qSearch_memory], - "qSearch:memory", "search-memory", 0); + add_packet_config_cmd (PACKET_qSearch_memory, "qSearch:memory", + "search-memory", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_qTStatus], - "qTStatus", "trace-status", 0); + add_packet_config_cmd (PACKET_qTStatus, "qTStatus", "trace-status", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_vFile_setfs], - "vFile:setfs", "hostio-setfs", 0); + add_packet_config_cmd (PACKET_vFile_setfs, "vFile:setfs", "hostio-setfs", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_vFile_open], - "vFile:open", "hostio-open", 0); + add_packet_config_cmd (PACKET_vFile_open, "vFile:open", "hostio-open", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_vFile_pread], - "vFile:pread", "hostio-pread", 0); + add_packet_config_cmd (PACKET_vFile_pread, "vFile:pread", "hostio-pread", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_vFile_pwrite], - "vFile:pwrite", "hostio-pwrite", 0); + add_packet_config_cmd (PACKET_vFile_pwrite, "vFile:pwrite", "hostio-pwrite", + 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_vFile_close], - "vFile:close", "hostio-close", 0); + add_packet_config_cmd (PACKET_vFile_close, "vFile:close", "hostio-close", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_vFile_unlink], - "vFile:unlink", "hostio-unlink", 0); + add_packet_config_cmd (PACKET_vFile_unlink, "vFile:unlink", "hostio-unlink", + 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_vFile_readlink], - "vFile:readlink", "hostio-readlink", 0); + add_packet_config_cmd (PACKET_vFile_readlink, "vFile:readlink", + "hostio-readlink", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_vFile_fstat], - "vFile:fstat", "hostio-fstat", 0); + add_packet_config_cmd (PACKET_vFile_fstat, "vFile:fstat", "hostio-fstat", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_vAttach], - "vAttach", "attach", 0); + add_packet_config_cmd (PACKET_vAttach, "vAttach", "attach", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_vRun], - "vRun", "run", 0); + add_packet_config_cmd (PACKET_vRun, "vRun", "run", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_QStartNoAckMode], - "QStartNoAckMode", "noack", 0); + add_packet_config_cmd (PACKET_QStartNoAckMode, "QStartNoAckMode", "noack", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_vKill], - "vKill", "kill", 0); + add_packet_config_cmd (PACKET_vKill, "vKill", "kill", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_qAttached], - "qAttached", "query-attached", 0); + add_packet_config_cmd (PACKET_qAttached, "qAttached", "query-attached", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_ConditionalTracepoints], - "ConditionalTracepoints", - "conditional-tracepoints", 0); + add_packet_config_cmd (PACKET_ConditionalTracepoints, + "ConditionalTracepoints", "conditional-tracepoints", + 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_ConditionalBreakpoints], - "ConditionalBreakpoints", - "conditional-breakpoints", 0); + add_packet_config_cmd (PACKET_ConditionalBreakpoints, + "ConditionalBreakpoints", "conditional-breakpoints", + 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_BreakpointCommands], - "BreakpointCommands", + add_packet_config_cmd (PACKET_BreakpointCommands, "BreakpointCommands", "breakpoint-commands", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_FastTracepoints], - "FastTracepoints", "fast-tracepoints", 0); + add_packet_config_cmd (PACKET_FastTracepoints, "FastTracepoints", + "fast-tracepoints", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_TracepointSource], - "TracepointSource", "TracepointSource", 0); + add_packet_config_cmd (PACKET_TracepointSource, "TracepointSource", + "TracepointSource", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_QAllow], - "QAllow", "allow", 0); + add_packet_config_cmd (PACKET_QAllow, "QAllow", "allow", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_StaticTracepoints], - "StaticTracepoints", "static-tracepoints", 0); + add_packet_config_cmd (PACKET_StaticTracepoints, "StaticTracepoints", + "static-tracepoints", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_InstallInTrace], - "InstallInTrace", "install-in-trace", 0); + add_packet_config_cmd (PACKET_InstallInTrace, "InstallInTrace", + "install-in-trace", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_qXfer_statictrace_read], + add_packet_config_cmd (PACKET_qXfer_statictrace_read, "qXfer:statictrace:read", "read-sdata-object", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_qXfer_fdpic], - "qXfer:fdpic:read", "read-fdpic-loadmap", 0); + add_packet_config_cmd (PACKET_qXfer_fdpic, "qXfer:fdpic:read", + "read-fdpic-loadmap", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_QDisableRandomization], - "QDisableRandomization", "disable-randomization", 0); + add_packet_config_cmd (PACKET_QDisableRandomization, "QDisableRandomization", + "disable-randomization", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_QAgent], - "QAgent", "agent", 0); + add_packet_config_cmd (PACKET_QAgent, "QAgent", "agent", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_QTBuffer_size], - "QTBuffer:size", "trace-buffer-size", 0); + add_packet_config_cmd (PACKET_QTBuffer_size, "QTBuffer:size", + "trace-buffer-size", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_Qbtrace_off], - "Qbtrace:off", "disable-btrace", 0); + add_packet_config_cmd (PACKET_Qbtrace_off, "Qbtrace:off", "disable-btrace", + 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_Qbtrace_bts], - "Qbtrace:bts", "enable-btrace-bts", 0); + add_packet_config_cmd (PACKET_Qbtrace_bts, "Qbtrace:bts", "enable-btrace-bts", + 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_Qbtrace_pt], - "Qbtrace:pt", "enable-btrace-pt", 0); + add_packet_config_cmd (PACKET_Qbtrace_pt, "Qbtrace:pt", "enable-btrace-pt", + 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_qXfer_btrace], - "qXfer:btrace", "read-btrace", 0); + add_packet_config_cmd (PACKET_qXfer_btrace, "qXfer:btrace", "read-btrace", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_qXfer_btrace_conf], - "qXfer:btrace-conf", "read-btrace-conf", 0); + add_packet_config_cmd (PACKET_qXfer_btrace_conf, "qXfer:btrace-conf", + "read-btrace-conf", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_Qbtrace_conf_bts_size], - "Qbtrace-conf:bts:size", "btrace-conf-bts-size", 0); + add_packet_config_cmd (PACKET_Qbtrace_conf_bts_size, "Qbtrace-conf:bts:size", + "btrace-conf-bts-size", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_multiprocess_feature], - "multiprocess-feature", "multiprocess-feature", 0); + add_packet_config_cmd (PACKET_multiprocess_feature, "multiprocess-feature", + "multiprocess-feature", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_swbreak_feature], - "swbreak-feature", "swbreak-feature", 0); + add_packet_config_cmd (PACKET_swbreak_feature, "swbreak-feature", + "swbreak-feature", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_hwbreak_feature], - "hwbreak-feature", "hwbreak-feature", 0); + add_packet_config_cmd (PACKET_hwbreak_feature, "hwbreak-feature", + "hwbreak-feature", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_fork_event_feature], - "fork-event-feature", "fork-event-feature", 0); + add_packet_config_cmd (PACKET_fork_event_feature, "fork-event-feature", + "fork-event-feature", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_vfork_event_feature], - "vfork-event-feature", "vfork-event-feature", 0); + add_packet_config_cmd (PACKET_vfork_event_feature, "vfork-event-feature", + "vfork-event-feature", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_Qbtrace_conf_pt_size], - "Qbtrace-conf:pt:size", "btrace-conf-pt-size", 0); + add_packet_config_cmd (PACKET_Qbtrace_conf_pt_size, "Qbtrace-conf:pt:size", + "btrace-conf-pt-size", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_vContSupported], - "vContSupported", "verbose-resume-supported", 0); + add_packet_config_cmd (PACKET_vContSupported, "vContSupported", + "verbose-resume-supported", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_exec_event_feature], - "exec-event-feature", "exec-event-feature", 0); + add_packet_config_cmd (PACKET_exec_event_feature, "exec-event-feature", + "exec-event-feature", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_vCtrlC], - "vCtrlC", "ctrl-c", 0); + add_packet_config_cmd (PACKET_vCtrlC, "vCtrlC", "ctrl-c", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_QThreadEvents], - "QThreadEvents", "thread-events", 0); + add_packet_config_cmd (PACKET_QThreadEvents, "QThreadEvents", "thread-events", + 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_no_resumed], - "N stop reply", "no-resumed-stop-reply", 0); + add_packet_config_cmd (PACKET_no_resumed, "N stop reply", + "no-resumed-stop-reply", 0); - add_packet_config_cmd (&remote_protocol_packets[PACKET_memory_tagging_feature], + add_packet_config_cmd (PACKET_memory_tagging_feature, "memory-tagging-feature", "memory-tagging-feature", 0); /* Assert that we've registered "set remote foo-packet" commands @@ -15311,7 +15383,7 @@ Show the maximum size of the address (in bits) in a memory packet."), NULL, /* This catches both forgetting to add a config command, and forgetting to remove a packet from the exception list. */ - gdb_assert (excepted == (remote_protocol_packets[i].name == NULL)); + gdb_assert (excepted == (packets_descriptions[i].name == NULL)); } } diff --git a/gdb/testsuite/gdb.base/cond-eval-mode.exp b/gdb/testsuite/gdb.base/cond-eval-mode.exp index 16fb067..49f9fc7 100644 --- a/gdb/testsuite/gdb.base/cond-eval-mode.exp +++ b/gdb/testsuite/gdb.base/cond-eval-mode.exp @@ -59,13 +59,18 @@ gdb_test_multiple $test_target $test_target { # evaluation. Now make sure we can force-disable the # ConditionalBreakpoints RSP feature. if [gdb_is_target_remote] { - gdb_test_no_output "set remote conditional-breakpoints-packet off" + gdb_test \ + "set remote conditional-breakpoints-packet off" \ + "Support for the 'ConditionalBreakpoints' packet on the current remote target is set to \"off\"." gdb_test $test_target "$warning" \ "set breakpoint condition-evaluation target, with support disabled" # Confirm we can re-enable it. - gdb_test_no_output "set remote conditional-breakpoints-packet on" + gdb_test \ + "set remote conditional-breakpoints-packet on" \ + "Support for the 'ConditionalBreakpoints' packet on the current remote target is set to \"on\"." + gdb_test_no_output $test_target "restore $test_target" } diff --git a/gdb/testsuite/gdb.base/dprintf.exp b/gdb/testsuite/gdb.base/dprintf.exp index 99cb505..2d838e7 100644 --- a/gdb/testsuite/gdb.base/dprintf.exp +++ b/gdb/testsuite/gdb.base/dprintf.exp @@ -214,7 +214,10 @@ gdb_test "set dprintf-style foobar" "Undefined item: \"foobar\"." \ # as expected. dprintf relies on support for target-side breakpoint # commands --- use it as proxy. if [gdb_is_target_remote] { - gdb_test_no_output "set remote breakpoint-commands-packet off" + gdb_test \ + "set remote breakpoint-commands-packet off" \ + "Support for the 'BreakpointCommands' packet on the current remote target is set to \"off\"." + gdb_test "set dprintf-style agent" \ "warning: Target cannot run dprintf commands.*" \ "set dprintf-style agent, with feature disabled" diff --git a/gdb/testsuite/gdb.base/find-unmapped.exp b/gdb/testsuite/gdb.base/find-unmapped.exp index 1cf1152..dd747d5 100644 --- a/gdb/testsuite/gdb.base/find-unmapped.exp +++ b/gdb/testsuite/gdb.base/find-unmapped.exp @@ -78,7 +78,10 @@ if {[target_info gdb_protocol] == "remote" || [target_info gdb_protocol] == "extended-remote"} { test_not_found 0 with_test_prefix "search-memory-packet off" { - gdb_test_no_output "set remote search-memory-packet off" + gdb_test \ + "set remote search-memory-packet off" \ + "Support for the 'qSearch:memory' packet on the current remote target is set to \"off\"." + test_not_found 0 } } else { diff --git a/gdb/testsuite/gdb.base/hbreak-in-shr-unsupported.exp b/gdb/testsuite/gdb.base/hbreak-in-shr-unsupported.exp index cf4083b..e0c29fb 100644 --- a/gdb/testsuite/gdb.base/hbreak-in-shr-unsupported.exp +++ b/gdb/testsuite/gdb.base/hbreak-in-shr-unsupported.exp @@ -52,7 +52,9 @@ gdb_test_no_output "set breakpoint always-inserted on" # Force-disable Z1 packets, in case the target actually supports # these. if {$is_target_remote} { - gdb_test_no_output "set remote Z-packet off" + gdb_test \ + "set remote Z-packet off" \ + "Use of Z packets on the current remote target is set to \"off\"." } # Probe for hw breakpoints support. With Z packets disabled, this diff --git a/gdb/testsuite/gdb.base/remote.exp b/gdb/testsuite/gdb.base/remote.exp index a1c9973..b9b05de 100644 --- a/gdb/testsuite/gdb.base/remote.exp +++ b/gdb/testsuite/gdb.base/remote.exp @@ -198,7 +198,7 @@ gdb_test_no_output "set remote hardware-breakpoint-limit 2147483647" # Check the X/P/p alias commands display the correct packet names. foreach pkt {X P p} { - gdb_test "show remote ${pkt}-packet" "Support for the `${pkt}' packet is.*" + gdb_test "show remote ${pkt}-packet" "Support for the '${pkt}' packet on the current remote target is .*" } gdb_exit diff --git a/gdb/testsuite/gdb.multi/multi-target-info-inferiors.exp b/gdb/testsuite/gdb.multi/multi-target-info-inferiors.exp index 487d209..0dffde2 100644 --- a/gdb/testsuite/gdb.multi/multi-target-info-inferiors.exp +++ b/gdb/testsuite/gdb.multi/multi-target-info-inferiors.exp @@ -30,15 +30,13 @@ set run_python_tests [allow_python_tests] # indicates whether the multi-process feature of remote targets is # turned off or on. proc test_info_inferiors {multi_process} { - setup "off" + + setup "off" $multi_process if { $::run_python_tests } { gdb_test_no_output "source ${::remote_python_file}" "load python file" } - gdb_test_no_output \ - "set remote multiprocess-feature-packet $multi_process" - # Get the description for inferior INF for when the current # inferior id is CURRENT. proc inf_desc {inf current} { diff --git a/gdb/testsuite/gdb.multi/multi-target.exp.tcl b/gdb/testsuite/gdb.multi/multi-target.exp.tcl index 2356b6c..1c03834 100644 --- a/gdb/testsuite/gdb.multi/multi-target.exp.tcl +++ b/gdb/testsuite/gdb.multi/multi-target.exp.tcl @@ -104,7 +104,7 @@ proc cleanup_gdbservers { } { # Return true on success, false otherwise. -proc setup {non-stop} { +proc setup {non-stop {multi_process ""}} { global gcorefile gcore_created global binfile @@ -123,6 +123,12 @@ proc setup {non-stop} { gdb_test_no_output "set non-stop ${non-stop}" + if {${multi_process} ne ""} then { + gdb_test \ + "set remote multiprocess-feature-packet $multi_process" \ + "Support for the 'multiprocess-feature' packet on future remote targets is set to \"${multi_process}\"." + } + if ![runto all_started] then { return 0 } diff --git a/gdb/testsuite/gdb.server/connect-without-multi-process.exp b/gdb/testsuite/gdb.server/connect-without-multi-process.exp index fcd64c9..4591371 100644 --- a/gdb/testsuite/gdb.server/connect-without-multi-process.exp +++ b/gdb/testsuite/gdb.server/connect-without-multi-process.exp @@ -45,7 +45,9 @@ proc do_test {multiprocess} { # extended-remote board, therefore already connected. gdb_test "disconnect" ".*" - gdb_test_no_output "set remote multiprocess-feature $multiprocess" + gdb_test \ + "set remote multiprocess-feature $multiprocess" \ + "Support for the 'multiprocess-feature' packet on future remote targets is set to \"$multiprocess\"." set res [gdbserver_spawn ""] set gdbserver_protocol [lindex $res 0] diff --git a/gdb/testsuite/gdb.server/exit-multiple-threads.exp b/gdb/testsuite/gdb.server/exit-multiple-threads.exp index 46239e3..87867f0 100644 --- a/gdb/testsuite/gdb.server/exit-multiple-threads.exp +++ b/gdb/testsuite/gdb.server/exit-multiple-threads.exp @@ -54,9 +54,14 @@ proc prepare_for_test { executable disable_multi_process } { # Disable XML-based thread listing, and possible the multi-process # extensions. - gdb_test_no_output "set remote threads-packet off" + gdb_test \ + "set remote threads-packet off" \ + "Support for the 'qXfer:threads:read' packet on future remote targets is set to \"off\"." + if { $disable_multi_process } { - gdb_test_no_output "set remote multiprocess-feature-packet off" + gdb_test \ + "set remote multiprocess-feature-packet off" \ + "Support for the 'multiprocess-feature' packet on future remote targets is set to \"off\"." } # Start gdbserver and connect. diff --git a/gdb/testsuite/gdb.server/ext-restart.exp b/gdb/testsuite/gdb.server/ext-restart.exp index 5b6aa70..a9e84ff 100644 --- a/gdb/testsuite/gdb.server/ext-restart.exp +++ b/gdb/testsuite/gdb.server/ext-restart.exp @@ -51,7 +51,10 @@ gdb_test "run" "Breakpoint.* main .*" "run to main" with_test_prefix "restart" { # Disable vRun packet and clear remote exec-file, so that GDB will # use R packet to restart the process. - gdb_test_no_output "set remote run-packet off" + gdb_test \ + "set remote run-packet off" \ + "Support for the 'vRun' packet on the current remote target is set to \"off\"." + gdb_test_no_output "set remote exec-file" set test "run to main" diff --git a/gdb/testsuite/gdb.server/ext-wrapper.exp b/gdb/testsuite/gdb.server/ext-wrapper.exp index 2fe601a..316b742 100644 --- a/gdb/testsuite/gdb.server/ext-wrapper.exp +++ b/gdb/testsuite/gdb.server/ext-wrapper.exp @@ -55,7 +55,10 @@ gdb_test "print d" "\\$${decimal} = ${hex} \"1\".*" with_test_prefix "restart" { # Disable vRun packet and clear remote exec-file, so that GDB will # use R packet to restart the process. - gdb_test_no_output "set remote run-packet off" + gdb_test \ + "set remote run-packet off" \ + "Support for the 'vRun' packet on the current remote target is set to \"off\"." + gdb_test_no_output "set remote exec-file" set test "run to marker" gdb_test_multiple "run" $test { diff --git a/gdb/testsuite/gdb.server/server-exec-info.exp b/gdb/testsuite/gdb.server/server-exec-info.exp index 6bee4bf..030ca64 100644 --- a/gdb/testsuite/gdb.server/server-exec-info.exp +++ b/gdb/testsuite/gdb.server/server-exec-info.exp @@ -29,7 +29,10 @@ if [prepare_for_testing "failed to prepare" ${testfile} ${srcfile}] { # extended-remote board, therefore already connected. gdb_test "disconnect" ".*" -gdb_test_no_output "set remote pid-to-exec-file-packet off" +gdb_test \ + "set remote pid-to-exec-file-packet off" \ + "Support for the 'qXfer:exec-file:read' packet on future remote targets is set to \"off\"." + gdb_test "file" ".*" "file" \ {Discard symbol table from `.*'\? \(y or n\) } "y" gdbserver_run "" diff --git a/gdb/testsuite/gdb.server/server-kill.exp b/gdb/testsuite/gdb.server/server-kill.exp index b757369..5622b27 100644 --- a/gdb/testsuite/gdb.server/server-kill.exp +++ b/gdb/testsuite/gdb.server/server-kill.exp @@ -114,7 +114,9 @@ proc_with_prefix test_tstatus {} { # Enable trace status packet which is disabled after the # connection if the remote target doesn't support tracepoint at # all. Otherwise, no RSP packet is sent out. - gdb_test_no_output "set remote trace-status-packet on" + gdb_test \ + "set remote trace-status-packet on" \ + "Support for the 'qTStatus' packet on the current remote target is set to \"on\"." # Force GDB to talk with GDBserver, so that we can get the # "connection closed" error. diff --git a/gdb/testsuite/gdb.server/stop-reply-no-thread-multi.exp b/gdb/testsuite/gdb.server/stop-reply-no-thread-multi.exp index 20d45ba..042c285 100644 --- a/gdb/testsuite/gdb.server/stop-reply-no-thread-multi.exp +++ b/gdb/testsuite/gdb.server/stop-reply-no-thread-multi.exp @@ -68,8 +68,12 @@ proc run_test { target_non_stop disable_feature } { set gdbserver_gdbport [lindex $res 1] # Disable XML-based thread listing, and multi-process extensions. - gdb_test_no_output "set remote threads-packet off" - gdb_test_no_output "set remote multiprocess-feature-packet off" + gdb_test \ + "set remote threads-packet off" \ + "Support for the 'qXfer:threads:read' packet on future remote targets is set to \"off\"." + gdb_test \ + "set remote multiprocess-feature-packet off" \ + "Support for the 'multiprocess-feature' packet on future remote targets is set to \"off\"." set res [gdb_target_cmd $gdbserver_protocol $gdbserver_gdbport] if ![gdb_assert {$res == 0} "connect"] { diff --git a/gdb/testsuite/gdb.server/stop-reply-no-thread.exp b/gdb/testsuite/gdb.server/stop-reply-no-thread.exp index 848ada1..3ef512b 100644 --- a/gdb/testsuite/gdb.server/stop-reply-no-thread.exp +++ b/gdb/testsuite/gdb.server/stop-reply-no-thread.exp @@ -56,8 +56,13 @@ proc run_test { disable_feature target_nonstop } { set gdbserver_gdbport [lindex $res 1] # Disable XML-based thread listing, and multi-process extensions. - gdb_test_no_output "set remote threads-packet off" - gdb_test_no_output "set remote multiprocess-feature-packet off" + gdb_test \ + "set remote threads-packet off" \ + "Support for the 'qXfer:threads:read' packet on future remote targets is set to \"off\"." + + gdb_test \ + "set remote multiprocess-feature-packet off" \ + "Support for the 'multiprocess-feature' packet on future remote targets is set to \"off\"." # Set target-nonstop mode. gdb_test_no_output "maint set target-non-stop ${target_nonstop}" diff --git a/gdb/testsuite/gdb.threads/process-dies-while-handling-bp.exp b/gdb/testsuite/gdb.threads/process-dies-while-handling-bp.exp index 59416d4..23f4c50 100644 --- a/gdb/testsuite/gdb.threads/process-dies-while-handling-bp.exp +++ b/gdb/testsuite/gdb.threads/process-dies-while-handling-bp.exp @@ -58,15 +58,18 @@ proc do_test { non_stop cond_bp_target } { if {!$cond_bp_target} { # Leaving breakpoint evaluation to GDB exposes failures # similar to native debugging. - gdb_test_no_output "set remote conditional-breakpoints-packet off" + gdb_test \ + "set remote conditional-breakpoints-packet off" \ + "Support for the 'ConditionalBreakpoints' packet on the current remote target is set to \"off\"." + set should_kfail 1 } else { set test "show remote conditional-breakpoints-packet" gdb_test_multiple $test $test { - -re "currently enabled\.\r\n$gdb_prompt $" { + -re "\, currently enabled.*\r\n$gdb_prompt $" { pass $test } - -re "currently disabled\.\r\n$gdb_prompt $" { + -re "\, currently disabled.*\r\n$gdb_prompt $" { unsupported "no support for target-side conditional breakpoints" return } diff --git a/gdb/testsuite/gdb.trace/change-loc.exp b/gdb/testsuite/gdb.trace/change-loc.exp index b77e283..1315a6d 100644 --- a/gdb/testsuite/gdb.trace/change-loc.exp +++ b/gdb/testsuite/gdb.trace/change-loc.exp @@ -313,7 +313,9 @@ proc tracepoint_install_in_trace_disabled { trace_type } { gdb_test_no_output "tstart" # Force-disable the InstallInTrace RSP feature. - gdb_test_no_output "set remote install-in-trace-packet off" + gdb_test \ + "set remote install-in-trace-packet off" \ + "Support for the 'InstallInTrace' packet on the current remote target is set to \"off\"." # Set a tracepoint while a trace experiment is ongoing. gdb_test "${trace_type} set_tracepoint" \ diff --git a/gdb/testsuite/gdb.trace/qtro.exp b/gdb/testsuite/gdb.trace/qtro.exp index c15028d..98a4549 100644 --- a/gdb/testsuite/gdb.trace/qtro.exp +++ b/gdb/testsuite/gdb.trace/qtro.exp @@ -79,7 +79,7 @@ prepare_for_trace_disassembly set traceframe_info_supported -1 set test "probe for traceframe-info support" gdb_test_multiple "show remote traceframe-info-packet" $test { - -re ".*Support for .* is auto-detected, currently (\[a-z\]*).*$gdb_prompt $" { + -re ".*Support for .* is \"auto\", currently (\[a-z\]*).*$gdb_prompt $" { set status $expect_out(1,string) if { $status == "enabled" } { @@ -110,7 +110,9 @@ foreach tfinfo { auto off } { clean_restart $testfile runto_main - gdb_test_no_output "set remote traceframe-info-packet $tfinfo" + gdb_test \ + "set remote traceframe-info-packet $tfinfo" \ + "Support for the 'qXfer:traceframe-info:read' packet on the current remote target is set to *.*$tfinfo*.*" prepare_for_trace_disassembly |