/* The remote target. */
+static const char remote_doc[] = N_("\
+Use a remote computer via a serial line, using a gdb-specific protocol.\n\
+Specify the serial device it is connected to\n\
+(e.g. /dev/ttyS0, /dev/ttya, COM1, etc.).");
+
+static const target_info remote_target_info = {
+ "remote",
+ N_("Remote serial target in gdb-specific protocol"),
+ remote_doc
+};
+
class remote_target : public target_ops
{
public:
to_stratum = process_stratum;
}
- const char *shortname () override
- { return "remote"; }
-
- const char *longname () override
- { return _("Remote serial target in gdb-specific protocol"); }
-
- const char *doc () override
- {
- return _("\
-Use a remote computer via a serial line, using a gdb-specific protocol.\n\
-Specify the serial device it is connected to\n\
-(e.g. /dev/ttyS0, /dev/ttya, COM1, etc.).");
- }
+ const target_info &info () const override
+ { return remote_target_info; }
thread_control_capabilities get_thread_control_capabilities () override
{ return tc_schedlock; }
- void open (const char *, int) override;
+ /* Open a remote connection. */
+ static void open (const char *, int);
+
void close () override;
void detach (inferior *, int) override;
enum exec_direction_kind execution_direction () override;
protected:
- void open_1 (const char *name, int from_tty, int extended_p);
+ static void open_1 (const char *name, int from_tty, int extended_p);
void start_remote (int from_tty, int extended_p);
};
+static const target_info extended_remote_target_info = {
+ "extended-remote",
+ N_("Extended remote serial target in gdb-specific protocol"),
+ remote_doc
+};
+
/* Set up the extended remote target by extending the standard remote
target and adding to it. */
class extended_remote_target final : public remote_target
{
public:
- const char *shortname () override
- { return "extended-remote"; }
-
- const char *longname () override
- { return _("Extended remote serial target in gdb-specific protocol"); }
+ const target_info &info () const override
+ { return extended_remote_target_info; }
- void open (const char *, int) override;
+ /* Open an extended-remote connection. */
+ static void open (const char *, int);
bool can_create_inferior () override { return true; }
void create_inferior (const char *, const std::string &,
#endif
}
-static char *
-remote_query_supported_append (char *msg, const char *append)
+static void
+remote_query_supported_append (std::string *msg, const char *append)
{
- if (msg)
- return reconcat (msg, msg, ";", append, (char *) NULL);
- else
- return xstrdup (append);
+ if (!msg->empty ())
+ msg->append (";");
+ msg->append (append);
}
static void
rs->buf[0] = 0;
if (packet_support (PACKET_qSupported) != PACKET_DISABLE)
{
- char *q = NULL;
- struct cleanup *old_chain = make_cleanup (free_current_contents, &q);
+ std::string q;
if (packet_set_cmd_state (PACKET_multiprocess_feature) != AUTO_BOOLEAN_FALSE)
- q = remote_query_supported_append (q, "multiprocess+");
+ remote_query_supported_append (&q, "multiprocess+");
if (packet_set_cmd_state (PACKET_swbreak_feature) != AUTO_BOOLEAN_FALSE)
- q = remote_query_supported_append (q, "swbreak+");
+ remote_query_supported_append (&q, "swbreak+");
if (packet_set_cmd_state (PACKET_hwbreak_feature) != AUTO_BOOLEAN_FALSE)
- q = remote_query_supported_append (q, "hwbreak+");
+ remote_query_supported_append (&q, "hwbreak+");
- q = remote_query_supported_append (q, "qRelocInsn+");
+ remote_query_supported_append (&q, "qRelocInsn+");
if (packet_set_cmd_state (PACKET_fork_event_feature)
!= AUTO_BOOLEAN_FALSE)
- q = remote_query_supported_append (q, "fork-events+");
+ remote_query_supported_append (&q, "fork-events+");
if (packet_set_cmd_state (PACKET_vfork_event_feature)
!= AUTO_BOOLEAN_FALSE)
- q = remote_query_supported_append (q, "vfork-events+");
+ remote_query_supported_append (&q, "vfork-events+");
if (packet_set_cmd_state (PACKET_exec_event_feature)
!= AUTO_BOOLEAN_FALSE)
- q = remote_query_supported_append (q, "exec-events+");
+ remote_query_supported_append (&q, "exec-events+");
if (packet_set_cmd_state (PACKET_vContSupported) != AUTO_BOOLEAN_FALSE)
- q = remote_query_supported_append (q, "vContSupported+");
+ remote_query_supported_append (&q, "vContSupported+");
if (packet_set_cmd_state (PACKET_QThreadEvents) != AUTO_BOOLEAN_FALSE)
- q = remote_query_supported_append (q, "QThreadEvents+");
+ remote_query_supported_append (&q, "QThreadEvents+");
if (packet_set_cmd_state (PACKET_no_resumed) != AUTO_BOOLEAN_FALSE)
- q = remote_query_supported_append (q, "no-resumed+");
+ remote_query_supported_append (&q, "no-resumed+");
/* 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)
- q = remote_query_supported_append (q, remote_support_xml);
+ remote_query_supported_append (&q, remote_support_xml);
- q = reconcat (q, "qSupported:", q, (char *) NULL);
- putpkt (q);
-
- do_cleanups (old_chain);
+ q = "qSupported:" + q;
+ putpkt (q.c_str ());
getpkt (&rs->buf, &rs->buf_size, 0);
puts_filtered (name);
puts_filtered ("\n");
}
- push_target (this); /* Switch to using remote target now. */
+
+ remote_target *target
+ = extended_p ? &extended_remote_ops : &remote_ops;
+ push_target (target); /* Switch to using remote target now. */
/* Register extra event sources in the event loop. */
remote_async_inferior_event_token
TRY
{
- start_remote (from_tty, extended_p);
+ target->start_remote (from_tty, extended_p);
}
CATCH (ex, RETURN_MASK_ALL)
{
putpkt (buf);
break;
}
- /* else fallthrough */
+ /* fallthrough */
default:
warning (_("Invalid remote reply: %s"), buf);
break;
if (cmd->control_type == while_control
|| cmd->control_type == while_stepping_control)
{
- remote_download_command_source (num, addr, *cmd->body_list);
+ remote_download_command_source (num, addr, cmd->body_list_0.get ());
QUIT; /* Allow user to bail out with ^C. */
strcpy (rs->buf, "QTDPsrc:");
time. */
remote_state = new_remote_state ();
- add_target (&remote_ops);
- add_target (&extended_remote_ops);
+ add_target (remote_target_info, remote_target::open);
+ add_target (extended_remote_target_info, extended_remote_target::open);
/* Hook into new objfile notification. */
gdb::observers::new_objfile.attach (remote_new_objfile);