Simple -Wshadow=local fixes
[deliverable/binutils-gdb.git] / gdb / remote.c
index 72254dba311b4920dda4787e98f9af39c7d02220..724f41cf71e291ebf0badf33982713e29c75cc87 100644 (file)
@@ -84,6 +84,320 @@ 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.).");
 
+#define OPAQUETHREADBYTES 8
+
+/* a 64 bit opaque identifier */
+typedef unsigned char threadref[OPAQUETHREADBYTES];
+
+struct gdb_ext_thread_info;
+struct threads_listing_context;
+typedef int (*rmt_thread_action) (threadref *ref, void *context);
+struct protocol_feature;
+struct packet_reg;
+
+struct stop_reply;
+static void stop_reply_xfree (struct stop_reply *);
+
+struct stop_reply_deleter
+{
+  void operator() (stop_reply *r) const
+  {
+    stop_reply_xfree (r);
+  }
+};
+
+typedef std::unique_ptr<stop_reply, stop_reply_deleter> stop_reply_up;
+
+/* Generic configuration support for packets the stub optionally
+   supports.  Allows the user to specify the use of the packet as well
+   as allowing GDB to auto-detect support in the remote stub.  */
+
+enum packet_support
+  {
+    PACKET_SUPPORT_UNKNOWN = 0,
+    PACKET_ENABLE,
+    PACKET_DISABLE
+  };
+
+/* Analyze a packet's return value and update the packet config
+   accordingly.  */
+
+enum packet_result
+{
+  PACKET_ERROR,
+  PACKET_OK,
+  PACKET_UNKNOWN
+};
+
+struct threads_listing_context;
+
+/* Stub vCont actions support.
+
+   Each field is a boolean flag indicating whether the stub reports
+   support for the corresponding action.  */
+
+struct vCont_action_support
+{
+  /* vCont;t */
+  bool t = false;
+
+  /* vCont;r */
+  bool r = false;
+
+  /* vCont;s */
+  bool s = false;
+
+  /* vCont;S */
+  bool S = false;
+};
+
+/* About this many threadisds fit in a packet.  */
+
+#define MAXTHREADLISTRESULTS 32
+
+/* Data for the vFile:pread readahead cache.  */
+
+struct readahead_cache
+{
+  /* Invalidate the readahead cache.  */
+  void invalidate ();
+
+  /* Invalidate the readahead cache if it is holding data for FD.  */
+  void invalidate_fd (int fd);
+
+  /* Serve pread from the readahead cache.  Returns number of bytes
+     read, or 0 if the request can't be served from the cache.  */
+  int pread (int fd, gdb_byte *read_buf, size_t len, ULONGEST offset);
+
+  /* The file descriptor for the file that is being cached.  -1 if the
+     cache is invalid.  */
+  int fd = -1;
+
+  /* The offset into the file that the cache buffer corresponds
+     to.  */
+  ULONGEST offset = 0;
+
+  /* The buffer holding the cache contents.  */
+  gdb_byte *buf = nullptr;
+  /* The buffer's size.  We try to read as much as fits into a packet
+     at a time.  */
+  size_t bufsize = 0;
+
+  /* Cache hit and miss counters.  */
+  ULONGEST hit_count = 0;
+  ULONGEST miss_count = 0;
+};
+
+/* Description of the remote protocol for a given architecture.  */
+
+struct packet_reg
+{
+  long offset; /* Offset into G packet.  */
+  long regnum; /* GDB's internal register number.  */
+  LONGEST pnum; /* Remote protocol register number.  */
+  int in_g_packet; /* Always part of G packet.  */
+  /* long size in bytes;  == register_size (target_gdbarch (), regnum);
+     at present.  */
+  /* char *name; == gdbarch_register_name (target_gdbarch (), regnum);
+     at present.  */
+};
+
+struct remote_arch_state
+{
+  explicit remote_arch_state (struct gdbarch *gdbarch);
+
+  /* Description of the remote protocol registers.  */
+  long sizeof_g_packet;
+
+  /* Description of the remote protocol registers indexed by REGNUM
+     (making an array gdbarch_num_regs in size).  */
+  std::unique_ptr<packet_reg[]> regs;
+
+  /* This is the size (in chars) of the first response to the ``g''
+     packet.  It is used as a heuristic when determining the maximum
+     size of memory-read and memory-write packets.  A target will
+     typically only reserve a buffer large enough to hold the ``g''
+     packet.  The size does not include packet overhead (headers and
+     trailers).  */
+  long actual_register_packet_size;
+
+  /* This is the maximum size (in chars) of a non read/write packet.
+     It is also used as a cap on the size of read/write packets.  */
+  long remote_packet_size;
+};
+
+/* Description of the remote protocol state for the currently
+   connected target.  This is per-target state, and independent of the
+   selected architecture.  */
+
+class remote_state
+{
+public:
+
+  remote_state ();
+  ~remote_state ();
+
+  /* Get the remote arch state for GDBARCH.  */
+  struct remote_arch_state *get_remote_arch_state (struct gdbarch *gdbarch);
+
+public: /* data */
+
+  /* A buffer to use for incoming packets, and its current size.  The
+     buffer is grown dynamically for larger incoming packets.
+     Outgoing packets may also be constructed in this buffer.
+     BUF_SIZE is always at least REMOTE_PACKET_SIZE;
+     REMOTE_PACKET_SIZE should be used to limit the length of outgoing
+     packets.  */
+  char *buf;
+  long buf_size;
+
+  /* True if we're going through initial connection setup (finding out
+     about the remote side's threads, relocating symbols, etc.).  */
+  bool starting_up = false;
+
+  /* If we negotiated packet size explicitly (and thus can bypass
+     heuristics for the largest packet size that will not overflow
+     a buffer in the stub), this will be set to that packet size.
+     Otherwise zero, meaning to use the guessed size.  */
+  long explicit_packet_size = 0;
+
+  /* remote_wait is normally called when the target is running and
+     waits for a stop reply packet.  But sometimes we need to call it
+     when the target is already stopped.  We can send a "?" packet
+     and have remote_wait read the response.  Or, if we already have
+     the response, we can stash it in BUF and tell remote_wait to
+     skip calling getpkt.  This flag is set when BUF contains a
+     stop reply packet and the target is not waiting.  */
+  int cached_wait_status = 0;
+
+  /* True, if in no ack mode.  That is, neither GDB nor the stub will
+     expect acks from each other.  The connection is assumed to be
+     reliable.  */
+  bool noack_mode = false;
+
+  /* True if we're connected in extended remote mode.  */
+  bool extended = false;
+
+  /* True if we resumed the target and we're waiting for the target to
+     stop.  In the mean time, we can't start another command/query.
+     The remote server wouldn't be ready to process it, so we'd
+     timeout waiting for a reply that would never come and eventually
+     we'd close the connection.  This can happen in asynchronous mode
+     because we allow GDB commands while the target is running.  */
+  bool waiting_for_stop_reply = false;
+
+  /* The status of the stub support for the various vCont actions.  */
+  vCont_action_support supports_vCont;
+
+  /* True if the user has pressed Ctrl-C, but the target hasn't
+     responded to that.  */
+  bool ctrlc_pending_p = false;
+
+  /* True if we saw a Ctrl-C while reading or writing from/to the
+     remote descriptor.  At that point it is not safe to send a remote
+     interrupt packet, so we instead remember we saw the Ctrl-C and
+     process it once we're done with sending/receiving the current
+     packet, which should be shortly.  If however that takes too long,
+     and the user presses Ctrl-C again, we offer to disconnect.  */
+  bool got_ctrlc_during_io = false;
+
+  /* Descriptor for I/O to remote machine.  Initialize it to NULL so that
+     remote_open knows that we don't have a file open when the program
+     starts.  */
+  struct serial *remote_desc = nullptr;
+
+  /* These are the threads which we last sent to the remote system.  The
+     TID member will be -1 for all or -2 for not sent yet.  */
+  ptid_t general_thread = null_ptid;
+  ptid_t continue_thread = null_ptid;
+
+  /* This is the traceframe which we last selected on the remote system.
+     It will be -1 if no traceframe is selected.  */
+  int remote_traceframe_number = -1;
+
+  char *last_pass_packet = nullptr;
+
+  /* The last QProgramSignals packet sent to the target.  We bypass
+     sending a new program signals list down to the target if the new
+     packet is exactly the same as the last we sent.  IOW, we only let
+     the target know about program signals list changes.  */
+  char *last_program_signals_packet = nullptr;
+
+  gdb_signal last_sent_signal = GDB_SIGNAL_0;
+
+  bool last_sent_step = false;
+
+  /* The execution direction of the last resume we got.  */
+  exec_direction_kind last_resume_exec_dir = EXEC_FORWARD;
+
+  char *finished_object = nullptr;
+  char *finished_annex = nullptr;
+  ULONGEST finished_offset = 0;
+
+  /* Should we try the 'ThreadInfo' query packet?
+
+     This variable (NOT available to the user: auto-detect only!)
+     determines whether GDB will use the new, simpler "ThreadInfo"
+     query or the older, more complex syntax for thread queries.
+     This is an auto-detect variable (set to true at each connect,
+     and set to false when the target fails to recognize it).  */
+  bool use_threadinfo_query = false;
+  bool use_threadextra_query = false;
+
+  threadref echo_nextthread {};
+  threadref nextthread {};
+  threadref resultthreadlist[MAXTHREADLISTRESULTS] {};
+
+  /* The state of remote notification.  */
+  struct remote_notif_state *notif_state = nullptr;
+
+  /* The branch trace configuration.  */
+  struct btrace_config btrace_config {};
+
+  /* The argument to the last "vFile:setfs:" packet we sent, used
+     to avoid sending repeated unnecessary "vFile:setfs:" packets.
+     Initialized to -1 to indicate that no "vFile:setfs:" packet
+     has yet been sent.  */
+  int fs_pid = -1;
+
+  /* A readahead cache for vFile:pread.  Often, reading a binary
+     involves a sequence of small reads.  E.g., when parsing an ELF
+     file.  A readahead cache helps mostly the case of remote
+     debugging on a connection with higher latency, due to the
+     request/reply nature of the RSP.  We only cache data for a single
+     file descriptor at a time.  */
+  struct readahead_cache readahead_cache;
+
+  /* The list of already fetched and acknowledged stop events.  This
+     queue is used for notification Stop, and other notifications
+     don't need queue for their events, because the notification
+     events of Stop can't be consumed immediately, so that events
+     should be queued first, and be consumed by remote_wait_{ns,as}
+     one per time.  Other notifications can consume their events
+     immediately, so queue is not needed for them.  */
+  std::vector<stop_reply_up> stop_reply_queue;
+
+  /* Asynchronous signal handle registered as event loop source for
+     when we have pending events ready to be passed to the core.  */
+  struct async_event_handler *remote_async_inferior_event_token = nullptr;
+
+  /* FIXME: cagney/1999-09-23: Even though getpkt was called with
+     ``forever'' still use the normal timeout mechanism.  This is
+     currently used by the ASYNC code to guarentee that target reads
+     during the initial connect always time-out.  Once getpkt has been
+     modified to return a timeout indication and, in turn
+     remote_wait()/wait_for_inferior() have gained a timeout parameter
+     this can go away.  */
+  int wait_forever_enabled_p = 1;
+
+private:
+  /* Mapping of remote protocol data for each gdbarch.  Usually there
+     is only one entry here, though we may see more with stubs that
+     support multi-process.  */
+  std::unordered_map<struct gdbarch *, remote_arch_state>
+    m_arch_states;
+};
+
 static const target_info remote_target_info = {
   "remote",
   N_("Remote serial target in gdb-specific protocol"),
@@ -97,6 +411,7 @@ public:
   {
     to_stratum = process_stratum;
   }
+  ~remote_target () override;
 
   const target_info &info () const override
   { return remote_target_info; }
@@ -378,418 +693,368 @@ public:
   int remove_exec_catchpoint (int) override;
   enum exec_direction_kind execution_direction () override;
 
-protected:
-  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
-};
+public: /* Remote specific methods.  */
 
-/* Set up the extended remote target by extending the standard remote
-   target and adding to it.  */
+  void remote_download_command_source (int num, ULONGEST addr,
+                                      struct command_line *cmds);
 
-class extended_remote_target final : public remote_target
-{
-public:
-  const target_info &info () const override
-  { return extended_remote_target_info; }
+  void remote_file_put (const char *local_file, const char *remote_file,
+                       int from_tty);
+  void remote_file_get (const char *remote_file, const char *local_file,
+                       int from_tty);
+  void remote_file_delete (const char *remote_file, int from_tty);
 
-  /* Open an extended-remote connection.  */
-  static void open (const char *, int);
+  int remote_hostio_pread (int fd, gdb_byte *read_buf, int len,
+                          ULONGEST offset, int *remote_errno);
+  int remote_hostio_pwrite (int fd, const gdb_byte *write_buf, int len,
+                           ULONGEST offset, int *remote_errno);
+  int remote_hostio_pread_vFile (int fd, gdb_byte *read_buf, int len,
+                                ULONGEST offset, int *remote_errno);
 
-  bool can_create_inferior () override { return true; }
-  void create_inferior (const char *, const std::string &,
-                       char **, int) override;
+  int remote_hostio_send_command (int command_bytes, int which_packet,
+                                 int *remote_errno, char **attachment,
+                                 int *attachment_len);
+  int remote_hostio_set_filesystem (struct inferior *inf,
+                                   int *remote_errno);
+  /* We should get rid of this and use fileio_open directly.  */
+  int remote_hostio_open (struct inferior *inf, const char *filename,
+                         int flags, int mode, int warn_if_slow,
+                         int *remote_errno);
+  int remote_hostio_close (int fd, int *remote_errno);
 
-  void detach (inferior *, int) override;
+  int remote_hostio_unlink (inferior *inf, const char *filename,
+                           int *remote_errno);
 
-  bool can_attach () override { return true; }
-  void attach (const char *, int) override;
+  struct remote_state *get_remote_state ();
 
-  void post_attach (int) override;
-  bool supports_disable_randomization () override;
-};
+  long get_remote_packet_size (void);
+  long get_memory_packet_size (struct memory_packet_config *config);
 
-/* Per-program-space data key.  */
-static const struct program_space_data *remote_pspace_data;
+  long get_memory_write_packet_size ();
+  long get_memory_read_packet_size ();
 
-/* The variable registered as the control variable used by the
-   remote exec-file commands.  While the remote exec-file setting is
-   per-program-space, the set/show machinery uses this as the 
-   location of the remote exec-file value.  */
-static char *remote_exec_file_var;
-
-/* The size to align memory write packets, when practical.  The protocol
-   does not guarantee any alignment, and gdb will generate short
-   writes and unaligned writes, but even as a best-effort attempt this
-   can improve bulk transfers.  For instance, if a write is misaligned
-   relative to the target's data bus, the stub may need to make an extra
-   round trip fetching data from the target.  This doesn't make a
-   huge difference, but it's easy to do, so we try to be helpful.
-
-   The alignment chosen is arbitrary; usually data bus width is
-   important here, not the possibly larger cache line size.  */
-enum { REMOTE_ALIGN_WRITES = 16 };
-
-/* Prototypes for local functions.  */
-static int getpkt_sane (char **buf, long *sizeof_buf, int forever);
-static int getpkt_or_notif_sane (char **buf, long *sizeof_buf,
-                                int forever, int *is_notif);
-
-struct remote_state;
-
-static int remote_vkill (int pid, struct remote_state *rs);
-
-static void remote_kill_k (void);
-
-static int readchar (int timeout);
-
-static void remote_serial_write (const char *str, int len);
-
-static void interrupt_query (void);
-
-static void set_general_thread (ptid_t ptid);
-static void set_continue_thread (ptid_t ptid);
-
-static void get_offsets (void);
-
-static void skip_frame (void);
-
-static long read_frame (char **buf_p, long *sizeof_buf);
-
-static int hexnumlen (ULONGEST num);
-
-static int stubhex (int ch);
+  char *append_pending_thread_resumptions (char *p, char *endp,
+                                          ptid_t ptid);
+  static void open_1 (const char *name, int from_tty, int extended_p);
+  void start_remote (int from_tty, int extended_p);
+  void remote_detach_1 (struct inferior *inf, int from_tty);
 
-static int hexnumstr (char *, ULONGEST);
+  char *append_resumption (char *p, char *endp,
+                          ptid_t ptid, int step, gdb_signal siggnal);
+  int remote_resume_with_vcont (ptid_t ptid, int step,
+                               gdb_signal siggnal);
 
-static int hexnumnstr (char *, ULONGEST, int);
+  void add_current_inferior_and_thread (char *wait_status);
 
-static CORE_ADDR remote_address_masked (CORE_ADDR);
+  ptid_t wait_ns (ptid_t ptid, struct target_waitstatus *status,
+                 int options);
+  ptid_t wait_as (ptid_t ptid, target_waitstatus *status,
+                 int options);
 
-static void print_packet (const char *);
+  ptid_t process_stop_reply (struct stop_reply *stop_reply,
+                            target_waitstatus *status);
 
-static int stub_unpack_int (char *buff, int fieldlength);
+  void remote_notice_new_inferior (ptid_t currthread, int executing);
 
-static ptid_t remote_current_thread (ptid_t oldptid);
+  void process_initial_stop_replies (int from_tty);
 
-static int putpkt_binary (const char *buf, int cnt);
+  thread_info *remote_add_thread (ptid_t ptid, bool running, bool executing);
 
-static void check_binary_download (CORE_ADDR addr);
+  void btrace_sync_conf (const btrace_config *conf);
 
-struct packet_config;
+  void remote_btrace_maybe_reopen ();
 
-static void show_packet_config_cmd (struct packet_config *config);
+  void remove_new_fork_children (threads_listing_context *context);
+  void kill_new_fork_children (int pid);
+  void discard_pending_stop_replies (struct inferior *inf);
+  int stop_reply_queue_length ();
 
-static void show_remote_protocol_packet_cmd (struct ui_file *file,
-                                            int from_tty,
-                                            struct cmd_list_element *c,
-                                            const char *value);
+  void check_pending_events_prevent_wildcard_vcont
+    (int *may_global_wildcard_vcont);
 
-static char *write_ptid (char *buf, const char *endbuf, ptid_t ptid);
-static ptid_t read_ptid (const char *buf, const char **obuf);
+  void discard_pending_stop_replies_in_queue ();
+  struct stop_reply *remote_notif_remove_queued_reply (ptid_t ptid);
+  struct stop_reply *queued_stop_reply (ptid_t ptid);
+  int peek_stop_reply (ptid_t ptid);
+  void remote_parse_stop_reply (char *buf, stop_reply *event);
 
-static void remote_query_supported (void);
+  void remote_stop_ns (ptid_t ptid);
+  void remote_interrupt_as ();
+  void remote_interrupt_ns ();
 
-static void remote_check_symbols (void);
+  char *remote_get_noisy_reply ();
+  int remote_query_attached (int pid);
+  inferior *remote_add_inferior (int fake_pid_p, int pid, int attached,
+                                int try_open_exec);
 
-struct stop_reply;
-static void stop_reply_xfree (struct stop_reply *);
-static void remote_parse_stop_reply (char *, struct stop_reply *);
-static void push_stop_reply (struct stop_reply *);
-static void discard_pending_stop_replies_in_queue (struct remote_state *);
-static int peek_stop_reply (ptid_t ptid);
+  ptid_t remote_current_thread (ptid_t oldpid);
+  ptid_t get_current_thread (char *wait_status);
 
-struct threads_listing_context;
-static void remove_new_fork_children (struct threads_listing_context *);
+  void set_thread (ptid_t ptid, int gen);
+  void set_general_thread (ptid_t ptid);
+  void set_continue_thread (ptid_t ptid);
+  void set_general_process ();
 
-static void remote_async_inferior_event_handler (gdb_client_data);
+  char *write_ptid (char *buf, const char *endbuf, ptid_t ptid);
 
-static int remote_read_description_p (struct target_ops *target);
+  int remote_unpack_thread_info_response (char *pkt, threadref *expectedref,
+                                         gdb_ext_thread_info *info);
+  int remote_get_threadinfo (threadref *threadid, int fieldset,
+                            gdb_ext_thread_info *info);
 
-static void remote_console_output (char *msg);
+  int parse_threadlist_response (char *pkt, int result_limit,
+                                threadref *original_echo,
+                                threadref *resultlist,
+                                int *doneflag);
+  int remote_get_threadlist (int startflag, threadref *nextthread,
+                            int result_limit, int *done, int *result_count,
+                            threadref *threadlist);
 
-static void remote_btrace_reset (void);
+  int remote_threadlist_iterator (rmt_thread_action stepfunction,
+                                 void *context, int looplimit);
 
-static void remote_btrace_maybe_reopen (void);
+  int remote_get_threads_with_ql (threads_listing_context *context);
+  int remote_get_threads_with_qxfer (threads_listing_context *context);
+  int remote_get_threads_with_qthreadinfo (threads_listing_context *context);
 
-static int stop_reply_queue_length (void);
+  void extended_remote_restart ();
 
-static void remote_unpush_and_throw (void);
+  void get_offsets ();
 
-static struct remote_state *get_remote_state (void);
+  void remote_check_symbols ();
 
-/* For "remote".  */
+  void remote_supported_packet (const struct protocol_feature *feature,
+                               enum packet_support support,
+                               const char *argument);
 
-static struct cmd_list_element *remote_cmdlist;
+  void remote_query_supported ();
 
-/* For "set remote" and "show remote".  */
+  void remote_packet_size (const protocol_feature *feature,
+                          packet_support support, const char *value);
 
-static struct cmd_list_element *remote_set_cmdlist;
-static struct cmd_list_element *remote_show_cmdlist;
+  void remote_serial_quit_handler ();
 
-/* Stub vCont actions support.
+  void remote_detach_pid (int pid);
 
-   Each field is a boolean flag indicating whether the stub reports
-   support for the corresponding action.  */
+  void remote_vcont_probe ();
 
-struct vCont_action_support
-{
-  /* vCont;t */
-  bool t = false;
+  void remote_resume_with_hc (ptid_t ptid, int step,
+                             gdb_signal siggnal);
 
-  /* vCont;r */
-  bool r = false;
+  void send_interrupt_sequence ();
+  void interrupt_query ();
 
-  /* vCont;s */
-  bool s = false;
+  void remote_notif_get_pending_events (notif_client *nc);
 
-  /* vCont;S */
-  bool S = false;
-};
+  int fetch_register_using_p (struct regcache *regcache,
+                             packet_reg *reg);
+  int send_g_packet ();
+  void process_g_packet (struct regcache *regcache);
+  void fetch_registers_using_g (struct regcache *regcache);
+  int store_register_using_P (const struct regcache *regcache,
+                             packet_reg *reg);
+  void store_registers_using_G (const struct regcache *regcache);
 
-/* Controls whether GDB is willing to use range stepping.  */
+  void set_remote_traceframe ();
 
-static int use_range_stepping = 1;
+  void check_binary_download (CORE_ADDR addr);
 
-#define OPAQUETHREADBYTES 8
+  target_xfer_status remote_write_bytes_aux (const char *header,
+                                            CORE_ADDR memaddr,
+                                            const gdb_byte *myaddr,
+                                            ULONGEST len_units,
+                                            int unit_size,
+                                            ULONGEST *xfered_len_units,
+                                            char packet_format,
+                                            int use_length);
 
-/* a 64 bit opaque identifier */
-typedef unsigned char threadref[OPAQUETHREADBYTES];
+  target_xfer_status remote_write_bytes (CORE_ADDR memaddr,
+                                        const gdb_byte *myaddr, ULONGEST len,
+                                        int unit_size, ULONGEST *xfered_len);
 
-/* About this many threadisds fit in a packet.  */
+  target_xfer_status remote_read_bytes_1 (CORE_ADDR memaddr, gdb_byte *myaddr,
+                                         ULONGEST len_units,
+                                         int unit_size, ULONGEST *xfered_len_units);
 
-#define MAXTHREADLISTRESULTS 32
+  target_xfer_status remote_xfer_live_readonly_partial (gdb_byte *readbuf,
+                                                       ULONGEST memaddr,
+                                                       ULONGEST len,
+                                                       int unit_size,
+                                                       ULONGEST *xfered_len);
 
-/* The max number of chars in debug output.  The rest of chars are
-   omitted.  */
+  target_xfer_status remote_read_bytes (CORE_ADDR memaddr,
+                                       gdb_byte *myaddr, ULONGEST len,
+                                       int unit_size,
+                                       ULONGEST *xfered_len);
 
-#define REMOTE_DEBUG_MAX_CHAR 512
+  packet_result remote_send_printf (const char *format, ...)
+    ATTRIBUTE_PRINTF (2, 3);
 
-/* Data for the vFile:pread readahead cache.  */
+  target_xfer_status remote_flash_write (ULONGEST address,
+                                        ULONGEST length, ULONGEST *xfered_len,
+                                        const gdb_byte *data);
 
-struct readahead_cache
-{
-  /* Invalidate the readahead cache.  */
-  void invalidate ();
+  int readchar (int timeout);
 
-  /* Invalidate the readahead cache if it is holding data for FD.  */
-  void invalidate_fd (int fd);
+  void remote_serial_write (const char *str, int len);
 
-  /* Serve pread from the readahead cache.  Returns number of bytes
-     read, or 0 if the request can't be served from the cache.  */
-  int pread (int fd, gdb_byte *read_buf, size_t len, ULONGEST offset);
+  int putpkt (const char *buf);
+  int putpkt_binary (const char *buf, int cnt);
 
-  /* The file descriptor for the file that is being cached.  -1 if the
-     cache is invalid.  */
-  int fd = -1;
+  void skip_frame ();
+  long read_frame (char **buf_p, long *sizeof_buf);
+  void getpkt (char **buf, long *sizeof_buf, int forever);
+  int getpkt_or_notif_sane_1 (char **buf, long *sizeof_buf, int forever,
+                             int expecting_notif, int *is_notif);
+  int getpkt_sane (char **buf, long *sizeof_buf, int forever);
+  int getpkt_or_notif_sane (char **buf, long *sizeof_buf, int forever,
+                           int *is_notif);
+  int remote_vkill (int pid);
+  void remote_kill_k ();
 
-  /* The offset into the file that the cache buffer corresponds
-     to.  */
-  ULONGEST offset = 0;
+  void extended_remote_disable_randomization (int val);
+  int extended_remote_run (const std::string &args);
 
-  /* The buffer holding the cache contents.  */
-  gdb_byte *buf = nullptr;
-  /* The buffer's size.  We try to read as much as fits into a packet
-     at a time.  */
-  size_t bufsize = 0;
+  void send_environment_packet (const char *action,
+                               const char *packet,
+                               const char *value);
 
-  /* Cache hit and miss counters.  */
-  ULONGEST hit_count = 0;
-  ULONGEST miss_count = 0;
-};
+  void extended_remote_environment_support ();
+  void extended_remote_set_inferior_cwd ();
 
-/* Description of the remote protocol for a given architecture.  */
+  target_xfer_status 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);
 
-struct packet_reg
-{
-  long offset; /* Offset into G packet.  */
-  long regnum; /* GDB's internal register number.  */
-  LONGEST pnum; /* Remote protocol register number.  */
-  int in_g_packet; /* Always part of G packet.  */
-  /* long size in bytes;  == register_size (target_gdbarch (), regnum);
-     at present.  */
-  /* char *name; == gdbarch_register_name (target_gdbarch (), regnum);
-     at present.  */
-};
+  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);
 
-struct remote_arch_state
-{
-  explicit remote_arch_state (struct gdbarch *gdbarch);
+  void push_stop_reply (struct stop_reply *new_event);
 
-  /* Description of the remote protocol registers.  */
-  long sizeof_g_packet;
+  bool vcont_r_supported ();
 
-  /* Description of the remote protocol registers indexed by REGNUM
-     (making an array gdbarch_num_regs in size).  */
-  std::unique_ptr<packet_reg[]> regs;
+  void packet_command (const char *args, int from_tty);
 
-  /* This is the size (in chars) of the first response to the ``g''
-     packet.  It is used as a heuristic when determining the maximum
-     size of memory-read and memory-write packets.  A target will
-     typically only reserve a buffer large enough to hold the ``g''
-     packet.  The size does not include packet overhead (headers and
-     trailers).  */
-  long actual_register_packet_size;
+private: /* data fields */
 
-  /* This is the maximum size (in chars) of a non read/write packet.
-     It is also used as a cap on the size of read/write packets.  */
-  long remote_packet_size;
+  /* The remote state.  Don't reference this directly.  Use the
+     get_remote_state method instead.  */
+  remote_state m_remote_state;
 };
 
-/* Description of the remote protocol state for the currently
-   connected target.  This is per-target state, and independent of the
-   selected architecture.  */
+static const target_info extended_remote_target_info = {
+  "extended-remote",
+  N_("Extended remote serial target in gdb-specific protocol"),
+  remote_doc
+};
 
-class remote_state
+/* 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 target_info &info () const override
+  { return extended_remote_target_info; }
 
-  remote_state ();
-  ~remote_state ();
+  /* Open an extended-remote connection.  */
+  static void open (const char *, int);
 
-  /* Get the remote arch state for GDBARCH.  */
-  struct remote_arch_state *get_remote_arch_state (struct gdbarch *gdbarch);
+  bool can_create_inferior () override { return true; }
+  void create_inferior (const char *, const std::string &,
+                       char **, int) override;
 
-public: /* data */
+  void detach (inferior *, int) override;
 
-  /* A buffer to use for incoming packets, and its current size.  The
-     buffer is grown dynamically for larger incoming packets.
-     Outgoing packets may also be constructed in this buffer.
-     BUF_SIZE is always at least REMOTE_PACKET_SIZE;
-     REMOTE_PACKET_SIZE should be used to limit the length of outgoing
-     packets.  */
-  char *buf;
-  long buf_size;
+  bool can_attach () override { return true; }
+  void attach (const char *, int) override;
 
-  /* True if we're going through initial connection setup (finding out
-     about the remote side's threads, relocating symbols, etc.).  */
-  bool starting_up = false;
+  void post_attach (int) override;
+  bool supports_disable_randomization () override;
+};
 
-  /* If we negotiated packet size explicitly (and thus can bypass
-     heuristics for the largest packet size that will not overflow
-     a buffer in the stub), this will be set to that packet size.
-     Otherwise zero, meaning to use the guessed size.  */
-  long explicit_packet_size = 0;
+/* Per-program-space data key.  */
+static const struct program_space_data *remote_pspace_data;
 
-  /* remote_wait is normally called when the target is running and
-     waits for a stop reply packet.  But sometimes we need to call it
-     when the target is already stopped.  We can send a "?" packet
-     and have remote_wait read the response.  Or, if we already have
-     the response, we can stash it in BUF and tell remote_wait to
-     skip calling getpkt.  This flag is set when BUF contains a
-     stop reply packet and the target is not waiting.  */
-  int cached_wait_status = 0;
+/* The variable registered as the control variable used by the
+   remote exec-file commands.  While the remote exec-file setting is
+   per-program-space, the set/show machinery uses this as the 
+   location of the remote exec-file value.  */
+static char *remote_exec_file_var;
 
-  /* True, if in no ack mode.  That is, neither GDB nor the stub will
-     expect acks from each other.  The connection is assumed to be
-     reliable.  */
-  bool noack_mode = false;
+/* The size to align memory write packets, when practical.  The protocol
+   does not guarantee any alignment, and gdb will generate short
+   writes and unaligned writes, but even as a best-effort attempt this
+   can improve bulk transfers.  For instance, if a write is misaligned
+   relative to the target's data bus, the stub may need to make an extra
+   round trip fetching data from the target.  This doesn't make a
+   huge difference, but it's easy to do, so we try to be helpful.
 
-  /* True if we're connected in extended remote mode.  */
-  bool extended = false;
+   The alignment chosen is arbitrary; usually data bus width is
+   important here, not the possibly larger cache line size.  */
+enum { REMOTE_ALIGN_WRITES = 16 };
 
-  /* True if we resumed the target and we're waiting for the target to
-     stop.  In the mean time, we can't start another command/query.
-     The remote server wouldn't be ready to process it, so we'd
-     timeout waiting for a reply that would never come and eventually
-     we'd close the connection.  This can happen in asynchronous mode
-     because we allow GDB commands while the target is running.  */
-  bool waiting_for_stop_reply = false;
+/* Prototypes for local functions.  */
 
-  /* The status of the stub support for the various vCont actions.  */
-  vCont_action_support supports_vCont;
+static int hexnumlen (ULONGEST num);
 
-  /* True if the user has pressed Ctrl-C, but the target hasn't
-     responded to that.  */
-  bool ctrlc_pending_p = false;
+static int stubhex (int ch);
 
-  /* True if we saw a Ctrl-C while reading or writing from/to the
-     remote descriptor.  At that point it is not safe to send a remote
-     interrupt packet, so we instead remember we saw the Ctrl-C and
-     process it once we're done with sending/receiving the current
-     packet, which should be shortly.  If however that takes too long,
-     and the user presses Ctrl-C again, we offer to disconnect.  */
-  bool got_ctrlc_during_io = false;
+static int hexnumstr (char *, ULONGEST);
 
-  /* Descriptor for I/O to remote machine.  Initialize it to NULL so that
-     remote_open knows that we don't have a file open when the program
-     starts.  */
-  struct serial *remote_desc = nullptr;
+static int hexnumnstr (char *, ULONGEST, int);
 
-  /* These are the threads which we last sent to the remote system.  The
-     TID member will be -1 for all or -2 for not sent yet.  */
-  ptid_t general_thread = null_ptid;
-  ptid_t continue_thread = null_ptid;
+static CORE_ADDR remote_address_masked (CORE_ADDR);
 
-  /* This is the traceframe which we last selected on the remote system.
-     It will be -1 if no traceframe is selected.  */
-  int remote_traceframe_number = -1;
+static void print_packet (const char *);
 
-  char *last_pass_packet = nullptr;
+static int stub_unpack_int (char *buff, int fieldlength);
 
-  /* The last QProgramSignals packet sent to the target.  We bypass
-     sending a new program signals list down to the target if the new
-     packet is exactly the same as the last we sent.  IOW, we only let
-     the target know about program signals list changes.  */
-  char *last_program_signals_packet = nullptr;
+struct packet_config;
 
-  gdb_signal last_sent_signal = GDB_SIGNAL_0;
+static void show_packet_config_cmd (struct packet_config *config);
 
-  bool last_sent_step = false;
+static void show_remote_protocol_packet_cmd (struct ui_file *file,
+                                            int from_tty,
+                                            struct cmd_list_element *c,
+                                            const char *value);
 
-  /* The execution direction of the last resume we got.  */
-  exec_direction_kind last_resume_exec_dir = EXEC_FORWARD;
+static ptid_t read_ptid (const char *buf, const char **obuf);
 
-  char *finished_object = nullptr;
-  char *finished_annex = nullptr;
-  ULONGEST finished_offset = 0;
+static void remote_async_inferior_event_handler (gdb_client_data);
 
-  /* Should we try the 'ThreadInfo' query packet?
+static int remote_read_description_p (struct target_ops *target);
 
-     This variable (NOT available to the user: auto-detect only!)
-     determines whether GDB will use the new, simpler "ThreadInfo"
-     query or the older, more complex syntax for thread queries.
-     This is an auto-detect variable (set to true at each connect,
-     and set to false when the target fails to recognize it).  */
-  bool use_threadinfo_query = false;
-  bool use_threadextra_query = false;
+static void remote_console_output (char *msg);
 
-  threadref echo_nextthread {};
-  threadref nextthread {};
-  threadref resultthreadlist[MAXTHREADLISTRESULTS] {};
+static void remote_btrace_reset (remote_state *rs);
 
-  /* The state of remote notification.  */
-  struct remote_notif_state *notif_state = nullptr;
+static void remote_unpush_and_throw (void);
 
-  /* The branch trace configuration.  */
-  struct btrace_config btrace_config {};
+/* For "remote".  */
 
-  /* The argument to the last "vFile:setfs:" packet we sent, used
-     to avoid sending repeated unnecessary "vFile:setfs:" packets.
-     Initialized to -1 to indicate that no "vFile:setfs:" packet
-     has yet been sent.  */
-  int fs_pid = -1;
+static struct cmd_list_element *remote_cmdlist;
 
-  /* A readahead cache for vFile:pread.  Often, reading a binary
-     involves a sequence of small reads.  E.g., when parsing an ELF
-     file.  A readahead cache helps mostly the case of remote
-     debugging on a connection with higher latency, due to the
-     request/reply nature of the RSP.  We only cache data for a single
-     file descriptor at a time.  */
-  struct readahead_cache readahead_cache;
+/* For "set remote" and "show remote".  */
 
-private:
-  /* Mapping of remote protocol data for each gdbarch.  Usually there
-     is only one entry here, though we may see more with stubs that
-     support multi-process.  */
-  std::unordered_map<struct gdbarch *, remote_arch_state>
-    m_arch_states;
-};
+static struct cmd_list_element *remote_set_cmdlist;
+static struct cmd_list_element *remote_show_cmdlist;
+
+/* Controls whether GDB is willing to use range stepping.  */
+
+static int use_range_stepping = 1;
+
+/* The max number of chars in debug output.  The rest of chars are
+   omitted.  */
+
+#define REMOTE_DEBUG_MAX_CHAR 512
 
 /* Private data that we'll store in (struct thread_info)->priv.  */
 struct remote_thread_info : public private_thread_info
@@ -845,18 +1110,6 @@ remote_state::~remote_state ()
   xfree (this->finished_annex);
 }
 
-/* This data could be associated with a target, but we do not always
-   have access to the current target when we need it, so for now it is
-   static.  This will be fine for as long as only one target is in use
-   at a time.  */
-static struct remote_state *remote_state;
-
-static struct remote_state *
-get_remote_state_raw (void)
-{
-  return remote_state;
-}
-
 /* Utility: generate error from an incoming stub packet.  */
 static void
 trace_error (char *buf)
@@ -878,8 +1131,8 @@ trace_error (char *buf)
 
 /* Utility: wait for reply from stub, while accepting "O" packets.  */
 
-static char *
-remote_get_noisy_reply ()
+char *
+remote_target::remote_get_noisy_reply ()
 {
   struct remote_state *rs = get_remote_state ();
 
@@ -983,19 +1236,17 @@ remote_state::get_remote_arch_state (struct gdbarch *gdbarch)
 
 /* Fetch the global remote target state.  */
 
-static struct remote_state *
-get_remote_state (void)
+remote_state *
+remote_target::get_remote_state ()
 {
-  struct remote_state *rs = get_remote_state_raw ();
-
   /* Make sure that the remote architecture state has been
      initialized, because doing so might reallocate rs->buf.  Any
      function which calls getpkt also needs to be mindful of changes
      to rs->buf, but this call limits the number of places which run
      into trouble.  */
-  rs->get_remote_arch_state (target_gdbarch ());
+  m_remote_state.get_remote_arch_state (target_gdbarch ());
 
-  return rs;
+  return &m_remote_state;
 }
 
 /* Cleanup routine for the remote module's pspace data.  */
@@ -1170,11 +1421,21 @@ remote_arch_state::remote_arch_state (struct gdbarch *gdbarch)
     this->remote_packet_size = (this->sizeof_g_packet * 2 + 32);
 }
 
+/* Get a pointer to the current remote target.  If not connected to a
+   remote target, return NULL.  */
+
+static remote_target *
+get_current_remote_target ()
+{
+  target_ops *proc_target = find_target_at (process_stratum);
+  return dynamic_cast<remote_target *> (proc_target);
+}
+
 /* Return the current allowed size of a remote packet.  This is
    inferred from the current architecture, and should be used to
    limit the length of outgoing packets.  */
-static long
-get_remote_packet_size (void)
+long
+remote_target::get_remote_packet_size ()
 {
   struct remote_state *rs = get_remote_state ();
   remote_arch_state *rsa = rs->get_remote_arch_state (target_gdbarch ());
@@ -1216,19 +1477,6 @@ packet_reg_from_pnum (struct gdbarch *gdbarch, struct remote_arch_state *rsa,
   return NULL;
 }
 
-static remote_target remote_ops;
-
-static extended_remote_target extended_remote_ops;
-
-/* FIXME: cagney/1999-09-23: Even though getpkt was called with
-   ``forever'' still use the normal timeout mechanism.  This is
-   currently used by the ASYNC code to guarentee that target reads
-   during the initial connect always time-out.  Once getpkt has been
-   modified to return a timeout indication and, in turn
-   remote_wait()/wait_for_inferior() have gained a timeout parameter
-   this can go away.  */
-static int wait_forever_enabled_p = 1;
-
 /* Allow the user to specify what sequence to send to the remote
    when he requests a program interruption: Although ^C is usually
    what remote systems expect (this is the default, here), it is
@@ -1354,8 +1602,8 @@ get_fixed_memory_packet_size (struct memory_packet_config *config)
 /* Compute the current size of a read/write packet.  Since this makes
    use of ``actual_register_packet_size'' the computation is dynamic.  */
 
-static long
-get_memory_packet_size (struct memory_packet_config *config)
+long
+remote_target::get_memory_packet_size (struct memory_packet_config *config)
 {
   struct remote_state *rs = get_remote_state ();
   remote_arch_state *rsa = rs->get_remote_arch_state (target_gdbarch ());
@@ -1452,11 +1700,11 @@ show_memory_packet_size (struct memory_packet_config *config)
                     get_fixed_memory_packet_size (config));
   else
     {
-      struct remote_state *rs = get_remote_state ();
+      remote_target *remote = get_current_remote_target ();
 
-      if (rs->remote_desc != NULL)
+      if (remote != NULL)
        printf_filtered (_("Packets are limited to %ld bytes.\n"),
-                        get_memory_packet_size (config));
+                        remote->get_memory_packet_size (config));
       else
        puts_filtered ("The actual limit will be further reduced "
                       "dependent on the target.\n");
@@ -1477,11 +1725,44 @@ set_memory_write_packet_size (const char *args, int from_tty)
 static void
 show_memory_write_packet_size (const char *args, int from_tty)
 {
-  show_memory_packet_size (&memory_write_packet_config);
+  show_memory_packet_size (&memory_write_packet_config);
+}
+
+/* Show the number of hardware watchpoints that can be used.  */
+
+static void
+show_hardware_watchpoint_limit (struct ui_file *file, int from_tty,
+                               struct cmd_list_element *c,
+                               const char *value)
+{
+  fprintf_filtered (file, _("The maximum number of target hardware "
+                           "watchpoints is %s.\n"), value);
+}
+
+/* Show the length limit (in bytes) for hardware watchpoints.  */
+
+static void
+show_hardware_watchpoint_length_limit (struct ui_file *file, int from_tty,
+                                      struct cmd_list_element *c,
+                                      const char *value)
+{
+  fprintf_filtered (file, _("The maximum length (in bytes) of a target "
+                           "hardware watchpoint is %s.\n"), value);
+}
+
+/* Show the number of hardware breakpoints that can be used.  */
+
+static void
+show_hardware_breakpoint_limit (struct ui_file *file, int from_tty,
+                               struct cmd_list_element *c,
+                               const char *value)
+{
+  fprintf_filtered (file, _("The maximum number of target hardware "
+                           "breakpoints is %s.\n"), value);
 }
 
-static long
-get_memory_write_packet_size (void)
+long
+remote_target::get_memory_write_packet_size ()
 {
   return get_memory_packet_size (&memory_write_packet_config);
 }
@@ -1503,8 +1784,8 @@ show_memory_read_packet_size (const char *args, int from_tty)
   show_memory_packet_size (&memory_read_packet_config);
 }
 
-static long
-get_memory_read_packet_size (void)
+long
+remote_target::get_memory_read_packet_size ()
 {
   long size = get_memory_packet_size (&memory_read_packet_config);
 
@@ -1517,16 +1798,6 @@ get_memory_read_packet_size (void)
 }
 
 \f
-/* Generic configuration support for packets the stub optionally
-   supports.  Allows the user to specify the use of the packet as well
-   as allowing GDB to auto-detect support in the remote stub.  */
-
-enum packet_support
-  {
-    PACKET_SUPPORT_UNKNOWN = 0,
-    PACKET_ENABLE,
-    PACKET_DISABLE
-  };
 
 struct packet_config
   {
@@ -1544,16 +1815,6 @@ struct packet_config
     enum packet_support support;
   };
 
-/* Analyze a packet's return value and update the packet config
-   accordingly.  */
-
-enum packet_result
-{
-  PACKET_ERROR,
-  PACKET_OK,
-  PACKET_UNKNOWN
-};
-
 static enum packet_support packet_config_support (struct packet_config *config);
 static enum packet_support packet_support (int packet);
 
@@ -2047,12 +2308,6 @@ remote_target::remove_exec_catchpoint (int pid)
   return 0;
 }
 
-\f
-/* Asynchronous signal handle registered as event loop source for
-   when we have pending events ready to be passed to the core.  */
-
-static struct async_event_handler *remote_async_inferior_event_token;
-
 \f
 
 static ptid_t magic_null_ptid;
@@ -2062,8 +2317,8 @@ static ptid_t any_thread_ptid;
 /* Find out if the stub attached to PID (and hence GDB should offer to
    detach instead of killing it when bailing out).  */
 
-static int
-remote_query_attached (int pid)
+int
+remote_target::remote_query_attached (int pid)
 {
   struct remote_state *rs = get_remote_state ();
   size_t size = get_remote_packet_size ();
@@ -2107,9 +2362,9 @@ remote_query_attached (int pid)
    attempt to open this inferior's executable as the main executable
    if no main executable is open already.  */
 
-static struct inferior *
-remote_add_inferior (int fake_pid_p, int pid, int attached,
-                    int try_open_exec)
+inferior *
+remote_target::remote_add_inferior (int fake_pid_p, int pid, int attached,
+                                   int try_open_exec)
 {
   struct inferior *inf;
 
@@ -2152,12 +2407,13 @@ remote_add_inferior (int fake_pid_p, int pid, int attached,
 }
 
 static remote_thread_info *get_remote_thread_info (thread_info *thread);
+static remote_thread_info *get_remote_thread_info (ptid_t ptid);
 
 /* Add thread PTID to GDB's thread list.  Tag it as executing/running
    according to RUNNING.  */
 
-static void
-remote_add_thread (ptid_t ptid, int running, int executing)
+thread_info *
+remote_target::remote_add_thread (ptid_t ptid, bool running, bool executing)
 {
   struct remote_state *rs = get_remote_state ();
   struct thread_info *thread;
@@ -2176,6 +2432,8 @@ remote_add_thread (ptid_t ptid, int running, int executing)
   get_remote_thread_info (thread)->vcont_resumed = executing;
   set_executing (ptid, executing);
   set_running (ptid, running);
+
+  return thread;
 }
 
 /* Come here when we learn about a thread id from the remote target.
@@ -2185,8 +2443,8 @@ remote_add_thread (ptid_t ptid, int running, int executing)
    GDB's inferior list as well.  EXECUTING indicates whether the
    thread is (internally) executing or stopped.  */
 
-static void
-remote_notice_new_inferior (ptid_t currthread, int executing)
+void
+remote_target::remote_notice_new_inferior (ptid_t currthread, int executing)
 {
   /* In non-stop mode, we assume new found threads are (externally)
      running until proven otherwise with a stop reply.  In all-stop,
@@ -2196,7 +2454,8 @@ remote_notice_new_inferior (ptid_t currthread, int executing)
   /* If this is a new thread, add it to GDB's thread list.
      If we leave it up to WFI to do this, bad things will happen.  */
 
-  if (in_thread_list (currthread) && is_exited (currthread))
+  thread_info *tp = find_thread_ptid (currthread);
+  if (tp != NULL && tp->state == THREAD_EXITED)
     {
       /* We're seeing an event on a thread id we knew had exited.
         This has to be a new thread reusing the old id.  Add it.  */
@@ -2207,17 +2466,17 @@ remote_notice_new_inferior (ptid_t currthread, int executing)
   if (!in_thread_list (currthread))
     {
       struct inferior *inf = NULL;
-      int pid = ptid_get_pid (currthread);
+      int pid = currthread.pid ();
 
-      if (ptid_is_pid (inferior_ptid)
-         && pid == ptid_get_pid (inferior_ptid))
+      if (inferior_ptid.is_pid ()
+         && pid == inferior_ptid.pid ())
        {
          /* inferior_ptid has no thread member yet.  This can happen
             with the vAttach -> remote_wait,"TAAthread:" path if the
             stub doesn't support qC.  This is the first stop reported
             after an attach, so this is the main thread.  Update the
             ptid in the thread list.  */
-         if (in_thread_list (pid_to_ptid (pid)))
+         if (in_thread_list (ptid_t (pid)))
            thread_change_ptid (inferior_ptid, currthread);
          else
            {
@@ -2227,7 +2486,7 @@ remote_notice_new_inferior (ptid_t currthread, int executing)
          return;
        }
 
-      if (ptid_equal (magic_null_ptid, inferior_ptid))
+      if (magic_null_ptid == inferior_ptid)
        {
          /* inferior_ptid is not set yet.  This can happen with the
             vRun -> remote_wait,"TAAthread:" path if the stub
@@ -2242,17 +2501,18 @@ remote_notice_new_inferior (ptid_t currthread, int executing)
         extended-remote which already was debugging an inferior, we
         may not know about it yet.  Add it before adding its child
         thread, so notifications are emitted in a sensible order.  */
-      if (!in_inferior_list (ptid_get_pid (currthread)))
+      if (find_inferior_pid (currthread.pid ()) == NULL)
        {
          struct remote_state *rs = get_remote_state ();
          int fake_pid_p = !remote_multi_process_p (rs);
 
          inf = remote_add_inferior (fake_pid_p,
-                                    ptid_get_pid (currthread), -1, 1);
+                                    currthread.pid (), -1, 1);
        }
 
       /* This is really a new thread.  Add it.  */
-      remote_add_thread (currthread, running, executing);
+      thread_info *new_thr
+       = remote_add_thread (currthread, running, executing);
 
       /* If we found a new inferior, let the common code do whatever
         it needs to with it (e.g., read shared libraries, insert
@@ -2263,7 +2523,7 @@ remote_notice_new_inferior (ptid_t currthread, int executing)
          struct remote_state *rs = get_remote_state ();
 
          if (!rs->starting_up)
-           notice_new_inferior (currthread, executing, 0);
+           notice_new_inferior (new_thr, executing, 0);
        }
     }
 }
@@ -2281,14 +2541,11 @@ get_remote_thread_info (thread_info *thread)
   return static_cast<remote_thread_info *> (thread->priv.get ());
 }
 
-/* Return PTID's private thread data, creating it if necessary.  */
-
 static remote_thread_info *
 get_remote_thread_info (ptid_t ptid)
 {
-  struct thread_info *info = find_thread_ptid (ptid);
-
-  return get_remote_thread_info (info);
+  thread_info *thr = find_thread_ptid (ptid);
+  return get_remote_thread_info (thr);
 }
 
 /* Call this function as a result of
@@ -2482,24 +2739,24 @@ remote_target::program_signals (int numsigs, unsigned char *signals)
    MINUS_ONE_PTID, set the thread to -1, so the stub returns the
    thread.  If GEN is set, set the general thread, if not, then set
    the step/continue thread.  */
-static void
-set_thread (ptid_t ptid, int gen)
+void
+remote_target::set_thread (ptid_t ptid, int gen)
 {
   struct remote_state *rs = get_remote_state ();
   ptid_t state = gen ? rs->general_thread : rs->continue_thread;
   char *buf = rs->buf;
   char *endbuf = rs->buf + get_remote_packet_size ();
 
-  if (ptid_equal (state, ptid))
+  if (state == ptid)
     return;
 
   *buf++ = 'H';
   *buf++ = gen ? 'g' : 'c';
-  if (ptid_equal (ptid, magic_null_ptid))
+  if (ptid == magic_null_ptid)
     xsnprintf (buf, endbuf - buf, "0");
-  else if (ptid_equal (ptid, any_thread_ptid))
+  else if (ptid == any_thread_ptid)
     xsnprintf (buf, endbuf - buf, "0");
-  else if (ptid_equal (ptid, minus_one_ptid))
+  else if (ptid == minus_one_ptid)
     xsnprintf (buf, endbuf - buf, "-1");
   else
     write_ptid (buf, endbuf, ptid);
@@ -2511,14 +2768,14 @@ set_thread (ptid_t ptid, int gen)
     rs->continue_thread = ptid;
 }
 
-static void
-set_general_thread (ptid_t ptid)
+void
+remote_target::set_general_thread (ptid_t ptid)
 {
   set_thread (ptid, 1);
 }
 
-static void
-set_continue_thread (ptid_t ptid)
+void
+remote_target::set_continue_thread (ptid_t ptid)
 {
   set_thread (ptid, 0);
 }
@@ -2532,8 +2789,8 @@ set_continue_thread (ptid_t ptid)
    general operations is the process the selected general thread
    belongs to.  */
 
-static void
-set_general_process (void)
+void
+remote_target::set_general_process ()
 {
   struct remote_state *rs = get_remote_state ();
 
@@ -2543,7 +2800,7 @@ set_general_process (void)
 
   /* We only need to change the remote current thread if it's pointing
      at some other process.  */
-  if (ptid_get_pid (rs->general_thread) != ptid_get_pid (inferior_ptid))
+  if (rs->general_thread.pid () != inferior_ptid.pid ())
     set_general_thread (inferior_ptid);
 }
 
@@ -2554,11 +2811,11 @@ set_general_process (void)
 static int
 remote_thread_always_alive (ptid_t ptid)
 {
-  if (ptid_equal (ptid, magic_null_ptid))
+  if (ptid == magic_null_ptid)
     /* The main thread is always alive.  */
     return 1;
 
-  if (ptid_get_pid (ptid) != 0 && ptid_get_lwp (ptid) == 0)
+  if (ptid.pid () != 0 && ptid.lwp () == 0)
     /* The main thread is always alive.  This can happen after a
        vAttach, if the remote side doesn't support
        multi-threading.  */
@@ -2675,38 +2932,10 @@ static int threadmatch (threadref *dest, threadref *src);
 static char *pack_threadinfo_request (char *pkt, int mode,
                                      threadref *id);
 
-static int remote_unpack_thread_info_response (char *pkt,
-                                              threadref *expectedref,
-                                              struct gdb_ext_thread_info
-                                              *info);
-
-
-static int remote_get_threadinfo (threadref *threadid,
-                                 int fieldset, /*TAG mask */
-                                 struct gdb_ext_thread_info *info);
-
 static char *pack_threadlist_request (char *pkt, int startflag,
                                      int threadcount,
                                      threadref *nextthread);
 
-static int parse_threadlist_response (char *pkt,
-                                     int result_limit,
-                                     threadref *original_echo,
-                                     threadref *resultlist,
-                                     int *doneflag);
-
-static int remote_get_threadlist (int startflag,
-                                 threadref *nextthread,
-                                 int result_limit,
-                                 int *done,
-                                 int *result_count,
-                                 threadref *threadlist);
-
-typedef int (*rmt_thread_action) (threadref *ref, void *context);
-
-static int remote_threadlist_iterator (rmt_thread_action stepfunction,
-                                      void *context, int looplimit);
-
 static int remote_newthread_step (threadref *ref, void *context);
 
 
@@ -2714,21 +2943,21 @@ static int remote_newthread_step (threadref *ref, void *context);
    buffer we're allowed to write to.  Returns
    BUF+CHARACTERS_WRITTEN.  */
 
-static char *
-write_ptid (char *buf, const char *endbuf, ptid_t ptid)
+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))
     {
-      pid = ptid_get_pid (ptid);
+      pid = ptid.pid ();
       if (pid < 0)
        buf += xsnprintf (buf, endbuf - buf, "p-%x.", -pid);
       else
        buf += xsnprintf (buf, endbuf - buf, "p%x.", pid);
     }
-  tid = ptid_get_lwp (ptid);
+  tid = ptid.lwp ();
   if (tid < 0)
     buf += xsnprintf (buf, endbuf - buf, "-%x", -tid);
   else
@@ -2759,7 +2988,7 @@ read_ptid (const char *buf, const char **obuf)
       pp = unpack_varlen_hex (p + 1, &tid);
       if (obuf)
        *obuf = pp;
-      return ptid_build (pid, tid, 0);
+      return ptid_t (pid, tid, 0);
     }
 
   /* No multi-process.  Just a tid.  */
@@ -2777,14 +3006,14 @@ read_ptid (const char *buf, const char **obuf)
      what's in inferior_ptid, unless it's null at this point.  If so,
      then since there's no way to know the pid of the reported
      threads, use the magic number.  */
-  if (ptid_equal (inferior_ptid, null_ptid))
-    pid = ptid_get_pid (magic_null_ptid);
+  if (inferior_ptid == null_ptid)
+    pid = magic_null_ptid.pid ();
   else
-    pid = ptid_get_pid (inferior_ptid);
+    pid = inferior_ptid.pid ();
 
   if (obuf)
     *obuf = pp;
-  return ptid_build (pid, tid, 0);
+  return ptid_t (pid, tid, 0);
 }
 
 static int
@@ -3012,9 +3241,10 @@ pack_threadinfo_request (char *pkt, int mode, threadref *id)
 #define TAG_MOREDISPLAY 16     /* Whatever the kernel wants to say about
                                   the process.  */
 
-static int
-remote_unpack_thread_info_response (char *pkt, threadref *expectedref,
-                                   struct gdb_ext_thread_info *info)
+int
+remote_target::remote_unpack_thread_info_response (char *pkt,
+                                                  threadref *expectedref,
+                                                  gdb_ext_thread_info *info)
 {
   struct remote_state *rs = get_remote_state ();
   int mask, length;
@@ -3105,9 +3335,10 @@ remote_unpack_thread_info_response (char *pkt, threadref *expectedref,
   return retval;
 }
 
-static int
-remote_get_threadinfo (threadref *threadid, int fieldset,      /* TAG mask */
-                      struct gdb_ext_thread_info *info)
+int
+remote_target::remote_get_threadinfo (threadref *threadid,
+                                     int fieldset,
+                                     gdb_ext_thread_info *info)
 {
   struct remote_state *rs = get_remote_state ();
   int result;
@@ -3141,10 +3372,11 @@ pack_threadlist_request (char *pkt, int startflag, int threadcount,
 
 /* Encoding:   'q':8,'M':8,count:16,done:8,argthreadid:64,(threadid:64)* */
 
-static int
-parse_threadlist_response (char *pkt, int result_limit,
-                          threadref *original_echo, threadref *resultlist,
-                          int *doneflag)
+int
+remote_target::parse_threadlist_response (char *pkt, int result_limit,
+                                         threadref *original_echo,
+                                         threadref *resultlist,
+                                         int *doneflag)
 {
   struct remote_state *rs = get_remote_state ();
   char *limit;
@@ -3172,9 +3404,10 @@ parse_threadlist_response (char *pkt, int result_limit,
 /* Fetch the next batch of threads from the remote.  Returns -1 if the
    qL packet is not supported, 0 on error and 1 on success.  */
 
-static int
-remote_get_threadlist (int startflag, threadref *nextthread, int result_limit,
-                      int *done, int *result_count, threadref *threadlist)
+int
+remote_target::remote_get_threadlist (int startflag, threadref *nextthread,
+                                     int result_limit, int *done, int *result_count,
+                                     threadref *threadlist)
 {
   struct remote_state *rs = get_remote_state ();
   int result = 1;
@@ -3234,9 +3467,9 @@ remote_get_threadlist (int startflag, threadref *nextthread, int result_limit,
    STEPFUNCTION returns false.  If the packet is not supported,
    returns -1.  */
 
-static int
-remote_threadlist_iterator (rmt_thread_action stepfunction, void *context,
-                           int looplimit)
+int
+remote_target::remote_threadlist_iterator (rmt_thread_action stepfunction,
+                                          void *context, int looplimit)
 {
   struct remote_state *rs = get_remote_state ();
   int done, i, result_count;
@@ -3367,8 +3600,8 @@ remote_newthread_step (threadref *ref, void *data)
 
 #define CRAZY_MAX_THREADS 1000
 
-static ptid_t
-remote_current_thread (ptid_t oldpid)
+ptid_t
+remote_target::remote_current_thread (ptid_t oldpid)
 {
   struct remote_state *rs = get_remote_state ();
 
@@ -3392,9 +3625,8 @@ remote_current_thread (ptid_t oldpid)
 
 /* List remote threads using the deprecated qL packet.  */
 
-static int
-remote_get_threads_with_ql (struct target_ops *ops,
-                           struct threads_listing_context *context)
+int
+remote_target::remote_get_threads_with_ql (threads_listing_context *context)
 {
   if (remote_threadlist_iterator (remote_newthread_step, context,
                                  CRAZY_MAX_THREADS) >= 0)
@@ -3475,15 +3707,14 @@ const struct gdb_xml_element threads_elements[] = {
 
 /* List remote threads using qXfer:threads:read.  */
 
-static int
-remote_get_threads_with_qxfer (struct target_ops *ops,
-                              struct threads_listing_context *context)
+int
+remote_target::remote_get_threads_with_qxfer (threads_listing_context *context)
 {
 #if defined(HAVE_LIBEXPAT)
   if (packet_support (PACKET_qXfer_threads) == PACKET_ENABLE)
     {
       gdb::optional<gdb::char_vector> xml
-       = target_read_stralloc (ops, TARGET_OBJECT_THREADS, NULL);
+       = target_read_stralloc (this, TARGET_OBJECT_THREADS, NULL);
 
       if (xml && (*xml)[0] != '\0')
        {
@@ -3500,9 +3731,8 @@ remote_get_threads_with_qxfer (struct target_ops *ops,
 
 /* List remote threads using qfThreadInfo/qsThreadInfo.  */
 
-static int
-remote_get_threads_with_qthreadinfo (struct target_ops *ops,
-                                    struct threads_listing_context *context)
+int
+remote_target::remote_get_threads_with_qthreadinfo (threads_listing_context *context)
 {
   struct remote_state *rs = get_remote_state ();
 
@@ -3551,9 +3781,9 @@ remote_target::update_thread_list ()
   /* We have a few different mechanisms to fetch the thread list.  Try
      them all, starting with the most preferred one first, falling
      back to older methods.  */
-  if (remote_get_threads_with_qxfer (this, &context)
-      || remote_get_threads_with_qthreadinfo (this, &context)
-      || remote_get_threads_with_ql (this, &context))
+  if (remote_get_threads_with_qxfer (&context)
+      || remote_get_threads_with_qthreadinfo (&context)
+      || remote_get_threads_with_ql (&context))
     {
       struct thread_info *tp, *tmp;
 
@@ -3578,7 +3808,7 @@ remote_target::update_thread_list ()
          if (!context.contains_thread (tp->ptid))
            {
              /* Not found.  */
-             delete_thread (tp->ptid);
+             delete_thread (tp);
            }
        }
 
@@ -3600,7 +3830,8 @@ remote_target::update_thread_list ()
 
              remote_notice_new_inferior (item.ptid, executing);
 
-             remote_thread_info *info = get_remote_thread_info (item.ptid);
+             tp = find_thread_ptid (item.ptid);
+             remote_thread_info *info = get_remote_thread_info (tp);
              info->core = item.core;
              info->extra = std::move (item.extra);
              info->name = std::move (item.name);
@@ -3632,34 +3863,32 @@ const char *
 remote_target::extra_thread_info (thread_info *tp)
 {
   struct remote_state *rs = get_remote_state ();
-  int result;
   int set;
   threadref id;
   struct gdb_ext_thread_info threadinfo;
-  static char display_buf[100];        /* arbitrary...  */
-  int n = 0;                    /* position in display_buf */
 
   if (rs->remote_desc == 0)            /* paranoia */
     internal_error (__FILE__, __LINE__,
                    _("remote_threads_extra_info"));
 
-  if (ptid_equal (tp->ptid, magic_null_ptid)
-      || (ptid_get_pid (tp->ptid) != 0 && ptid_get_lwp (tp->ptid) == 0))
+  if (tp->ptid == magic_null_ptid
+      || (tp->ptid.pid () != 0 && tp->ptid.lwp () == 0))
     /* This is the main thread which was added by GDB.  The remote
        server doesn't know about it.  */
     return NULL;
 
+  std::string &extra = get_remote_thread_info (tp)->extra;
+
+  /* If already have cached info, use it.  */
+  if (!extra.empty ())
+    return extra.c_str ();
+
   if (packet_support (PACKET_qXfer_threads) == PACKET_ENABLE)
     {
-      struct thread_info *info = find_thread_ptid (tp->ptid);
-
-      if (info != NULL && info->priv != NULL)
-       {
-         const std::string &extra = get_remote_thread_info (info)->extra;
-         return !extra.empty () ? extra.c_str () : NULL;
-       }
-      else
-       return NULL;
+      /* If we're using qXfer:threads:read, then the extra info is
+        included in the XML.  So if we didn't have anything cached,
+        it's because there's really no extra info.  */
+      return NULL;
     }
 
   if (rs->use_threadextra_query)
@@ -3675,10 +3904,9 @@ remote_target::extra_thread_info (thread_info *tp)
       getpkt (&rs->buf, &rs->buf_size, 0);
       if (rs->buf[0] != 0)
        {
-         n = std::min (strlen (rs->buf) / 2, sizeof (display_buf));
-         result = hex2bin (rs->buf, (gdb_byte *) display_buf, n);
-         display_buf [result] = '\0';
-         return display_buf;
+         extra.resize (strlen (rs->buf) / 2);
+         hex2bin (rs->buf, (gdb_byte *) &extra[0], extra.size ());
+         return extra.c_str ();
        }
     }
 
@@ -3686,27 +3914,25 @@ remote_target::extra_thread_info (thread_info *tp)
   rs->use_threadextra_query = 0;
   set = TAG_THREADID | TAG_EXISTS | TAG_THREADNAME
     | TAG_MOREDISPLAY | TAG_DISPLAY;
-  int_to_threadref (&id, ptid_get_lwp (tp->ptid));
+  int_to_threadref (&id, tp->ptid.lwp ());
   if (remote_get_threadinfo (&id, set, &threadinfo))
     if (threadinfo.active)
       {
        if (*threadinfo.shortname)
-         n += xsnprintf (&display_buf[0], sizeof (display_buf) - n,
-                         " Name: %s,", threadinfo.shortname);
+         string_appendf (extra, " Name: %s", threadinfo.shortname);
        if (*threadinfo.display)
-         n += xsnprintf (&display_buf[n], sizeof (display_buf) - n,
-                         " State: %s,", threadinfo.display);
+         {
+           if (!extra.empty ())
+             extra += ',';
+           string_appendf (extra, " State: %s", threadinfo.display);
+         }
        if (*threadinfo.more_display)
-         n += xsnprintf (&display_buf[n], sizeof (display_buf) - n,
-                         " Priority: %s", threadinfo.more_display);
-
-       if (n > 0)
          {
-           /* For purely cosmetic reasons, clear up trailing commas.  */
-           if (',' == display_buf[n-1])
-             display_buf[n-1] = ' ';
-           return display_buf;
+           if (!extra.empty ())
+             extra += ',';
+           string_appendf (extra, " Priority: %s", threadinfo.more_display);
          }
+       return extra.c_str ();
       }
   return NULL;
 }
@@ -3779,14 +4005,14 @@ remote_target::static_tracepoint_markers_by_strid (const char *strid)
 ptid_t
 remote_target::get_ada_task_ptid (long lwp, long thread)
 {
-  return ptid_build (ptid_get_pid (inferior_ptid), lwp, 0);
+  return ptid_t (inferior_ptid.pid (), lwp, 0);
 }
 \f
 
 /* Restart the remote side; this is an extended protocol operation.  */
 
-static void
-extended_remote_restart (void)
+void
+remote_target::extended_remote_restart ()
 {
   struct remote_state *rs = get_remote_state ();
 
@@ -3803,17 +4029,9 @@ extended_remote_restart (void)
 void
 remote_target::close ()
 {
-  struct remote_state *rs = get_remote_state ();
-
-  if (rs->remote_desc == NULL)
-    return; /* already closed */
-
   /* Make sure we leave stdin registered in the event loop.  */
   terminal_ours ();
 
-  serial_close (rs->remote_desc);
-  rs->remote_desc = NULL;
-
   /* We don't have a connection to the remote stub anymore.  Get rid
      of all the inferiors and their threads we were controlling.
      Reset inferior_ptid to null_ptid first, as otherwise has_stack_frame
@@ -3821,22 +4039,36 @@ remote_target::close ()
   inferior_ptid = null_ptid;
   discard_all_inferiors ();
 
-  /* We are closing the remote target, so we should discard
+  trace_reset_local_state ();
+
+  delete this;
+}
+
+remote_target::~remote_target ()
+{
+  struct remote_state *rs = get_remote_state ();
+
+  /* Check for NULL because we may get here with a partially
+     constructed target/connection.  */
+  if (rs->remote_desc == nullptr)
+    return;
+
+  serial_close (rs->remote_desc);
+
+  /* We are destroying the remote target, so we should discard
      everything of this target.  */
-  discard_pending_stop_replies_in_queue (rs);
+  discard_pending_stop_replies_in_queue ();
 
-  if (remote_async_inferior_event_token)
-    delete_async_event_handler (&remote_async_inferior_event_token);
+  if (rs->remote_async_inferior_event_token)
+    delete_async_event_handler (&rs->remote_async_inferior_event_token);
 
   remote_notif_state_xfree (rs->notif_state);
-
-  trace_reset_local_state ();
 }
 
 /* Query the remote side for the text, data and bss offsets.  */
 
-static void
-get_offsets (void)
+void
+remote_target::get_offsets ()
 {
   struct remote_state *rs = get_remote_state ();
   char *buf;
@@ -3993,8 +4225,9 @@ get_offsets (void)
 }
 
 /* Send interrupt_sequence to remote target.  */
-static void
-send_interrupt_sequence (void)
+
+void
+remote_target::send_interrupt_sequence ()
 {
   struct remote_state *rs = get_remote_state ();
 
@@ -4057,8 +4290,8 @@ stop_reply_extract_thread (char *stop_reply)
    ask the remote which is the current thread with qC.  The former
    method avoids a roundtrip.  */
 
-static ptid_t
-get_current_thread (char *wait_status)
+ptid_t
+remote_target::get_current_thread (char *wait_status)
 {
   ptid_t ptid = null_ptid;
 
@@ -4067,7 +4300,7 @@ get_current_thread (char *wait_status)
      this point.  */
   if (wait_status != NULL)
     ptid = stop_reply_extract_thread (wait_status);
-  if (ptid_equal (ptid, null_ptid))
+  if (ptid == null_ptid)
     ptid = remote_current_thread (inferior_ptid);
 
   return ptid;
@@ -4084,8 +4317,8 @@ get_current_thread (char *wait_status)
    qC query, we infer the current thread from that stop reply, passed
    in in WAIT_STATUS, which may be NULL.  */
 
-static void
-add_current_inferior_and_thread (char *wait_status)
+void
+remote_target::add_current_inferior_and_thread (char *wait_status)
 {
   struct remote_state *rs = get_remote_state ();
   int fake_pid_p = 0;
@@ -4110,7 +4343,7 @@ add_current_inferior_and_thread (char *wait_status)
       fake_pid_p = 1;
     }
 
-  remote_add_inferior (fake_pid_p, ptid_get_pid (curr_ptid), -1, 1);
+  remote_add_inferior (fake_pid_p, curr_ptid.pid (), -1, 1);
 
   /* Add the main thread and switch to it.  Don't try reading
      registers yet, since we haven't fetched the target description
@@ -4127,8 +4360,8 @@ print_one_stopped_thread (struct thread_info *thread)
 {
   struct target_waitstatus *ws = &thread->suspend.waitstatus;
 
-  switch_to_thread (thread->ptid);
-  stop_pc = get_frame_pc (get_current_frame ());
+  switch_to_thread (thread);
+  thread->suspend.stop_pc = get_frame_pc (get_current_frame ());
   set_current_sal_from_frame (get_current_frame ());
 
   thread->suspend.waitstatus_pending_p = 0;
@@ -4148,8 +4381,8 @@ print_one_stopped_thread (struct thread_info *thread)
    on initial connection.  We mark these threads as stopped and print
    their current frame before giving the user the prompt.  */
 
-static void
-process_initial_stop_replies (int from_tty)
+void
+remote_target::process_initial_stop_replies (int from_tty)
 {
   int pending_stop_replies = stop_reply_queue_length ();
   struct inferior *inf;
@@ -4165,7 +4398,6 @@ process_initial_stop_replies (int from_tty)
       ptid_t event_ptid;
       struct target_waitstatus ws;
       int ignore_event = 0;
-      struct thread_info *thread;
 
       memset (&ws, 0, sizeof (ws));
       event_ptid = target_wait (waiton_ptid, &ws, TARGET_WNOHANG);
@@ -4194,7 +4426,7 @@ process_initial_stop_replies (int from_tty)
       if (ignore_event)
        continue;
 
-      thread = find_thread_ptid (event_ptid);
+      struct thread_info *evthread = find_thread_ptid (event_ptid);
 
       if (ws.kind == TARGET_WAITKIND_STOPPED)
        {
@@ -4204,19 +4436,19 @@ process_initial_stop_replies (int from_tty)
             instead of signal 0.  Suppress it.  */
          if (sig == GDB_SIGNAL_TRAP)
            sig = GDB_SIGNAL_0;
-         thread->suspend.stop_signal = sig;
+         evthread->suspend.stop_signal = sig;
          ws.value.sig = sig;
        }
 
-      thread->suspend.waitstatus = ws;
+      evthread->suspend.waitstatus = ws;
 
       if (ws.kind != TARGET_WAITKIND_STOPPED
          || ws.value.sig != GDB_SIGNAL_0)
-       thread->suspend.waitstatus_pending_p = 1;
+       evthread->suspend.waitstatus_pending_p = 1;
 
       set_executing (event_ptid, 0);
       set_running (event_ptid, 0);
-      get_remote_thread_info (thread)->vcont_resumed = 0;
+      get_remote_thread_info (evthread)->vcont_resumed = 0;
     }
 
   /* "Notice" the new inferiors before anything related to
@@ -4230,9 +4462,8 @@ process_initial_stop_replies (int from_tty)
 
       if (non_stop)
        {
-         thread = any_live_thread_of_process (inf->pid);
-         notice_new_inferior (thread->ptid,
-                              thread->state == THREAD_RUNNING,
+         thread = any_live_thread_of_inferior (inf);
+         notice_new_inferior (thread, thread->state == THREAD_RUNNING,
                               from_tty);
        }
     }
@@ -4253,7 +4484,7 @@ process_initial_stop_replies (int from_tty)
 
          if (inf->needs_setup)
            {
-             thread = any_live_thread_of_process (inf->pid);
+             thread = any_live_thread_of_inferior (inf);
              switch_to_thread_no_regs (thread);
              setup_inferior (0);
            }
@@ -4269,7 +4500,7 @@ process_initial_stop_replies (int from_tty)
        first = thread;
 
       if (!non_stop)
-       set_running (thread->ptid, 0);
+       thread->set_running (false);
       else if (thread->state != THREAD_STOPPED)
        continue;
 
@@ -4487,7 +4718,7 @@ remote_target::start_remote (int from_tty, int extended_p)
             multi-threaded program, this will ideally be the thread
             that last reported an event before GDB disconnected.  */
          inferior_ptid = get_current_thread (wait_status);
-         if (ptid_equal (inferior_ptid, null_ptid))
+         if (inferior_ptid == null_ptid)
            {
              /* Odd... The target was able to list threads, but not
                 tell us which thread was current (no "thread"
@@ -4555,7 +4786,7 @@ remote_target::start_remote (int from_tty, int extended_p)
          /* remote_notif_get_pending_replies acks this one, and gets
             the rest out.  */
          rs->notif_state->pending_event[notif_client_stop.id]
-           = remote_notif_parse (notif, rs->buf);
+           = remote_notif_parse (this, notif, rs->buf);
          remote_notif_get_pending_events (notif);
        }
 
@@ -4667,8 +4898,8 @@ init_all_packet_configs (void)
 
 /* Symbol look-up.  */
 
-static void
-remote_check_symbols (void)
+void
+remote_target::remote_check_symbols ()
 {
   char *msg, *reply, *tmp;
   int end;
@@ -4723,7 +4954,7 @@ remote_check_symbols (void)
             instead of any data function descriptor.  */
          sym_addr = gdbarch_convert_from_func_ptr_addr (target_gdbarch (),
                                                         sym_addr,
-                                                        target_stack);
+                                                        current_top_target ());
 
          xsnprintf (msg, get_remote_packet_size (), "qSymbol:%s:%s",
                     phex_nz (sym_addr, addr_size), &reply[8]);
@@ -4805,8 +5036,8 @@ struct protocol_feature
      not reported).  The third argument may be NULL; if not NULL, it
      is a NUL-terminated string taken from the packet following
      this feature's name and an equals sign.  */
-  void (*func) (const struct protocol_feature *, enum packet_support,
-               const char *);
+  void (*func) (remote_target *remote, const struct protocol_feature *,
+               enum packet_support, const char *);
 
   /* The corresponding packet for this feature.  Only used if
      FUNC is remote_supported_packet.  */
@@ -4814,7 +5045,8 @@ struct protocol_feature
 };
 
 static void
-remote_supported_packet (const struct protocol_feature *feature,
+remote_supported_packet (remote_target *remote,
+                        const struct protocol_feature *feature,
                         enum packet_support support,
                         const char *argument)
 {
@@ -4828,9 +5060,9 @@ remote_supported_packet (const struct protocol_feature *feature,
   remote_protocol_packets[feature->packet].support = support;
 }
 
-static void
-remote_packet_size (const struct protocol_feature *feature,
-                   enum packet_support support, const char *value)
+void
+remote_target::remote_packet_size (const protocol_feature *feature,
+                                  enum packet_support support, const char *value)
 {
   struct remote_state *rs = get_remote_state ();
 
@@ -4860,6 +5092,13 @@ remote_packet_size (const struct protocol_feature *feature,
   rs->explicit_packet_size = packet_size;
 }
 
+void
+remote_packet_size (remote_target *remote, const protocol_feature *feature,
+                   enum packet_support support, const char *value)
+{
+  remote->remote_packet_size (feature, support, value);
+}
+
 static const struct protocol_feature remote_protocol_features[] = {
   { "PacketSize", PACKET_DISABLE, remote_packet_size, -1 },
   { "qXfer:auxv:read", PACKET_DISABLE, remote_supported_packet,
@@ -5011,8 +5250,8 @@ remote_query_supported_append (std::string *msg, const char *append)
   msg->append (append);
 }
 
-static void
-remote_query_supported (void)
+void
+remote_target::remote_query_supported ()
 {
   struct remote_state *rs = get_remote_state ();
   char *next;
@@ -5151,7 +5390,7 @@ remote_query_supported (void)
 
            seen[i] = 1;
            feature = &remote_protocol_features[i];
-           feature->func (feature, is_supported, value);
+           feature->func (this, feature, is_supported, value);
            break;
          }
     }
@@ -5173,7 +5412,7 @@ remote_query_supported (void)
        const struct protocol_feature *feature;
 
        feature = &remote_protocol_features[i];
-       feature->func (feature, feature->default_support, NULL);
+       feature->func (this, feature, feature->default_support, NULL);
       }
 }
 
@@ -5200,8 +5439,8 @@ remote_query_supported (void)
      is probably wedged --- offer to quit/disconnect.
 */
 
-static void
-remote_serial_quit_handler (void)
+void
+remote_target::remote_serial_quit_handler ()
 {
   struct remote_state *rs = get_remote_state ();
 
@@ -5229,6 +5468,16 @@ remote_serial_quit_handler (void)
     }
 }
 
+/* The remote_target that is current while the quit handler is
+   overridden with remote_serial_quit_handler.  */
+static remote_target *curr_quit_handler_target;
+
+static void
+remote_serial_quit_handler ()
+{
+  curr_quit_handler_target->remote_serial_quit_handler ();
+}
+
 /* Remove any of the remote.c targets from target stack.  Upper targets depend
    on it so remove them first.  */
 
@@ -5248,21 +5497,17 @@ remote_unpush_and_throw (void)
 void
 remote_target::open_1 (const char *name, int from_tty, int extended_p)
 {
-  struct remote_state *rs = get_remote_state ();
+  remote_target *curr_remote = get_current_remote_target ();
 
   if (name == 0)
     error (_("To open a remote debug connection, you need to specify what\n"
           "serial device is attached to the remote system\n"
           "(e.g. /dev/ttyS0, /dev/ttya, COM1, etc.)."));
 
-  /* See FIXME above.  */
-  if (!target_async_permitted)
-    wait_forever_enabled_p = 1;
-
   /* If we're connected to a running target, target_preopen will kill it.
      Ask this question first, before target_preopen has a chance to kill
      anything.  */
-  if (rs->remote_desc != NULL && !have_inferiors ())
+  if (curr_remote != NULL && !have_inferiors ())
     {
       if (from_tty
          && !query (_("Already connected to a remote target.  Disconnect? ")))
@@ -5272,19 +5517,20 @@ remote_target::open_1 (const char *name, int from_tty, int extended_p)
   /* Here the possibly existing remote target gets unpushed.  */
   target_preopen (from_tty);
 
-  /* Make sure we send the passed signals list the next time we resume.  */
-  xfree (rs->last_pass_packet);
-  rs->last_pass_packet = NULL;
-
-  /* Make sure we send the program signals list the next time we
-     resume.  */
-  xfree (rs->last_program_signals_packet);
-  rs->last_program_signals_packet = NULL;
-
   remote_fileio_reset ();
   reopen_exec_file ();
   reread_symbols ();
 
+  remote_target *remote
+    = (extended_p ? new extended_remote_target () : new remote_target ());
+  target_ops_up target_holder (remote);
+
+  remote_state *rs = remote->get_remote_state ();
+
+  /* See FIXME above.  */
+  if (!target_async_permitted)
+    rs->wait_forever_enabled_p = 1;
+
   rs->remote_desc = remote_serial_open (name);
   if (!rs->remote_desc)
     perror_with_name (name);
@@ -5317,15 +5563,16 @@ remote_target::open_1 (const char *name, int from_tty, int extended_p)
       puts_filtered ("\n");
     }
 
-  remote_target *target
-    = extended_p ? &extended_remote_ops : &remote_ops;
-  push_target (target);                /* Switch to using remote target now.  */
+  /* Switch to using the remote target now.  */
+  push_target (remote);
+  /* The target stack owns the target now.  */
+  target_holder.release ();
 
   /* Register extra event sources in the event loop.  */
-  remote_async_inferior_event_token
+  rs->remote_async_inferior_event_token
     = create_async_event_handler (remote_async_inferior_event_handler,
-                                 NULL);
-  rs->notif_state = remote_notif_state_allocate ();
+                                 remote);
+  rs->notif_state = remote_notif_state_allocate (remote);
 
   /* Reset the target state; these things will be queried either by
      remote_query_supported or as they are needed.  */
@@ -5359,7 +5606,7 @@ remote_target::open_1 (const char *name, int from_tty, int extended_p)
         around this.  Eventually a mechanism that allows
         wait_for_inferior() to expect/get timeouts will be
         implemented.  */
-      wait_forever_enabled_p = 0;
+      rs->wait_forever_enabled_p = 0;
     }
 
   /* First delete any symbols previously loaded from shared libraries.  */
@@ -5387,34 +5634,40 @@ remote_target::open_1 (const char *name, int from_tty, int extended_p)
 
     TRY
       {
-       target->start_remote (from_tty, extended_p);
+       remote->start_remote (from_tty, extended_p);
       }
     CATCH (ex, RETURN_MASK_ALL)
       {
        /* Pop the partially set up target - unless something else did
           already before throwing the exception.  */
-       if (rs->remote_desc != NULL)
+       if (ex.error != TARGET_CLOSE_ERROR)
          remote_unpush_target ();
-       if (target_async_permitted)
-         wait_forever_enabled_p = 1;
        throw_exception (ex);
       }
     END_CATCH
   }
 
-  remote_btrace_reset ();
+  remote_btrace_reset (rs);
 
   if (target_async_permitted)
-    wait_forever_enabled_p = 1;
+    rs->wait_forever_enabled_p = 1;
 }
 
 /* Detach the specified process.  */
 
-static void
-remote_detach_pid (int pid)
+void
+remote_target::remote_detach_pid (int pid)
 {
   struct remote_state *rs = get_remote_state ();
 
+  /* This should not be necessary, but the handling for D;PID in
+     GDBserver versions prior to 8.2 incorrectly assumes that the
+     selected process points to the same process we're detaching,
+     leading to misbehavior (and possibly GDBserver crashing) when it
+     does not.  Since it's easy and cheap, work around it by forcing
+     GDBserver to select GDB's current process.  */
+  set_general_process ();
+
   if (remote_multi_process_p (rs))
     xsnprintf (rs->buf, get_remote_packet_size (), "D;%x", pid);
   else
@@ -5437,12 +5690,11 @@ remote_detach_pid (int pid)
    any breakpoints in the target program or it'll die when it hits
    one.  */
 
-static void
-remote_detach_1 (int from_tty, inferior *inf)
+void
+remote_target::remote_detach_1 (inferior *inf, int from_tty)
 {
-  int pid = ptid_get_pid (inferior_ptid);
+  int pid = inferior_ptid.pid ();
   struct remote_state *rs = get_remote_state ();
-  struct thread_info *tp = find_thread_ptid (inferior_ptid);
   int is_fork_parent;
 
   if (!target_has_execution)
@@ -5457,6 +5709,8 @@ remote_detach_1 (int from_tty, inferior *inf)
   if (from_tty && !rs->extended && number_of_live_inferiors () == 1)
     puts_filtered (_("Ending remote debugging.\n"));
 
+  struct thread_info *tp = find_thread_ptid (inferior_ptid);
+
   /* Check to see if we are detaching a fork parent.  Note that if we
      are detaching a fork child, tp == NULL.  */
   is_fork_parent = (tp != NULL
@@ -5468,7 +5722,7 @@ remote_detach_1 (int from_tty, inferior *inf)
     {
       /* Save the pid as a string before mourning, since that will
         unpush the remote target, and we need the string after.  */
-      std::string infpid = target_pid_to_str (pid_to_ptid (pid));
+      std::string infpid = target_pid_to_str (ptid_t (pid));
 
       target_mourn_inferior (inferior_ptid);
       if (print_inferior_events)
@@ -5478,20 +5732,20 @@ remote_detach_1 (int from_tty, inferior *inf)
   else
     {
       inferior_ptid = null_ptid;
-      detach_inferior (pid);
+      detach_inferior (current_inferior ());
     }
 }
 
 void
 remote_target::detach (inferior *inf, int from_tty)
 {
-  remote_detach_1 (from_tty, inf);
+  remote_detach_1 (inf, from_tty);
 }
 
 void
 extended_remote_target::detach (inferior *inf, int from_tty)
 {
-  remote_detach_1 (from_tty, inf);
+  remote_detach_1 (inf, from_tty);
 }
 
 /* Target follow-fork function for remote targets.  On entry, and
@@ -5523,7 +5777,7 @@ remote_target::follow_fork (int follow_child, int detach_fork)
          pid_t child_pid;
 
          child_ptid = inferior_thread ()->pending_follow.value.related_pid;
-         child_pid = ptid_get_pid (child_ptid);
+         child_pid = child_ptid.pid ();
 
          remote_detach_pid (child_pid);
        }
@@ -5590,10 +5844,10 @@ extended_remote_target::attach (const char *args, int from_tty)
 
       if (exec_file)
        printf_unfiltered (_("Attaching to program: %s, %s\n"), exec_file,
-                          target_pid_to_str (pid_to_ptid (pid)));
+                          target_pid_to_str (ptid_t (pid)));
       else
        printf_unfiltered (_("Attaching to %s\n"),
-                          target_pid_to_str (pid_to_ptid (pid)));
+                          target_pid_to_str (ptid_t (pid)));
 
       gdb_flush (gdb_stdout);
     }
@@ -5614,19 +5868,19 @@ extended_remote_target::attach (const char *args, int from_tty)
        }
       else if (strcmp (rs->buf, "OK") != 0)
        error (_("Attaching to %s failed with: %s"),
-              target_pid_to_str (pid_to_ptid (pid)),
+              target_pid_to_str (ptid_t (pid)),
               rs->buf);
       break;
     case PACKET_UNKNOWN:
       error (_("This target does not support attaching to a process"));
     default:
       error (_("Attaching to %s failed"),
-            target_pid_to_str (pid_to_ptid (pid)));
+            target_pid_to_str (ptid_t (pid)));
     }
 
   set_current_inferior (remote_add_inferior (0, pid, 1, 0));
 
-  inferior_ptid = pid_to_ptid (pid);
+  inferior_ptid = ptid_t (pid);
 
   if (target_is_non_stop_p ())
     {
@@ -5635,11 +5889,11 @@ extended_remote_target::attach (const char *args, int from_tty)
       /* Get list of threads.  */
       update_thread_list ();
 
-      thread = first_thread_of_process (pid);
+      thread = first_thread_of_inferior (current_inferior ());
       if (thread)
        inferior_ptid = thread->ptid;
       else
-       inferior_ptid = pid_to_ptid (pid);
+       inferior_ptid = ptid_t (pid);
 
       /* Invalidate our notion of the remote current thread.  */
       record_currthread (rs, minus_one_ptid);
@@ -5668,7 +5922,7 @@ extended_remote_target::attach (const char *args, int from_tty)
       if (target_can_async_p ())
        {
          struct notif_event *reply
-           =  remote_notif_parse (&notif_client_stop, wait_status);
+           =  remote_notif_parse (this, &notif_client_stop, wait_status);
 
          push_stop_reply ((struct stop_reply *) reply);
 
@@ -5706,9 +5960,10 @@ extended_remote_target::post_attach (int pid)
 /* Check for the availability of vCont.  This function should also check
    the response.  */
 
-static void
-remote_vcont_probe (struct remote_state *rs)
+void
+remote_target::remote_vcont_probe ()
 {
+  remote_state *rs = get_remote_state ();
   char *buf;
 
   strcpy (rs->buf, "vCont?");
@@ -5766,9 +6021,9 @@ remote_vcont_probe (struct remote_state *rs)
    the thread to be stepped and/or signalled is given in the global
    INFERIOR_PTID.  */
 
-static char *
-append_resumption (char *p, char *endp,
-                  ptid_t ptid, int step, enum gdb_signal siggnal)
+char *
+remote_target::append_resumption (char *p, char *endp,
+                                 ptid_t ptid, int step, gdb_signal siggnal)
 {
   struct remote_state *rs = get_remote_state ();
 
@@ -5783,11 +6038,11 @@ 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 (ptid)))
+          && !(remote_multi_process_p (rs) && ptid.is_pid ()))
     {
       struct thread_info *tp;
 
-      if (ptid_equal (ptid, minus_one_ptid))
+      if (ptid == minus_one_ptid)
        {
          /* If we don't know about the target thread's tid, then
             we're resuming magic_null_ptid (see caller).  */
@@ -5817,17 +6072,17 @@ append_resumption (char *p, char *endp,
   else
     p += xsnprintf (p, endp - p, ";c");
 
-  if (remote_multi_process_p (rs) && ptid_is_pid (ptid))
+  if (remote_multi_process_p (rs) && ptid.is_pid ())
     {
       ptid_t nptid;
 
       /* All (-1) threads of process.  */
-      nptid = ptid_build (ptid_get_pid (ptid), -1, 0);
+      nptid = ptid_t (ptid.pid (), -1, 0);
 
       p += xsnprintf (p, endp - p, ":");
       p = write_ptid (p, endp, nptid);
     }
-  else if (!ptid_equal (ptid, minus_one_ptid))
+  else if (ptid != minus_one_ptid)
     {
       p += xsnprintf (p, endp - p, ":");
       p = write_ptid (p, endp, ptid);
@@ -5853,14 +6108,15 @@ resume_clear_thread_private_info (struct thread_info *thread)
 /* Append a vCont continue-with-signal action for threads that have a
    non-zero stop signal.  */
 
-static char *
-append_pending_thread_resumptions (char *p, char *endp, ptid_t ptid)
+char *
+remote_target::append_pending_thread_resumptions (char *p, char *endp,
+                                                 ptid_t ptid)
 {
   struct thread_info *thread;
 
   ALL_NON_EXITED_THREADS (thread)
-    if (ptid_match (thread->ptid, ptid)
-       && !ptid_equal (inferior_ptid, thread->ptid)
+    if (thread->ptid.matches (ptid)
+       && inferior_ptid != thread->ptid
        && thread->suspend.stop_signal != GDB_SIGNAL_0)
       {
        p = append_resumption (p, endp, thread->ptid,
@@ -5875,9 +6131,9 @@ append_pending_thread_resumptions (char *p, char *endp, ptid_t ptid)
 /* Set the target running, using the packets that use Hc
    (c/s/C/S).  */
 
-static void
-remote_resume_with_hc (struct target_ops *ops,
-                      ptid_t ptid, int step, enum gdb_signal siggnal)
+void
+remote_target::remote_resume_with_hc (ptid_t ptid, int step,
+                                     gdb_signal siggnal)
 {
   struct remote_state *rs = get_remote_state ();
   struct thread_info *thread;
@@ -5888,7 +6144,7 @@ remote_resume_with_hc (struct target_ops *ops,
 
   /* The c/s/C/S resume packets use Hc, so set the continue
      thread.  */
-  if (ptid_equal (ptid, minus_one_ptid))
+  if (ptid == minus_one_ptid)
     set_continue_thread (any_thread_ptid);
   else
     set_continue_thread (ptid);
@@ -5897,7 +6153,7 @@ remote_resume_with_hc (struct target_ops *ops,
     resume_clear_thread_private_info (thread);
 
   buf = rs->buf;
-  if (execution_direction == EXEC_REVERSE)
+  if (::execution_direction == EXEC_REVERSE)
     {
       /* We don't pass signals to the target in reverse exec mode.  */
       if (info_verbose && siggnal != GDB_SIGNAL_0)
@@ -5934,19 +6190,20 @@ remote_resume_with_hc (struct target_ops *ops,
    This function issues a strict subset of all possible vCont commands
    at the moment.  */
 
-static int
-remote_resume_with_vcont (ptid_t ptid, int step, enum gdb_signal siggnal)
+int
+remote_target::remote_resume_with_vcont (ptid_t ptid, int step,
+                                        enum gdb_signal siggnal)
 {
   struct remote_state *rs = get_remote_state ();
   char *p;
   char *endp;
 
   /* No reverse execution actions defined for vCont.  */
-  if (execution_direction == EXEC_REVERSE)
+  if (::execution_direction == EXEC_REVERSE)
     return 0;
 
   if (packet_support (PACKET_vCont) == PACKET_SUPPORT_UNKNOWN)
-    remote_vcont_probe (rs);
+    remote_vcont_probe ();
 
   if (packet_support (PACKET_vCont) == PACKET_DISABLE)
     return 0;
@@ -5960,7 +6217,7 @@ remote_resume_with_vcont (ptid_t ptid, int step, enum gdb_signal siggnal)
 
   p += xsnprintf (p, endp - p, "vCont");
 
-  if (ptid_equal (ptid, magic_null_ptid))
+  if (ptid == magic_null_ptid)
     {
       /* MAGIC_NULL_PTID means that we don't have any active threads,
         so we don't have any TID numbers the inferior will
@@ -5968,7 +6225,7 @@ remote_resume_with_vcont (ptid_t ptid, int step, enum gdb_signal siggnal)
         a TID.  */
       append_resumption (p, endp, minus_one_ptid, step, siggnal);
     }
-  else if (ptid_equal (ptid, minus_one_ptid) || ptid_is_pid (ptid))
+  else if (ptid == minus_one_ptid || ptid.is_pid ())
     {
       /* Resume all threads (of all processes, or of a single
         process), with preference for INFERIOR_PTID.  This assumes
@@ -6027,7 +6284,7 @@ remote_target::resume (ptid_t ptid, int step, enum gdb_signal siggnal)
     {
       remote_thread_info *remote_thr;
 
-      if (ptid_equal (minus_one_ptid, ptid) || ptid_is_pid (ptid))
+      if (minus_one_ptid == ptid || ptid.is_pid ())
        remote_thr = get_remote_thread_info (inferior_ptid);
       else
        remote_thr = get_remote_thread_info (ptid);
@@ -6050,7 +6307,7 @@ remote_target::resume (ptid_t ptid, int step, enum gdb_signal siggnal)
 
   /* Prefer vCont, and fallback to s/c/S/C, which use Hc.  */
   if (!remote_resume_with_vcont (ptid, step, siggnal))
-    remote_resume_with_hc (this, ptid, step, siggnal);
+    remote_resume_with_hc (ptid, step, siggnal);
 
   /* We are about to start executing the inferior, let's register it
      with the event loop.  NOTE: this is the one place where all the
@@ -6073,8 +6330,6 @@ remote_target::resume (ptid_t ptid, int step, enum gdb_signal siggnal)
     rs->waiting_for_stop_reply = 1;
 }
 
-static void check_pending_events_prevent_wildcard_vcont
-  (int *may_global_wildcard_vcont);
 static int is_pending_fork_parent_thread (struct thread_info *thread);
 
 /* Private per-inferior info for target remote processes.  */
@@ -6096,50 +6351,66 @@ get_remote_inferior (inferior *inf)
   return static_cast<remote_inferior *> (inf->priv.get ());
 }
 
-/* Structure used to track the construction of a vCont packet in the
+/* Class used to track the construction of a vCont packet in the
    outgoing packet buffer.  This is used to send multiple vCont
    packets if we have more actions than would fit a single packet.  */
 
-struct vcont_builder
+class vcont_builder
 {
+public:
+  explicit vcont_builder (remote_target *remote)
+    : m_remote (remote)
+  {
+    restart ();
+  }
+
+  void flush ();
+  void push_action (ptid_t ptid, bool step, gdb_signal siggnal);
+
+private:
+  void restart ();
+
+  /* The remote target.  */
+  remote_target *m_remote;
+
   /* Pointer to the first action.  P points here if no action has been
      appended yet.  */
-  char *first_action;
+  char *m_first_action;
 
   /* Where the next action will be appended.  */
-  char *p;
+  char *m_p;
 
   /* The end of the buffer.  Must never write past this.  */
-  char *endp;
+  char *m_endp;
 };
 
 /* Prepare the outgoing buffer for a new vCont packet.  */
 
-static void
-vcont_builder_restart (struct vcont_builder *builder)
+void
+vcont_builder::restart ()
 {
-  struct remote_state *rs = get_remote_state ();
+  struct remote_state *rs = m_remote->get_remote_state ();
 
-  builder->p = rs->buf;
-  builder->endp = rs->buf + get_remote_packet_size ();
-  builder->p += xsnprintf (builder->p, builder->endp - builder->p, "vCont");
-  builder->first_action = builder->p;
+  m_p = rs->buf;
+  m_endp = rs->buf + m_remote->get_remote_packet_size ();
+  m_p += xsnprintf (m_p, m_endp - m_p, "vCont");
+  m_first_action = m_p;
 }
 
 /* If the vCont packet being built has any action, send it to the
    remote end.  */
 
-static void
-vcont_builder_flush (struct vcont_builder *builder)
+void
+vcont_builder::flush ()
 {
   struct remote_state *rs;
 
-  if (builder->p == builder->first_action)
+  if (m_p == m_first_action)
     return;
 
-  rs = get_remote_state ();
-  putpkt (rs->buf);
-  getpkt (&rs->buf, &rs->buf_size, 0);
+  rs = m_remote->get_remote_state ();
+  m_remote->putpkt (rs->buf);
+  m_remote->getpkt (&rs->buf, &rs->buf_size, 0);
   if (strcmp (rs->buf, "OK") != 0)
     error (_("Unexpected vCont reply in non-stop mode: %s"), rs->buf);
 }
@@ -6155,33 +6426,30 @@ vcont_builder_flush (struct vcont_builder *builder)
    what we've got so far to the remote end and start over a new vCont
    packet (with the new action).  */
 
-static void
-vcont_builder_push_action (struct vcont_builder *builder,
-                          ptid_t ptid, int step, enum gdb_signal siggnal)
+void
+vcont_builder::push_action (ptid_t ptid, bool step, gdb_signal siggnal)
 {
   char buf[MAX_ACTION_SIZE + 1];
-  char *endp;
-  size_t rsize;
 
-  endp = append_resumption (buf, buf + sizeof (buf),
-                           ptid, step, siggnal);
+  char *endp = m_remote->append_resumption (buf, buf + sizeof (buf),
+                                           ptid, step, siggnal);
 
   /* Check whether this new action would fit in the vCont packet along
      with previous actions.  If not, send what we've got so far and
      start a new vCont packet.  */
-  rsize = endp - buf;
-  if (rsize > builder->endp - builder->p)
+  size_t rsize = endp - buf;
+  if (rsize > m_endp - m_p)
     {
-      vcont_builder_flush (builder);
-      vcont_builder_restart (builder);
+      flush ();
+      restart ();
 
       /* Should now fit.  */
-      gdb_assert (rsize <= builder->endp - builder->p);
+      gdb_assert (rsize <= m_endp - m_p);
     }
 
-  memcpy (builder->p, buf, rsize);
-  builder->p += rsize;
-  *builder->p = '\0';
+  memcpy (m_p, buf, rsize);
+  m_p += rsize;
+  *m_p = '\0';
 }
 
 /* to_commit_resume implementation.  */
@@ -6193,7 +6461,6 @@ remote_target::commit_resume ()
   struct thread_info *tp;
   int any_process_wildcard;
   int may_global_wildcard_vcont;
-  struct vcont_builder vcont_builder;
 
   /* If connected in all-stop mode, we'd send the remote resume
      request directly from remote_resume.  Likewise if
@@ -6291,7 +6558,7 @@ remote_target::commit_resume ()
      we end up with too many actions for a single packet vcont_builder
      flushes the current vCont packet to the remote side and starts a
      new one.  */
-  vcont_builder_restart (&vcont_builder);
+  struct vcont_builder vcont_builder (this);
 
   /* Threads first.  */
   ALL_NON_EXITED_THREADS (tp)
@@ -6312,7 +6579,7 @@ remote_target::commit_resume ()
          continue;
        }
 
-      vcont_builder_push_action (&vcont_builder, tp->ptid,
+      vcont_builder.push_action (tp->ptid,
                                 remote_thr->last_resume_step,
                                 remote_thr->last_resume_sig);
       remote_thr->vcont_resumed = 1;
@@ -6339,8 +6606,8 @@ remote_target::commit_resume ()
         continue action for each running process, if any.  */
       if (may_global_wildcard_vcont)
        {
-         vcont_builder_push_action (&vcont_builder, minus_one_ptid,
-                                    0, GDB_SIGNAL_0);
+         vcont_builder.push_action (minus_one_ptid,
+                                    false, GDB_SIGNAL_0);
        }
       else
        {
@@ -6348,15 +6615,14 @@ remote_target::commit_resume ()
            {
              if (get_remote_inferior (inf)->may_wildcard_vcont)
                {
-                 vcont_builder_push_action (&vcont_builder,
-                                            pid_to_ptid (inf->pid),
-                                            0, GDB_SIGNAL_0);
+                 vcont_builder.push_action (ptid_t (inf->pid),
+                                            false, GDB_SIGNAL_0);
                }
            }
        }
     }
 
-  vcont_builder_flush (&vcont_builder);
+  vcont_builder.flush ();
 }
 
 \f
@@ -6365,21 +6631,21 @@ remote_target::commit_resume ()
    thread, all threads of a remote process, or all threads of all
    processes.  */
 
-static void
-remote_stop_ns (ptid_t ptid)
+void
+remote_target::remote_stop_ns (ptid_t ptid)
 {
   struct remote_state *rs = get_remote_state ();
   char *p = rs->buf;
   char *endp = rs->buf + get_remote_packet_size ();
 
   if (packet_support (PACKET_vCont) == PACKET_SUPPORT_UNKNOWN)
-    remote_vcont_probe (rs);
+    remote_vcont_probe ();
 
   if (!rs->supports_vCont.t)
     error (_("Remote server does not support stopping threads"));
 
-  if (ptid_equal (ptid, minus_one_ptid)
-      || (!remote_multi_process_p (rs) && ptid_is_pid (ptid)))
+  if (ptid == minus_one_ptid
+      || (!remote_multi_process_p (rs) && ptid.is_pid ()))
     p += xsnprintf (p, endp - p, "vCont;t");
   else
     {
@@ -6387,9 +6653,9 @@ remote_stop_ns (ptid_t ptid)
 
       p += xsnprintf (p, endp - p, "vCont;t:");
 
-      if (ptid_is_pid (ptid))
+      if (ptid.is_pid ())
          /* All (-1) threads of process.  */
-       nptid = ptid_build (ptid_get_pid (ptid), -1, 0);
+       nptid = ptid_t (ptid.pid (), -1, 0);
       else
        {
          /* Small optimization: if we already have a stop reply for
@@ -6416,8 +6682,8 @@ remote_stop_ns (ptid_t ptid)
    interrupt the remote target.  It is undefined which thread of which
    process reports the interrupt.  */
 
-static void
-remote_interrupt_as (void)
+void
+remote_target::remote_interrupt_as ()
 {
   struct remote_state *rs = get_remote_state ();
 
@@ -6438,8 +6704,8 @@ remote_interrupt_as (void)
    reports the interrupt.  Throws an error if the packet is not
    supported by the server.  */
 
-static void
-remote_interrupt_ns (void)
+void
+remote_target::remote_interrupt_ns ()
 {
   struct remote_state *rs = get_remote_state ();
   char *p = rs->buf;
@@ -6518,8 +6784,8 @@ remote_target::pass_ctrlc ()
 
 /* Ask the user what to do when an interrupt is received.  */
 
-static void
-interrupt_query (void)
+void
+remote_target::interrupt_query ()
 {
   struct remote_state *rs = get_remote_state ();
 
@@ -6607,17 +6873,6 @@ typedef struct stop_reply
   int core;
 } *stop_reply_p;
 
-DECLARE_QUEUE_P (stop_reply_p);
-DEFINE_QUEUE_P (stop_reply_p);
-/* The list of already fetched and acknowledged stop events.  This
-   queue is used for notification Stop, and other notifications
-   don't need queue for their events, because the notification events
-   of Stop can't be consumed immediately, so that events should be
-   queued first, and be consumed by remote_wait_{ns,as} one per
-   time.  Other notifications can consume their events immediately,
-   so queue is not needed for them.  */
-static QUEUE (stop_reply_p) *stop_reply_queue;
-
 static void
 stop_reply_xfree (struct stop_reply *r)
 {
@@ -6626,44 +6881,51 @@ stop_reply_xfree (struct stop_reply *r)
 
 /* Return the length of the stop reply queue.  */
 
-static int
-stop_reply_queue_length (void)
+int
+remote_target::stop_reply_queue_length ()
 {
-  return QUEUE_length (stop_reply_p, stop_reply_queue);
+  remote_state *rs = get_remote_state ();
+  return rs->stop_reply_queue.size ();
 }
 
-static void
-remote_notif_stop_parse (struct notif_client *self, char *buf,
+void
+remote_notif_stop_parse (remote_target *remote,
+                        struct notif_client *self, char *buf,
                         struct notif_event *event)
 {
-  remote_parse_stop_reply (buf, (struct stop_reply *) event);
+  remote->remote_parse_stop_reply (buf, (struct stop_reply *) event);
 }
 
 static void
-remote_notif_stop_ack (struct notif_client *self, char *buf,
+remote_notif_stop_ack (remote_target *remote,
+                      struct notif_client *self, char *buf,
                       struct notif_event *event)
 {
   struct stop_reply *stop_reply = (struct stop_reply *) event;
 
   /* acknowledge */
-  putpkt (self->ack_command);
+  putpkt (remote, self->ack_command);
 
   if (stop_reply->ws.kind == TARGET_WAITKIND_IGNORE)
+    {
       /* We got an unknown stop reply.  */
       error (_("Unknown stop reply"));
+    }
 
-  push_stop_reply (stop_reply);
+  remote->push_stop_reply (stop_reply);
 }
 
 static int
-remote_notif_stop_can_get_pending_events (struct notif_client *self)
+remote_notif_stop_can_get_pending_events (remote_target *remote,
+                                         struct notif_client *self)
 {
   /* We can't get pending events in remote_notif_process for
      notification stop, and we have to do this in remote_wait_ns
      instead.  If we fetch all queued events from stub, remote stub
      may exit and we have no chance to process them back in
      remote_wait_ns.  */
-  mark_async_event_handler (remote_async_inferior_event_token);
+  remote_state *rs = remote->get_remote_state ();
+  mark_async_event_handler (rs->remote_async_inferior_event_token);
   return 0;
 }
 
@@ -6706,14 +6968,6 @@ struct notif_client notif_client_stop =
   REMOTE_NOTIF_STOP,
 };
 
-/* A parameter to pass data in and out.  */
-
-struct queue_iter_param
-{
-  void *input;
-  struct stop_reply *output;
-};
-
 /* Determine if THREAD_PTID is a pending fork parent thread.  ARG contains
    the pid of the process that owns the threads we want to check, or
    -1 if we want to check all threads.  */
@@ -6725,7 +6979,7 @@ is_pending_fork_parent (struct target_waitstatus *ws, int event_pid,
   if (ws->kind == TARGET_WAITKIND_FORKED
       || ws->kind == TARGET_WAITKIND_VFORKED)
     {
-      if (event_pid == -1 || event_pid == ptid_get_pid (thread_ptid))
+      if (event_pid == -1 || event_pid == thread_ptid.pid ())
        return 1;
     }
 
@@ -6755,40 +7009,18 @@ is_pending_fork_parent_thread (struct thread_info *thread)
   return is_pending_fork_parent (ws, pid, thread->ptid);
 }
 
-/* Check whether EVENT is a fork event, and if it is, remove the
-   fork child from the context list passed in DATA.  */
-
-static int
-remove_child_of_pending_fork (QUEUE (stop_reply_p) *q,
-                             QUEUE_ITER (stop_reply_p) *iter,
-                             stop_reply_p event,
-                             void *data)
-{
-  struct queue_iter_param *param = (struct queue_iter_param *) data;
-  struct threads_listing_context *context
-    = (struct threads_listing_context *) param->input;
-
-  if (event->ws.kind == TARGET_WAITKIND_FORKED
-      || event->ws.kind == TARGET_WAITKIND_VFORKED
-      || event->ws.kind == TARGET_WAITKIND_THREAD_EXITED)
-    context->remove_thread (event->ws.value.related_pid);
-
-  return 1;
-}
-
 /* If CONTEXT contains any fork child threads that have not been
    reported yet, remove them from the CONTEXT list.  If such a
    thread exists it is because we are stopped at a fork catchpoint
    and have not yet called follow_fork, which will set up the
    host-side data structures for the new process.  */
 
-static void
-remove_new_fork_children (struct threads_listing_context *context)
+void
+remote_target::remove_new_fork_children (threads_listing_context *context)
 {
   struct thread_info * thread;
   int pid = -1;
   struct notif_client *notif = &notif_client_stop;
-  struct queue_iter_param param;
 
   /* For any threads stopped at a fork event, remove the corresponding
      fork child threads from the CONTEXT list.  */
@@ -6804,43 +7036,11 @@ remove_new_fork_children (struct threads_listing_context *context)
      in process PID and remove those fork child threads from the
      CONTEXT list as well.  */
   remote_notif_get_pending_events (notif);
-  param.input = context;
-  param.output = NULL;
-  QUEUE_iterate (stop_reply_p, stop_reply_queue,
-                remove_child_of_pending_fork, &param);
-}
-
-/* Check whether EVENT would prevent a global or process wildcard
-   vCont action.  */
-
-static int
-check_pending_event_prevents_wildcard_vcont_callback
-  (QUEUE (stop_reply_p) *q,
-   QUEUE_ITER (stop_reply_p) *iter,
-   stop_reply_p event,
-   void *data)
-{
-  struct inferior *inf;
-  int *may_global_wildcard_vcont = (int *) data;
-
-  if (event->ws.kind == TARGET_WAITKIND_NO_RESUMED
-      || event->ws.kind == TARGET_WAITKIND_NO_HISTORY)
-    return 1;
-
-  if (event->ws.kind == TARGET_WAITKIND_FORKED
-      || event->ws.kind == TARGET_WAITKIND_VFORKED)
-    *may_global_wildcard_vcont = 0;
-
-  inf = find_inferior_ptid (event->ptid);
-
-  /* This may be the first time we heard about this process.
-     Regardless, we must not do a global wildcard resume, otherwise
-     we'd resume this process too.  */
-  *may_global_wildcard_vcont = 0;
-  if (inf != NULL)
-    get_remote_inferior (inf)->may_wildcard_vcont = false;
-
-  return 1;
+  for (auto &event : get_remote_state ()->stop_reply_queue)
+    if (event->ws.kind == TARGET_WAITKIND_FORKED
+       || event->ws.kind == TARGET_WAITKIND_VFORKED
+       || event->ws.kind == TARGET_WAITKIND_THREAD_EXITED)
+      context->remove_thread (event->ws.value.related_pid);
 }
 
 /* Check whether any event pending in the vStopped queue would prevent
@@ -6849,44 +7049,39 @@ check_pending_event_prevents_wildcard_vcont_callback
    and clear the event inferior's may_wildcard_vcont flag if we can't
    do a process-wide wildcard resume (vCont;c:pPID.-1).  */
 
-static void
-check_pending_events_prevent_wildcard_vcont (int *may_global_wildcard)
+void
+remote_target::check_pending_events_prevent_wildcard_vcont
+  (int *may_global_wildcard)
 {
   struct notif_client *notif = &notif_client_stop;
 
   remote_notif_get_pending_events (notif);
-  QUEUE_iterate (stop_reply_p, stop_reply_queue,
-                check_pending_event_prevents_wildcard_vcont_callback,
-                may_global_wildcard);
-}
+  for (auto &event : get_remote_state ()->stop_reply_queue)
+    {
+      if (event->ws.kind == TARGET_WAITKIND_NO_RESUMED
+         || event->ws.kind == TARGET_WAITKIND_NO_HISTORY)
+       continue;
 
-/* Remove stop replies in the queue if its pid is equal to the given
-   inferior's pid.  */
+      if (event->ws.kind == TARGET_WAITKIND_FORKED
+         || event->ws.kind == TARGET_WAITKIND_VFORKED)
+       *may_global_wildcard = 0;
 
-static int
-remove_stop_reply_for_inferior (QUEUE (stop_reply_p) *q,
-                               QUEUE_ITER (stop_reply_p) *iter,
-                               stop_reply_p event,
-                               void *data)
-{
-  struct queue_iter_param *param = (struct queue_iter_param *) data;
-  struct inferior *inf = (struct inferior *) param->input;
+      struct inferior *inf = find_inferior_ptid (event->ptid);
 
-  if (ptid_get_pid (event->ptid) == inf->pid)
-    {
-      stop_reply_xfree (event);
-      QUEUE_remove_elem (stop_reply_p, q, iter);
+      /* This may be the first time we heard about this process.
+        Regardless, we must not do a global wildcard resume, otherwise
+        we'd resume this process too.  */
+      *may_global_wildcard = 0;
+      if (inf != NULL)
+       get_remote_inferior (inf)->may_wildcard_vcont = false;
     }
-
-  return 1;
 }
 
 /* Discard all pending stop replies of inferior INF.  */
 
-static void
-discard_pending_stop_replies (struct inferior *inf)
+void
+remote_target::discard_pending_stop_replies (struct inferior *inf)
 {
-  struct queue_iter_param param;
   struct stop_reply *reply;
   struct remote_state *rs = get_remote_state ();
   struct remote_notif_state *rns = rs->notif_state;
@@ -6899,96 +7094,70 @@ discard_pending_stop_replies (struct inferior *inf)
   reply = (struct stop_reply *) rns->pending_event[notif_client_stop.id];
 
   /* Discard the in-flight notification.  */
-  if (reply != NULL && ptid_get_pid (reply->ptid) == inf->pid)
-    {
-      stop_reply_xfree (reply);
-      rns->pending_event[notif_client_stop.id] = NULL;
-    }
-
-  param.input = inf;
-  param.output = NULL;
-  /* Discard the stop replies we have already pulled with
-     vStopped.  */
-  QUEUE_iterate (stop_reply_p, stop_reply_queue,
-                remove_stop_reply_for_inferior, &param);
-}
-
-/* If its remote state is equal to the given remote state,
-   remove EVENT from the stop reply queue.  */
-
-static int
-remove_stop_reply_of_remote_state (QUEUE (stop_reply_p) *q,
-                                  QUEUE_ITER (stop_reply_p) *iter,
-                                  stop_reply_p event,
-                                  void *data)
-{
-  struct queue_iter_param *param = (struct queue_iter_param *) data;
-  struct remote_state *rs = (struct remote_state *) param->input;
-
-  if (event->rs == rs)
+  if (reply != NULL && reply->ptid.pid () == inf->pid)
     {
-      stop_reply_xfree (event);
-      QUEUE_remove_elem (stop_reply_p, q, iter);
+      stop_reply_xfree (reply);
+      rns->pending_event[notif_client_stop.id] = NULL;
     }
 
-  return 1;
+  /* Discard the stop replies we have already pulled with
+     vStopped.  */
+  auto iter = std::remove_if (rs->stop_reply_queue.begin (),
+                             rs->stop_reply_queue.end (),
+                             [=] (const stop_reply_up &event)
+                             {
+                               return event->ptid.pid () == inf->pid;
+                             });
+  rs->stop_reply_queue.erase (iter, rs->stop_reply_queue.end ());
 }
 
 /* Discard the stop replies for RS in stop_reply_queue.  */
 
-static void
-discard_pending_stop_replies_in_queue (struct remote_state *rs)
+void
+remote_target::discard_pending_stop_replies_in_queue ()
 {
-  struct queue_iter_param param;
+  remote_state *rs = get_remote_state ();
 
-  param.input = rs;
-  param.output = NULL;
   /* Discard the stop replies we have already pulled with
      vStopped.  */
-  QUEUE_iterate (stop_reply_p, stop_reply_queue,
-                remove_stop_reply_of_remote_state, &param);
-}
-
-/* A parameter to pass data in and out.  */
-
-static int
-remote_notif_remove_once_on_match (QUEUE (stop_reply_p) *q,
-                                  QUEUE_ITER (stop_reply_p) *iter,
-                                  stop_reply_p event,
-                                  void *data)
-{
-  struct queue_iter_param *param = (struct queue_iter_param *) data;
-  ptid_t *ptid = (ptid_t *) param->input;
-
-  if (ptid_match (event->ptid, *ptid))
-    {
-      param->output = event;
-      QUEUE_remove_elem (stop_reply_p, q, iter);
-      return 0;
-    }
-
-  return 1;
+  auto iter = std::remove_if (rs->stop_reply_queue.begin (),
+                             rs->stop_reply_queue.end (),
+                             [=] (const stop_reply_up &event)
+                             {
+                               return event->rs == rs;
+                             });
+  rs->stop_reply_queue.erase (iter, rs->stop_reply_queue.end ());
 }
 
 /* Remove the first reply in 'stop_reply_queue' which matches
    PTID.  */
 
-static struct stop_reply *
-remote_notif_remove_queued_reply (ptid_t ptid)
+struct stop_reply *
+remote_target::remote_notif_remove_queued_reply (ptid_t ptid)
 {
-  struct queue_iter_param param;
+  remote_state *rs = get_remote_state ();
 
-  param.input = &ptid;
-  param.output = NULL;
+  auto iter = std::find_if (rs->stop_reply_queue.begin (),
+                           rs->stop_reply_queue.end (),
+                           [=] (const stop_reply_up &event)
+                           {
+                             return event->ptid.matches (ptid);
+                           });
+  struct stop_reply *result;
+  if (iter == rs->stop_reply_queue.end ())
+    result = nullptr;
+  else
+    {
+      result = iter->release ();
+      rs->stop_reply_queue.erase (iter);
+    }
 
-  QUEUE_iterate (stop_reply_p, stop_reply_queue,
-                remote_notif_remove_once_on_match, &param);
   if (notif_debug)
     fprintf_unfiltered (gdb_stdlog,
                        "notif: discard queued event: 'Stop' in %s\n",
                        target_pid_to_str (ptid));
 
-  return param.output;
+  return result;
 }
 
 /* Look for a queued stop reply belonging to PTID.  If one is found,
@@ -6996,14 +7165,17 @@ remote_notif_remove_queued_reply (ptid_t ptid)
    found.  If there are still queued events left to process, tell the
    event loop to get back to target_wait soon.  */
 
-static struct stop_reply *
-queued_stop_reply (ptid_t ptid)
+struct stop_reply *
+remote_target::queued_stop_reply (ptid_t ptid)
 {
+  remote_state *rs = get_remote_state ();
   struct stop_reply *r = remote_notif_remove_queued_reply (ptid);
 
-  if (!QUEUE_is_empty (stop_reply_p, stop_reply_queue))
-    /* There's still at least an event left.  */
-    mark_async_event_handler (remote_async_inferior_event_token);
+  if (!rs->stop_reply_queue.empty ())
+    {
+      /* There's still at least an event left.  */
+      mark_async_event_handler (rs->remote_async_inferior_event_token);
+    }
 
   return r;
 }
@@ -7012,40 +7184,32 @@ queued_stop_reply (ptid_t ptid)
    know that we now have at least one queued event left to pass to the
    core side, tell the event loop to get back to target_wait soon.  */
 
-static void
-push_stop_reply (struct stop_reply *new_event)
+void
+remote_target::push_stop_reply (struct stop_reply *new_event)
 {
-  QUEUE_enque (stop_reply_p, stop_reply_queue, new_event);
+  remote_state *rs = get_remote_state ();
+  rs->stop_reply_queue.push_back (stop_reply_up (new_event));
 
   if (notif_debug)
     fprintf_unfiltered (gdb_stdlog,
                        "notif: push 'Stop' %s to queue %d\n",
                        target_pid_to_str (new_event->ptid),
-                       QUEUE_length (stop_reply_p,
-                                     stop_reply_queue));
-
-  mark_async_event_handler (remote_async_inferior_event_token);
-}
+                       int (rs->stop_reply_queue.size ()));
 
-static int
-stop_reply_match_ptid_and_ws (QUEUE (stop_reply_p) *q,
-                             QUEUE_ITER (stop_reply_p) *iter,
-                             struct stop_reply *event,
-                             void *data)
-{
-  ptid_t *ptid = (ptid_t *) data;
-
-  return !(ptid_equal (*ptid, event->ptid)
-          && event->ws.kind == TARGET_WAITKIND_STOPPED);
+  mark_async_event_handler (rs->remote_async_inferior_event_token);
 }
 
 /* Returns true if we have a stop reply for PTID.  */
 
-static int
-peek_stop_reply (ptid_t ptid)
+int
+remote_target::peek_stop_reply (ptid_t ptid)
 {
-  return !QUEUE_iterate (stop_reply_p, stop_reply_queue,
-                        stop_reply_match_ptid_and_ws, &ptid);
+  remote_state *rs = get_remote_state ();
+  for (auto &event : rs->stop_reply_queue)
+    if (ptid == event->ptid
+       && event->ws.kind == TARGET_WAITKIND_STOPPED)
+      return 1;
+  return 0;
 }
 
 /* Helper for remote_parse_stop_reply.  Return nonzero if the substring
@@ -7063,8 +7227,8 @@ strprefix (const char *p, const char *pend, const char *prefix)
 /* Parse the stop reply in BUF.  Either the function succeeds, and the
    result is stored in EVENT, or throws an error.  */
 
-static void
-remote_parse_stop_reply (char *buf, struct stop_reply *event)
+void
+remote_target::remote_parse_stop_reply (char *buf, stop_reply *event)
 {
   remote_arch_state *rsa = NULL;
   ULONGEST addr;
@@ -7344,7 +7508,6 @@ Packet: '%s'\n"),
       break;
     case 'w':          /* Thread exited.  */
       {
-       const char *p;
        ULONGEST value;
 
        event->ws.kind = TARGET_WAITKIND_THREAD_EXITED;
@@ -7358,7 +7521,6 @@ Packet: '%s'\n"),
     case 'W':          /* Target exited.  */
     case 'X':
       {
-       const char *p;
        int pid;
        ULONGEST value;
 
@@ -7384,7 +7546,7 @@ Packet: '%s'\n"),
          }
 
        /* If no process is specified, assume inferior_ptid.  */
-       pid = ptid_get_pid (inferior_ptid);
+       pid = inferior_ptid.pid ();
        if (*p == '\0')
          ;
        else if (*p == ';')
@@ -7406,7 +7568,7 @@ Packet: '%s'\n"),
          }
        else
          error (_("unknown stop reply packet: %s"), buf);
-       event->ptid = pid_to_ptid (pid);
+       event->ptid = ptid_t (pid);
       }
       break;
     case 'N':
@@ -7415,7 +7577,7 @@ Packet: '%s'\n"),
       break;
     }
 
-  if (target_is_non_stop_p () && ptid_equal (event->ptid, null_ptid))
+  if (target_is_non_stop_p () && event->ptid == null_ptid)
     error (_("No process or thread specified in stop reply: %s"), buf);
 }
 
@@ -7462,7 +7624,7 @@ Packet: '%s'\n"),
 */
 
 void
-remote_notif_get_pending_events (struct notif_client *nc)
+remote_target::remote_notif_get_pending_events (notif_client *nc)
 {
   struct remote_state *rs = get_remote_state ();
 
@@ -7474,7 +7636,7 @@ remote_notif_get_pending_events (struct notif_client *nc)
                            nc->name);
 
       /* acknowledge */
-      nc->ack (nc, rs->buf, rs->notif_state->pending_event[nc->id]);
+      nc->ack (this, nc, rs->buf, rs->notif_state->pending_event[nc->id]);
       rs->notif_state->pending_event[nc->id] = NULL;
 
       while (1)
@@ -7483,7 +7645,7 @@ remote_notif_get_pending_events (struct notif_client *nc)
          if (strcmp (rs->buf, "OK") == 0)
            break;
          else
-           remote_notif_ack (nc, rs->buf);
+           remote_notif_ack (this, nc, rs->buf);
        }
     }
   else
@@ -7495,13 +7657,22 @@ remote_notif_get_pending_events (struct notif_client *nc)
     }
 }
 
+/* Wrapper around remote_target::remote_notif_get_pending_events to
+   avoid having to export the whole remote_target class.  */
+
+void
+remote_notif_get_pending_events (remote_target *remote, notif_client *nc)
+{
+  remote->remote_notif_get_pending_events (nc);
+}
+
 /* Called when it is decided that STOP_REPLY holds the info of the
    event that is to be returned to the core.  This function always
    destroys STOP_REPLY.  */
 
-static ptid_t
-process_stop_reply (struct stop_reply *stop_reply,
-                   struct target_waitstatus *status)
+ptid_t
+remote_target::process_stop_reply (struct stop_reply *stop_reply,
+                                  struct target_waitstatus *status)
 {
   ptid_t ptid;
 
@@ -7510,7 +7681,7 @@ process_stop_reply (struct stop_reply *stop_reply,
 
   /* If no thread/process was reported by the stub, assume the current
      inferior.  */
-  if (ptid_equal (ptid, null_ptid))
+  if (ptid == null_ptid)
     ptid = inferior_ptid;
 
   if (status->kind != TARGET_WAITKIND_EXITED
@@ -7529,7 +7700,7 @@ process_stop_reply (struct stop_reply *stop_reply,
               VEC_iterate (cached_reg_t, stop_reply->regcache, ix, reg);
               ix++)
          {
-           regcache_raw_supply (regcache, reg->num, reg->data);
+           regcache->raw_supply (reg->num, reg->data);
            xfree (reg->data);
          }
 
@@ -7550,8 +7721,8 @@ process_stop_reply (struct stop_reply *stop_reply,
 
 /* The non-stop mode version of target_wait.  */
 
-static ptid_t
-remote_wait_ns (ptid_t ptid, struct target_waitstatus *status, int options)
+ptid_t
+remote_target::wait_ns (ptid_t ptid, struct target_waitstatus *status, int options)
 {
   struct remote_state *rs = get_remote_state ();
   struct stop_reply *stop_reply;
@@ -7609,8 +7780,8 @@ remote_wait_ns (ptid_t ptid, struct target_waitstatus *status, int options)
 /* Wait until the remote machine stops, then return, storing status in
    STATUS just as `wait' would.  */
 
-static ptid_t
-remote_wait_as (ptid_t ptid, struct target_waitstatus *status, int options)
+ptid_t
+remote_target::wait_as (ptid_t ptid, target_waitstatus *status, int options)
 {
   struct remote_state *rs = get_remote_state ();
   ptid_t event_ptid = null_ptid;
@@ -7634,7 +7805,7 @@ remote_wait_as (ptid_t ptid, struct target_waitstatus *status, int options)
       int ret;
       int is_notif;
       int forever = ((options & TARGET_WNOHANG) == 0
-                    && wait_forever_enabled_p);
+                    && rs->wait_forever_enabled_p);
 
       if (!rs->waiting_for_stop_reply)
        {
@@ -7682,7 +7853,7 @@ remote_wait_as (ptid_t ptid, struct target_waitstatus *status, int options)
         for a stop reply.  See the comments in putpkt_binary.  Set
         waiting_for_stop_reply to 0 temporarily.  */
       rs->waiting_for_stop_reply = 0;
-      remote_fileio_request (buf, rs->ctrlc_pending_p);
+      remote_fileio_request (this, buf, rs->ctrlc_pending_p);
       rs->ctrlc_pending_p = 0;
       /* GDB handled the File-I/O request, and the target is running
         again.  Keep waiting for events.  */
@@ -7690,13 +7861,12 @@ remote_wait_as (ptid_t ptid, struct target_waitstatus *status, int options)
       break;
     case 'N': case 'T': case 'S': case 'X': case 'W':
       {
-       struct stop_reply *stop_reply;
-
        /* There is a stop reply to handle.  */
        rs->waiting_for_stop_reply = 0;
 
        stop_reply
-         = (struct stop_reply *) remote_notif_parse (&notif_client_stop,
+         = (struct stop_reply *) remote_notif_parse (this,
+                                                     &notif_client_stop,
                                                      rs->buf);
 
        event_ptid = process_stop_reply (stop_reply, status);
@@ -7741,7 +7911,7 @@ remote_wait_as (ptid_t ptid, struct target_waitstatus *status, int options)
   else if (status->kind != TARGET_WAITKIND_EXITED
           && status->kind != TARGET_WAITKIND_SIGNALLED)
     {
-      if (!ptid_equal (event_ptid, null_ptid))
+      if (event_ptid != null_ptid)
        record_currthread (rs, event_ptid);
       else
        event_ptid = inferior_ptid;
@@ -7762,16 +7932,18 @@ remote_target::wait (ptid_t ptid, struct target_waitstatus *status, int options)
   ptid_t event_ptid;
 
   if (target_is_non_stop_p ())
-    event_ptid = remote_wait_ns (ptid, status, options);
+    event_ptid = wait_ns (ptid, status, options);
   else
-    event_ptid = remote_wait_as (ptid, status, options);
+    event_ptid = wait_as (ptid, status, options);
 
   if (target_is_async_p ())
     {
+      remote_state *rs = get_remote_state ();
+
       /* If there are are events left in the queue tell the event loop
         to return here.  */
-      if (!QUEUE_is_empty (stop_reply_p, stop_reply_queue))
-       mark_async_event_handler (remote_async_inferior_event_token);
+      if (!rs->stop_reply_queue.empty ())
+       mark_async_event_handler (rs->remote_async_inferior_event_token);
     }
 
   return event_ptid;
@@ -7779,8 +7951,9 @@ remote_target::wait (ptid_t ptid, struct target_waitstatus *status, int options)
 
 /* Fetch a single register using a 'p' packet.  */
 
-static int
-fetch_register_using_p (struct regcache *regcache, struct packet_reg *reg)
+int
+remote_target::fetch_register_using_p (struct regcache *regcache,
+                                      packet_reg *reg)
 {
   struct gdbarch *gdbarch = regcache->arch ();
   struct remote_state *rs = get_remote_state ();
@@ -7819,7 +7992,7 @@ fetch_register_using_p (struct regcache *regcache, struct packet_reg *reg)
   /* If this register is unfetchable, tell the regcache.  */
   if (buf[0] == 'x')
     {
-      regcache_raw_supply (regcache, reg->regnum, NULL);
+      regcache->raw_supply (reg->regnum, NULL);
       return 1;
     }
 
@@ -7834,14 +8007,14 @@ fetch_register_using_p (struct regcache *regcache, struct packet_reg *reg)
       regp[i++] = fromhex (p[0]) * 16 + fromhex (p[1]);
       p += 2;
     }
-  regcache_raw_supply (regcache, reg->regnum, regp);
+  regcache->raw_supply (reg->regnum, regp);
   return 1;
 }
 
 /* Fetch the registers included in the target's 'g' packet.  */
 
-static int
-send_g_packet (void)
+int
+remote_target::send_g_packet ()
 {
   struct remote_state *rs = get_remote_state ();
   int buf_len;
@@ -7876,8 +8049,8 @@ send_g_packet (void)
   return buf_len / 2;
 }
 
-static void
-process_g_packet (struct regcache *regcache)
+void
+remote_target::process_g_packet (struct regcache *regcache)
 {
   struct gdbarch *gdbarch = regcache->arch ();
   struct remote_state *rs = get_remote_state ();
@@ -7972,17 +8145,16 @@ process_g_packet (struct regcache *regcache)
              gdb_assert (r->offset * 2 < strlen (rs->buf));
              /* The register isn't available, mark it as such (at
                 the same time setting the value to zero).  */
-             regcache_raw_supply (regcache, r->regnum, NULL);
+             regcache->raw_supply (r->regnum, NULL);
            }
          else
-           regcache_raw_supply (regcache, r->regnum,
-                                regs + r->offset);
+           regcache->raw_supply (r->regnum, regs + r->offset);
        }
     }
 }
 
-static void
-fetch_registers_using_g (struct regcache *regcache)
+void
+remote_target::fetch_registers_using_g (struct regcache *regcache)
 {
   send_g_packet ();
   process_g_packet (regcache);
@@ -7991,8 +8163,8 @@ fetch_registers_using_g (struct regcache *regcache)
 /* Make the remote selected traceframe match GDB's selected
    traceframe.  */
 
-static void
-set_remote_traceframe (void)
+void
+remote_target::set_remote_traceframe ()
 {
   int newnum;
   struct remote_state *rs = get_remote_state ();
@@ -8020,7 +8192,7 @@ remote_target::fetch_registers (struct regcache *regcache, int regnum)
   int i;
 
   set_remote_traceframe ();
-  set_general_thread (regcache_get_ptid (regcache));
+  set_general_thread (regcache->ptid ());
 
   if (regnum >= 0)
     {
@@ -8043,7 +8215,7 @@ remote_target::fetch_registers (struct regcache *regcache, int regnum)
        return;
 
       /* This register is not available.  */
-      regcache_raw_supply (regcache, reg->regnum, NULL);
+      regcache->raw_supply (reg->regnum, NULL);
 
       return;
     }
@@ -8055,7 +8227,7 @@ remote_target::fetch_registers (struct regcache *regcache, int regnum)
       if (!fetch_register_using_p (regcache, &rsa->regs[i]))
        {
          /* This register is not available.  */
-         regcache_raw_supply (regcache, i, NULL);
+         regcache->raw_supply (i, NULL);
        }
 }
 
@@ -8078,7 +8250,7 @@ remote_target::prepare_to_store (struct regcache *regcache)
       /* Make sure all the necessary registers are cached.  */
       for (i = 0; i < gdbarch_num_regs (regcache->arch ()); i++)
        if (rsa->regs[i].in_g_packet)
-         regcache_raw_update (regcache, rsa->regs[i].regnum);
+         regcache->raw_update (rsa->regs[i].regnum);
       break;
     case PACKET_ENABLE:
       break;
@@ -8088,9 +8260,9 @@ remote_target::prepare_to_store (struct regcache *regcache)
 /* Helper: Attempt to store REGNUM using the P packet.  Return fail IFF
    packet was not recognized.  */
 
-static int
-store_register_using_P (const struct regcache *regcache, 
-                       struct packet_reg *reg)
+int
+remote_target::store_register_using_P (const struct regcache *regcache,
+                                      packet_reg *reg)
 {
   struct gdbarch *gdbarch = regcache->arch ();
   struct remote_state *rs = get_remote_state ();
@@ -8107,7 +8279,7 @@ store_register_using_P (const struct regcache *regcache,
 
   xsnprintf (buf, get_remote_packet_size (), "P%s=", phex_nz (reg->pnum, 0));
   p = buf + strlen (buf);
-  regcache_raw_collect (regcache, reg->regnum, regp);
+  regcache->raw_collect (reg->regnum, regp);
   bin2hex (regp, p, register_size (gdbarch, reg->regnum));
   putpkt (rs->buf);
   getpkt (&rs->buf, &rs->buf_size, 0);
@@ -8129,8 +8301,8 @@ store_register_using_P (const struct regcache *regcache,
 /* Store register REGNUM, or all registers if REGNUM == -1, from the
    contents of the register cache buffer.  FIXME: ignores errors.  */
 
-static void
-store_registers_using_G (const struct regcache *regcache)
+void
+remote_target::store_registers_using_G (const struct regcache *regcache)
 {
   struct remote_state *rs = get_remote_state ();
   remote_arch_state *rsa = rs->get_remote_arch_state (regcache->arch ());
@@ -8149,7 +8321,7 @@ store_registers_using_G (const struct regcache *regcache)
        struct packet_reg *r = &rsa->regs[i];
 
        if (r->in_g_packet)
-         regcache_raw_collect (regcache, r->regnum, regs + r->offset);
+         regcache->raw_collect (r->regnum, regs + r->offset);
       }
   }
 
@@ -8177,7 +8349,7 @@ remote_target::store_registers (struct regcache *regcache, int regnum)
   int i;
 
   set_remote_traceframe ();
-  set_general_thread (regcache_get_ptid (regcache));
+  set_general_thread (regcache->ptid ());
 
   if (regnum >= 0)
     {
@@ -8290,8 +8462,8 @@ remote_address_masked (CORE_ADDR addr)
    clean.  In cases like this, the user should clear "remote
    X-packet".  */
 
-static void
-check_binary_download (CORE_ADDR addr)
+void
+remote_target::check_binary_download (CORE_ADDR addr)
 {
   struct remote_state *rs = get_remote_state ();
 
@@ -8381,11 +8553,13 @@ align_for_efficient_write (int todo, CORE_ADDR memaddr)
    -> $m1000,4#??
    <- eeeeffffeeeedddd  */
 
-static enum target_xfer_status
-remote_write_bytes_aux (const char *header, CORE_ADDR memaddr,
-                       const gdb_byte *myaddr, ULONGEST len_units,
-                       int unit_size, ULONGEST *xfered_len_units,
-                       char packet_format, int use_length)
+target_xfer_status
+remote_target::remote_write_bytes_aux (const char *header, CORE_ADDR memaddr,
+                                      const gdb_byte *myaddr,
+                                      ULONGEST len_units,
+                                      int unit_size,
+                                      ULONGEST *xfered_len_units,
+                                      char packet_format, int use_length)
 {
   struct remote_state *rs = get_remote_state ();
   char *p;
@@ -8544,9 +8718,10 @@ remote_write_bytes_aux (const char *header, CORE_ADDR memaddr,
    'enum target_xfer_status' value).  Save the number of bytes
    transferred in *XFERED_LEN.  Only transfer a single packet.  */
 
-static enum target_xfer_status
-remote_write_bytes (CORE_ADDR memaddr, const gdb_byte *myaddr, ULONGEST len,
-                   int unit_size, ULONGEST *xfered_len)
+target_xfer_status
+remote_target::remote_write_bytes (CORE_ADDR memaddr, const gdb_byte *myaddr,
+                                  ULONGEST len, int unit_size,
+                                  ULONGEST *xfered_len)
 {
   const char *packet_format = NULL;
 
@@ -8587,9 +8762,10 @@ remote_write_bytes (CORE_ADDR memaddr, const gdb_byte *myaddr, ULONGEST len,
    See the comment of remote_write_bytes_aux for an example of
    memory read/write exchange between gdb and the stub.  */
 
-static enum target_xfer_status
-remote_read_bytes_1 (CORE_ADDR memaddr, gdb_byte *myaddr, ULONGEST len_units,
-                    int unit_size, ULONGEST *xfered_len_units)
+target_xfer_status
+remote_target::remote_read_bytes_1 (CORE_ADDR memaddr, gdb_byte *myaddr,
+                                   ULONGEST len_units,
+                                   int unit_size, ULONGEST *xfered_len_units)
 {
   struct remote_state *rs = get_remote_state ();
   int buf_size_bytes;          /* Max size of packet output buffer.  */
@@ -8634,15 +8810,17 @@ remote_read_bytes_1 (CORE_ADDR memaddr, gdb_byte *myaddr, ULONGEST len_units,
    For interface/parameters/return description see target.h,
    to_xfer_partial.  */
 
-static enum target_xfer_status
-remote_xfer_live_readonly_partial (struct target_ops *ops, gdb_byte *readbuf,
-                                  ULONGEST memaddr, ULONGEST len,
-                                  int unit_size, ULONGEST *xfered_len)
+target_xfer_status
+remote_target::remote_xfer_live_readonly_partial (gdb_byte *readbuf,
+                                                 ULONGEST memaddr,
+                                                 ULONGEST len,
+                                                 int unit_size,
+                                                 ULONGEST *xfered_len)
 {
   struct target_section *secp;
   struct target_section_table *table;
 
-  secp = target_section_by_addr (ops, memaddr);
+  secp = target_section_by_addr (this, memaddr);
   if (secp != NULL
       && (bfd_get_section_flags (secp->the_bfd_section->owner,
                                 secp->the_bfd_section)
@@ -8651,7 +8829,7 @@ remote_xfer_live_readonly_partial (struct target_ops *ops, gdb_byte *readbuf,
       struct target_section *p;
       ULONGEST memend = memaddr + len;
 
-      table = target_get_section_table (ops);
+      table = target_get_section_table (this);
 
       for (p = table->sections; p < table->sections_end; p++)
        {
@@ -8686,10 +8864,10 @@ remote_xfer_live_readonly_partial (struct target_ops *ops, gdb_byte *readbuf,
    first if the requested memory is unavailable in traceframe.
    Otherwise, fall back to remote_read_bytes_1.  */
 
-static enum target_xfer_status
-remote_read_bytes (struct target_ops *ops, CORE_ADDR memaddr,
-                  gdb_byte *myaddr, ULONGEST len, int unit_size,
-                  ULONGEST *xfered_len)
+target_xfer_status
+remote_target::remote_read_bytes (CORE_ADDR memaddr,
+                                 gdb_byte *myaddr, ULONGEST len, int unit_size,
+                                 ULONGEST *xfered_len)
 {
   if (len == 0)
     return TARGET_XFER_EOF;
@@ -8719,7 +8897,7 @@ remote_read_bytes (struct target_ops *ops, CORE_ADDR memaddr,
                }
 
              /* This goes through the topmost target again.  */
-             res = remote_xfer_live_readonly_partial (ops, myaddr, memaddr,
+             res = remote_xfer_live_readonly_partial (myaddr, memaddr,
                                                       len, unit_size, xfered_len);
              if (res == TARGET_XFER_OK)
                return TARGET_XFER_OK;
@@ -8750,11 +8928,8 @@ remote_read_bytes (struct target_ops *ops, CORE_ADDR memaddr,
    FORMAT and the remaining arguments, then gets the reply.  Returns
    whether the packet was a success, a failure, or unknown.  */
 
-static enum packet_result remote_send_printf (const char *format, ...)
-  ATTRIBUTE_PRINTF (1, 2);
-
-static enum packet_result
-remote_send_printf (const char *format, ...)
+packet_result
+remote_target::remote_send_printf (const char *format, ...)
 {
   struct remote_state *rs = get_remote_state ();
   int max_size = get_remote_packet_size ();
@@ -8802,10 +8977,10 @@ remote_target::flash_erase (ULONGEST address, LONGEST length)
     }
 }
 
-static enum target_xfer_status
-remote_flash_write (struct target_ops *ops, ULONGEST address,
-                   ULONGEST length, ULONGEST *xfered_len,
-                   const gdb_byte *data)
+target_xfer_status
+remote_target::remote_flash_write (ULONGEST address,
+                                  ULONGEST length, ULONGEST *xfered_len,
+                                  const gdb_byte *data)
 {
   scoped_restore restore_timeout
     = make_scoped_restore (&remote_timeout, remote_flash_timeout);
@@ -8864,15 +9039,17 @@ unpush_and_perror (const char *string)
    sequence, as that would break communication with the remote server.
    See remote_serial_quit_handler for more detail.  */
 
-static int
-readchar (int timeout)
+int
+remote_target::readchar (int timeout)
 {
   int ch;
   struct remote_state *rs = get_remote_state ();
 
   {
+    scoped_restore restore_quit_target
+      = make_scoped_restore (&curr_quit_handler_target, this);
     scoped_restore restore_quit
-      = make_scoped_restore (&quit_handler, remote_serial_quit_handler);
+      = make_scoped_restore (&quit_handler, ::remote_serial_quit_handler);
 
     rs->got_ctrlc_during_io = 0;
 
@@ -8907,13 +9084,15 @@ readchar (int timeout)
    communication with the remote server.  See
    remote_serial_quit_handler for more detail.  */
 
-static void
-remote_serial_write (const char *str, int len)
+void
+remote_target::remote_serial_write (const char *str, int len)
 {
   struct remote_state *rs = get_remote_state ();
 
+  scoped_restore restore_quit_target
+    = make_scoped_restore (&curr_quit_handler_target, this);
   scoped_restore restore_quit
-    = make_scoped_restore (&quit_handler, remote_serial_quit_handler);
+    = make_scoped_restore (&quit_handler, ::remote_serial_quit_handler);
 
   rs->got_ctrlc_during_io = 0;
 
@@ -8951,19 +9130,28 @@ print_packet (const char *buf)
 }
 
 int
-putpkt (const char *buf)
+remote_target::putpkt (const char *buf)
 {
   return putpkt_binary (buf, strlen (buf));
 }
 
+/* Wrapper around remote_target::putpkt to avoid exporting
+   remote_target.  */
+
+int
+putpkt (remote_target *remote, const char *buf)
+{
+  return remote->putpkt (buf);
+}
+
 /* Send a packet to the remote machine, with error checking.  The data
    of the packet is in BUF.  The string in BUF can be at most
    get_remote_packet_size () - 5 to account for the $, # and checksum,
    and for a possible /0 if we are debugging (remote_debug) and want
    to print the sent packet as a string.  */
 
-static int
-putpkt_binary (const char *buf, int cnt)
+int
+remote_target::putpkt_binary (const char *buf, int cnt)
 {
   struct remote_state *rs = get_remote_state ();
   int i;
@@ -9168,8 +9356,8 @@ putpkt_binary (const char *buf, int cnt)
 /* Come here after finding the start of a frame when we expected an
    ack.  Do our best to discard the rest of this packet.  */
 
-static void
-skip_frame (void)
+void
+remote_target::skip_frame ()
 {
   int c;
 
@@ -9210,9 +9398,8 @@ skip_frame (void)
    trailing NULL) on success. (could be extended to return one of the
    SERIAL status indications).  */
 
-static long
-read_frame (char **buf_p,
-           long *sizeof_buf)
+long
+remote_target::read_frame (char **buf_p, long *sizeof_buf)
 {
   unsigned char csum;
   long bc;
@@ -9342,10 +9529,9 @@ read_frame (char **buf_p,
    don't have to change all the calls to getpkt to deal with the
    return value, because at the moment I don't know what the right
    thing to do it for those.  */
+
 void
-getpkt (char **buf,
-       long *sizeof_buf,
-       int forever)
+remote_target::getpkt (char **buf, long *sizeof_buf, int forever)
 {
   getpkt_sane (buf, sizeof_buf, forever);
 }
@@ -9363,9 +9549,10 @@ getpkt (char **buf,
    boolean that indicates whether *BUF holds a notification or not
    (a regular packet).  */
 
-static int
-getpkt_or_notif_sane_1 (char **buf, long *sizeof_buf, int forever,
-                       int expecting_notif, int *is_notif)
+int
+remote_target::getpkt_or_notif_sane_1 (char **buf, long *sizeof_buf,
+                                      int forever, int expecting_notif,
+                                      int *is_notif)
 {
   struct remote_state *rs = get_remote_state ();
   int c;
@@ -9504,55 +9691,29 @@ getpkt_or_notif_sane_1 (char **buf, long *sizeof_buf, int forever,
     }
 }
 
-static int
-getpkt_sane (char **buf, long *sizeof_buf, int forever)
+int
+remote_target::getpkt_sane (char **buf, long *sizeof_buf, int forever)
 {
   return getpkt_or_notif_sane_1 (buf, sizeof_buf, forever, 0, NULL);
 }
 
-static int
-getpkt_or_notif_sane (char **buf, long *sizeof_buf, int forever,
-                     int *is_notif)
+int
+remote_target::getpkt_or_notif_sane (char **buf, long *sizeof_buf, int forever,
+                                    int *is_notif)
 {
   return getpkt_or_notif_sane_1 (buf, sizeof_buf, forever, 1,
                                 is_notif);
 }
 
-/* Check whether EVENT is a fork event for the process specified
-   by the pid passed in DATA, and if it is, kill the fork child.  */
-
-static int
-kill_child_of_pending_fork (QUEUE (stop_reply_p) *q,
-                           QUEUE_ITER (stop_reply_p) *iter,
-                           stop_reply_p event,
-                           void *data)
-{
-  struct queue_iter_param *param = (struct queue_iter_param *) data;
-  int parent_pid = *(int *) param->input;
-
-  if (is_pending_fork_parent (&event->ws, parent_pid, event->ptid))
-    {
-      struct remote_state *rs = get_remote_state ();
-      int child_pid = ptid_get_pid (event->ws.value.related_pid);
-      int res;
-
-      res = remote_vkill (child_pid, rs);
-      if (res != 0)
-       error (_("Can't kill fork child process %d"), child_pid);
-    }
-
-  return 1;
-}
-
 /* Kill any new fork children of process PID that haven't been
    processed by follow_fork.  */
 
-static void
-kill_new_fork_children (int pid, struct remote_state *rs)
+void
+remote_target::kill_new_fork_children (int pid)
 {
+  remote_state *rs = get_remote_state ();
   struct thread_info *thread;
   struct notif_client *notif = &notif_client_stop;
-  struct queue_iter_param param;
 
   /* Kill the fork child threads of any threads in process PID
      that are stopped at a fork event.  */
@@ -9562,11 +9723,10 @@ kill_new_fork_children (int pid, struct remote_state *rs)
 
       if (is_pending_fork_parent (ws, pid, thread->ptid))
        {
-         struct remote_state *rs = get_remote_state ();
-         int child_pid = ptid_get_pid (ws->value.related_pid);
+         int child_pid = ws->value.related_pid.pid ();
          int res;
 
-         res = remote_vkill (child_pid, rs);
+         res = remote_vkill (child_pid);
          if (res != 0)
            error (_("Can't kill fork child process %d"), child_pid);
        }
@@ -9575,10 +9735,16 @@ kill_new_fork_children (int pid, struct remote_state *rs)
   /* Check for any pending fork events (not reported or processed yet)
      in process PID and kill those fork child threads as well.  */
   remote_notif_get_pending_events (notif);
-  param.input = &pid;
-  param.output = NULL;
-  QUEUE_iterate (stop_reply_p, stop_reply_queue,
-                kill_child_of_pending_fork, &param);
+  for (auto &event : rs->stop_reply_queue)
+    if (is_pending_fork_parent (&event->ws, pid, event->ptid))
+      {
+       int child_pid = event->ws.value.related_pid.pid ();
+       int res;
+
+       res = remote_vkill (child_pid);
+       if (res != 0)
+         error (_("Can't kill fork child process %d"), child_pid);
+      }
 }
 
 \f
@@ -9588,7 +9754,7 @@ void
 remote_target::kill ()
 {
   int res = -1;
-  int pid = ptid_get_pid (inferior_ptid);
+  int pid = inferior_ptid.pid ();
   struct remote_state *rs = get_remote_state ();
 
   if (packet_support (PACKET_vKill) != PACKET_DISABLE)
@@ -9597,9 +9763,9 @@ remote_target::kill ()
         kill the child task.  We need to do this before killing the
         parent task because if this is a vfork then the parent will
         be sleeping.  */
-      kill_new_fork_children (pid, rs);
+      kill_new_fork_children (pid);
 
-      res = remote_vkill (pid, rs);
+      res = remote_vkill (pid);
       if (res == 0)
        {
          target_mourn_inferior (inferior_ptid);
@@ -9629,12 +9795,14 @@ remote_target::kill ()
 
 /* Send a kill request to the target using the 'vKill' packet.  */
 
-static int
-remote_vkill (int pid, struct remote_state *rs)
+int
+remote_target::remote_vkill (int pid)
 {
   if (packet_support (PACKET_vKill) == PACKET_DISABLE)
     return -1;
 
+  remote_state *rs = get_remote_state ();
+
   /* Tell the remote target to detach.  */
   xsnprintf (rs->buf, get_remote_packet_size (), "vKill;%x", pid);
   putpkt (rs->buf);
@@ -9656,8 +9824,8 @@ remote_vkill (int pid, struct remote_state *rs)
 
 /* Send a kill request to the target using the 'k' packet.  */
 
-static void
-remote_kill_k (void)
+void
+remote_target::remote_kill_k ()
 {
   /* Catch errors so the user can quit from gdb even when we
      aren't on speaking terms with the remote system.  */
@@ -9764,8 +9932,8 @@ extended_remote_target::supports_disable_randomization ()
   return packet_support (PACKET_QDisableRandomization) == PACKET_ENABLE;
 }
 
-static void
-extended_remote_disable_randomization (int val)
+void
+remote_target::extended_remote_disable_randomization (int val)
 {
   struct remote_state *rs = get_remote_state ();
   char *reply;
@@ -9780,8 +9948,8 @@ extended_remote_disable_randomization (int val)
     error (_("Bogus QDisableRandomization reply from target: %s"), reply);
 }
 
-static int
-extended_remote_run (const std::string &args)
+int
+remote_target::extended_remote_run (const std::string &args)
 {
   struct remote_state *rs = get_remote_state ();
   int len;
@@ -9844,12 +10012,13 @@ extended_remote_run (const std::string &args)
    or "QEnvironmentUnsetVariable".  VALUE is the variable to be
    sent.  */
 
-static void
-send_environment_packet (struct remote_state *rs,
-                        const char *action,
-                        const char *packet,
-                        const char *value)
+void
+remote_target::send_environment_packet (const char *action,
+                                       const char *packet,
+                                       const char *value)
 {
+  remote_state *rs = get_remote_state ();
+
   /* Convert the environment variable to an hex string, which
      is the best format to be transmitted over the wire.  */
   std::string encoded_value = bin2hex ((const gdb_byte *) value,
@@ -9867,9 +10036,11 @@ send_environment_packet (struct remote_state *rs,
 
 /* Helper function to handle the QEnvironment* packets.  */
 
-static void
-extended_remote_environment_support (struct remote_state *rs)
+void
+remote_target::extended_remote_environment_support ()
 {
+  remote_state *rs = get_remote_state ();
+
   if (packet_support (PACKET_QEnvironmentReset) != PACKET_DISABLE)
     {
       putpkt ("QEnvironmentReset");
@@ -9882,23 +10053,24 @@ extended_remote_environment_support (struct remote_state *rs)
 
   if (packet_support (PACKET_QEnvironmentHexEncoded) != PACKET_DISABLE)
     for (const std::string &el : e->user_set_env ())
-      send_environment_packet (rs, "set", "QEnvironmentHexEncoded",
+      send_environment_packet ("set", "QEnvironmentHexEncoded",
                               el.c_str ());
 
   if (packet_support (PACKET_QEnvironmentUnset) != PACKET_DISABLE)
     for (const std::string &el : e->user_unset_env ())
-      send_environment_packet (rs, "unset", "QEnvironmentUnset", el.c_str ());
+      send_environment_packet ("unset", "QEnvironmentUnset", el.c_str ());
 }
 
 /* Helper function to set the current working directory for the
    inferior in the remote target.  */
 
-static void
-extended_remote_set_inferior_cwd (struct remote_state *rs)
+void
+remote_target::extended_remote_set_inferior_cwd ()
 {
   if (packet_support (PACKET_QSetWorkingDir) != PACKET_DISABLE)
     {
       const char *inferior_cwd = get_inferior_cwd ();
+      remote_state *rs = get_remote_state ();
 
       if (inferior_cwd != NULL)
        {
@@ -9968,9 +10140,9 @@ Remote replied unexpectedly while setting startup-with-shell: %s"),
               rs->buf);
     }
 
-  extended_remote_environment_support (rs);
+  extended_remote_environment_support ();
 
-  extended_remote_set_inferior_cwd (rs);
+  extended_remote_set_inferior_cwd ();
 
   /* Now restart the remote server.  */
   run_worked = extended_remote_run (args) != -1;
@@ -9981,7 +10153,7 @@ Remote replied unexpectedly while setting startup-with-shell: %s"),
       if (remote_exec_file[0])
        error (_("Remote target does not support \"set remote exec-file\""));
       if (!args.empty ())
-       error (_("Remote target does not support \"set args\" or run <ARGS>"));
+       error (_("Remote target does not support \"set args\" or run ARGS"));
 
       /* Fall back to "R".  */
       extended_remote_restart ();
@@ -10597,11 +10769,12 @@ the loaded file\n"));
    into remote target.  The number of bytes written to the remote
    target is returned, or -1 for error.  */
 
-static enum target_xfer_status
-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)
+target_xfer_status
+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)
 {
   int i, buf_len;
   ULONGEST n;
@@ -10640,12 +10813,13 @@ remote_write_qxfer (const char *object_name,
    EOF.  PACKET is checked and updated to indicate whether the remote
    target supports this object.  */
 
-static enum 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)
+target_xfer_status
+remote_target::remote_read_qxfer (const char *object_name,
+                                 const char *annex,
+                                 gdb_byte *readbuf, ULONGEST offset,
+                                 LONGEST len,
+                                 ULONGEST *xfered_len,
+                                 struct packet_config *packet)
 {
   struct remote_state *rs = get_remote_state ();
   LONGEST i, n, packet_len;
@@ -10751,7 +10925,7 @@ remote_target::xfer_partial (enum target_object object,
        return remote_write_bytes (offset, writebuf, len, unit_size,
                                   xfered_len);
       else
-       return remote_read_bytes (this, offset, readbuf, len, unit_size,
+       return remote_read_bytes (offset, readbuf, len, unit_size,
                                  xfered_len);
     }
 
@@ -10799,7 +10973,7 @@ remote_target::xfer_partial (enum target_object object,
       switch (object)
        {
        case TARGET_OBJECT_FLASH:
-         return remote_flash_write (this, offset, len, xfered_len,
+         return remote_flash_write (offset, len, xfered_len,
                                     writebuf);
 
        default:
@@ -11107,7 +11281,7 @@ remote_target::memory_map ()
 {
   std::vector<mem_region> result;
   gdb::optional<gdb::char_vector> text
-    = target_read_stralloc (target_stack, TARGET_OBJECT_MEMORY_MAP, NULL);
+    = target_read_stralloc (current_top_target (), TARGET_OBJECT_MEMORY_MAP, NULL);
 
   if (text)
     result = parse_memory_map (text->data ());
@@ -11118,11 +11292,17 @@ remote_target::memory_map ()
 static void
 packet_command (const char *args, int from_tty)
 {
-  struct remote_state *rs = get_remote_state ();
+  remote_target *remote = get_current_remote_target ();
 
-  if (!rs->remote_desc)
+  if (remote == nullptr)
     error (_("command can only be used with remote target"));
 
+  remote->packet_command (args, from_tty);
+}
+
+void
+remote_target::packet_command (const char *args, int from_tty)
+{
   if (!args)
     error (_("remote-packet command requires packet text as argument"));
 
@@ -11131,6 +11311,8 @@ packet_command (const char *args, int from_tty)
   puts_filtered ("\n");
   putpkt (args);
 
+  remote_state *rs = get_remote_state ();
+
   getpkt (&rs->buf, &rs->buf_size, 0);
   puts_filtered ("received: ");
   print_packet (rs->buf);
@@ -11174,8 +11356,8 @@ static void
 threadalive_test (const char *cmd, int tty)
 {
   int sample_thread = SAMPLE_THREAD;
-  int pid = ptid_get_pid (inferior_ptid);
-  ptid_t ptid = ptid_build (pid, sample_thread, 0);
+  int pid = inferior_ptid.pid ();
+  ptid_t ptid = ptid_t (pid, sample_thread, 0);
 
   if (remote_thread_alive (ptid))
     printf_filtered ("PASS: Thread alive test\n");
@@ -11294,9 +11476,9 @@ remote_target::pid_to_str (ptid_t ptid)
   static char buf[64];
   struct remote_state *rs = get_remote_state ();
 
-  if (ptid_equal (ptid, null_ptid))
+  if (ptid == null_ptid)
     return normal_pid_to_str (ptid);
-  else if (ptid_is_pid (ptid))
+  else if (ptid.is_pid ())
     {
       /* Printing an inferior target id.  */
 
@@ -11319,17 +11501,17 @@ remote_target::pid_to_str (ptid_t ptid)
     }
   else
     {
-      if (ptid_equal (magic_null_ptid, ptid))
+      if (magic_null_ptid == ptid)
        xsnprintf (buf, sizeof buf, "Thread <main>");
       else if (remote_multi_process_p (rs))
-       if (ptid_get_lwp (ptid) == 0)
+       if (ptid.lwp () == 0)
          return normal_pid_to_str (ptid);
        else
          xsnprintf (buf, sizeof buf, "Thread %d.%ld",
-                    ptid_get_pid (ptid), ptid_get_lwp (ptid));
+                    ptid.pid (), ptid.lwp ());
       else
        xsnprintf (buf, sizeof buf, "Thread %ld",
-                  ptid_get_lwp (ptid));
+                  ptid.lwp ());
       return buf;
     }
 }
@@ -11363,10 +11545,10 @@ remote_target::get_thread_local_address (ptid_t ptid, CORE_ADDR lm,
                          &remote_protocol_packets[PACKET_qGetTLSAddr]);
       if (result == PACKET_OK)
        {
-         ULONGEST result;
+         ULONGEST addr;
 
-         unpack_varlen_hex (rs->buf, &result);
-         return result;
+         unpack_varlen_hex (rs->buf, &addr);
+         return addr;
        }
       else if (result == PACKET_UNKNOWN)
        throw_error (TLS_GENERIC_ERROR,
@@ -11406,11 +11588,10 @@ remote_target::get_tib_address (ptid_t ptid, CORE_ADDR *addr)
                          &remote_protocol_packets[PACKET_qGetTIBAddr]);
       if (result == PACKET_OK)
        {
-         ULONGEST result;
-
-         unpack_varlen_hex (rs->buf, &result);
+         ULONGEST val;
+         unpack_varlen_hex (rs->buf, &val);
          if (addr)
-           *addr = (CORE_ADDR) result;
+           *addr = (CORE_ADDR) val;
          return true;
        }
       else if (result == PACKET_UNKNOWN)
@@ -11501,8 +11682,8 @@ remote_target::read_description ()
 
   /* Do not try this during initial connection, when we do not know
      whether there is a running but stopped thread.  */
-  if (!target_has_execution || ptid_equal (inferior_ptid, null_ptid))
-    return beneath->read_description ();
+  if (!target_has_execution || inferior_ptid == null_ptid)
+    return beneath ()->read_description ();
 
   if (!VEC_empty (remote_g_packet_guess_s, data->guesses))
     {
@@ -11521,7 +11702,7 @@ remote_target::read_description ()
         an architecture, but it's too tricky to do safely.  */
     }
 
-  return beneath->read_description ();
+  return beneath ()->read_description ();
 }
 
 /* Remote file transfer support.  This is host-initiated I/O, not
@@ -11657,10 +11838,10 @@ remote_hostio_parse_result (char *buffer, int *retcode,
    the packet buffer and *ATTACHMENT_LEN will be set to the
    attachment's length.  */
 
-static int
-remote_hostio_send_command (int command_bytes, int which_packet,
-                           int *remote_errno, char **attachment,
-                           int *attachment_len)
+int
+remote_target::remote_hostio_send_command (int command_bytes, int which_packet,
+                                          int *remote_errno, char **attachment,
+                                          int *attachment_len)
 {
   struct remote_state *rs = get_remote_state ();
   int ret, bytes_read;
@@ -11742,8 +11923,9 @@ readahead_cache::invalidate_fd (int fd)
    arguments will use.  Return 0 on success, or -1 if an error
    occurs (and set *REMOTE_ERRNO).  */
 
-static int
-remote_hostio_set_filesystem (struct inferior *inf, int *remote_errno)
+int
+remote_target::remote_hostio_set_filesystem (struct inferior *inf,
+                                            int *remote_errno)
 {
   struct remote_state *rs = get_remote_state ();
   int required_pid = (inf == NULL || inf->fake_pid_p) ? 0 : inf->pid;
@@ -11777,11 +11959,10 @@ remote_hostio_set_filesystem (struct inferior *inf, int *remote_errno)
 
 /* Implementation of to_fileio_open.  */
 
-static int
-remote_hostio_open (struct target_ops *self,
-                   struct inferior *inf, const char *filename,
-                   int flags, int mode, int warn_if_slow,
-                   int *remote_errno)
+int
+remote_target::remote_hostio_open (inferior *inf, const char *filename,
+                                  int flags, int mode, int warn_if_slow,
+                                  int *remote_errno)
 {
   struct remote_state *rs = get_remote_state ();
   char *p = rs->buf;
@@ -11826,16 +12007,15 @@ remote_target::fileio_open (struct inferior *inf, const char *filename,
                            int flags, int mode, int warn_if_slow,
                            int *remote_errno)
 {
-  return remote_hostio_open (this, inf, filename, flags, mode, warn_if_slow,
+  return remote_hostio_open (inf, filename, flags, mode, warn_if_slow,
                             remote_errno);
 }
 
 /* Implementation of to_fileio_pwrite.  */
 
-static int
-remote_hostio_pwrite (struct target_ops *self,
-                     int fd, const gdb_byte *write_buf, int len,
-                     ULONGEST offset, int *remote_errno)
+int
+remote_target::remote_hostio_pwrite (int fd, const gdb_byte *write_buf, int len,
+                                    ULONGEST offset, int *remote_errno)
 {
   struct remote_state *rs = get_remote_state ();
   char *p = rs->buf;
@@ -11863,16 +12043,15 @@ int
 remote_target::fileio_pwrite (int fd, const gdb_byte *write_buf, int len,
                              ULONGEST offset, int *remote_errno)
 {
-  return remote_hostio_pwrite (this, fd, write_buf, len, offset, remote_errno);
+  return remote_hostio_pwrite (fd, write_buf, len, offset, remote_errno);
 }
 
 /* Helper for the implementation of to_fileio_pread.  Read the file
    from the remote side with vFile:pread.  */
 
-static int
-remote_hostio_pread_vFile (struct target_ops *self,
-                          int fd, gdb_byte *read_buf, int len,
-                          ULONGEST offset, int *remote_errno)
+int
+remote_target::remote_hostio_pread_vFile (int fd, gdb_byte *read_buf, int len,
+                                         ULONGEST offset, int *remote_errno)
 {
   struct remote_state *rs = get_remote_state ();
   char *p = rs->buf;
@@ -11930,10 +12109,9 @@ readahead_cache::pread (int fd, gdb_byte *read_buf, size_t len,
 
 /* Implementation of to_fileio_pread.  */
 
-static int
-remote_hostio_pread (struct target_ops *self,
-                    int fd, gdb_byte *read_buf, int len,
-                    ULONGEST offset, int *remote_errno)
+int
+remote_target::remote_hostio_pread (int fd, gdb_byte *read_buf, int len,
+                                   ULONGEST offset, int *remote_errno)
 {
   int ret;
   struct remote_state *rs = get_remote_state ();
@@ -11960,7 +12138,7 @@ remote_hostio_pread (struct target_ops *self,
   cache->bufsize = get_remote_packet_size ();
   cache->buf = (gdb_byte *) xrealloc (cache->buf, cache->bufsize);
 
-  ret = remote_hostio_pread_vFile (self, cache->fd, cache->buf, cache->bufsize,
+  ret = remote_hostio_pread_vFile (cache->fd, cache->buf, cache->bufsize,
                                   cache->offset, remote_errno);
   if (ret <= 0)
     {
@@ -11976,13 +12154,13 @@ int
 remote_target::fileio_pread (int fd, gdb_byte *read_buf, int len,
                             ULONGEST offset, int *remote_errno)
 {
-  return remote_hostio_pread (this, fd, read_buf, len, offset, remote_errno);
+  return remote_hostio_pread (fd, read_buf, len, offset, remote_errno);
 }
 
 /* Implementation of to_fileio_close.  */
 
-static int
-remote_hostio_close (struct target_ops *self, int fd, int *remote_errno)
+int
+remote_target::remote_hostio_close (int fd, int *remote_errno)
 {
   struct remote_state *rs = get_remote_state ();
   char *p = rs->buf;
@@ -12001,15 +12179,14 @@ remote_hostio_close (struct target_ops *self, int fd, int *remote_errno)
 int
 remote_target::fileio_close (int fd, int *remote_errno)
 {
-  return remote_hostio_close (this, fd, remote_errno);
+  return remote_hostio_close (fd, remote_errno);
 }
 
 /* Implementation of to_fileio_unlink.  */
 
-static int
-remote_hostio_unlink (struct target_ops *self,
-                     struct inferior *inf, const char *filename,
-                     int *remote_errno)
+int
+remote_target::remote_hostio_unlink (inferior *inf, const char *filename,
+                                    int *remote_errno)
 {
   struct remote_state *rs = get_remote_state ();
   char *p = rs->buf;
@@ -12031,7 +12208,7 @@ int
 remote_target::fileio_unlink (struct inferior *inf, const char *filename,
                              int *remote_errno)
 {
-  return remote_hostio_unlink (this, inf, filename, remote_errno);
+  return remote_hostio_unlink (inf, filename, remote_errno);
 }
 
 /* Implementation of to_fileio_readlink.  */
@@ -12152,12 +12329,12 @@ remote_target::filesystem_is_local ()
          /* Try opening a file to probe support.  The supplied
             filename is irrelevant, we only care about whether
             the stub recognizes the packet or not.  */
-         fd = remote_hostio_open (this, NULL, "just probing",
+         fd = remote_hostio_open (NULL, "just probing",
                                   FILEIO_O_RDONLY, 0700, 0,
                                   &remote_errno);
 
          if (fd >= 0)
-           remote_hostio_close (this, fd, &remote_errno);
+           remote_hostio_close (fd, &remote_errno);
 
          ps = packet_support (PACKET_vFile_open);
        }
@@ -12248,8 +12425,8 @@ remote_hostio_error (int errnum)
 class scoped_remote_fd
 {
 public:
-  explicit scoped_remote_fd (int fd)
-    : m_fd (fd)
+  scoped_remote_fd (remote_target *remote, int fd)
+    : m_remote (remote), m_fd (fd)
   {
   }
 
@@ -12260,8 +12437,7 @@ public:
        try
          {
            int remote_errno;
-           remote_hostio_close (find_target_at (process_stratum),
-                                m_fd, &remote_errno);
+           m_remote->remote_hostio_close (m_fd, &remote_errno);
          }
        catch (...)
          {
@@ -12289,6 +12465,9 @@ public:
   }
 
 private:
+  /* The remote target.  */
+  remote_target *m_remote;
+
   /* The owned remote I/O file descriptor.  */
   int m_fd;
 };
@@ -12296,34 +12475,39 @@ private:
 void
 remote_file_put (const char *local_file, const char *remote_file, int from_tty)
 {
-  struct cleanup *back_to;
+  remote_target *remote = get_current_remote_target ();
+
+  if (remote == nullptr)
+    error (_("command can only be used with remote target"));
+
+  remote->remote_file_put (local_file, remote_file, from_tty);
+}
+
+void
+remote_target::remote_file_put (const char *local_file, const char *remote_file,
+                               int from_tty)
+{
   int retcode, remote_errno, bytes, io_size;
-  gdb_byte *buffer;
   int bytes_in_buffer;
   int saw_eof;
   ULONGEST offset;
-  struct remote_state *rs = get_remote_state ();
-
-  if (!rs->remote_desc)
-    error (_("command can only be used with remote target"));
 
   gdb_file_up file = gdb_fopen_cloexec (local_file, "rb");
   if (file == NULL)
     perror_with_name (local_file);
 
   scoped_remote_fd fd
-    (remote_hostio_open (find_target_at (process_stratum), NULL,
-                        remote_file, (FILEIO_O_WRONLY | FILEIO_O_CREAT
-                                      | FILEIO_O_TRUNC),
-                        0700, 0, &remote_errno));
+    (this, remote_hostio_open (NULL,
+                              remote_file, (FILEIO_O_WRONLY | FILEIO_O_CREAT
+                                            | FILEIO_O_TRUNC),
+                              0700, 0, &remote_errno));
   if (fd.get () == -1)
     remote_hostio_error (remote_errno);
 
   /* Send up to this many bytes at once.  They won't all fit in the
      remote packet limit, so we'll transfer slightly fewer.  */
   io_size = get_remote_packet_size ();
-  buffer = (gdb_byte *) xmalloc (io_size);
-  back_to = make_cleanup (xfree, buffer);
+  gdb::byte_vector buffer (io_size);
 
   bytes_in_buffer = 0;
   saw_eof = 0;
@@ -12332,7 +12516,7 @@ remote_file_put (const char *local_file, const char *remote_file, int from_tty)
     {
       if (!saw_eof)
        {
-         bytes = fread (buffer + bytes_in_buffer, 1,
+         bytes = fread (buffer.data () + bytes_in_buffer, 1,
                         io_size - bytes_in_buffer,
                         file.get ());
          if (bytes == 0)
@@ -12355,8 +12539,7 @@ remote_file_put (const char *local_file, const char *remote_file, int from_tty)
       bytes += bytes_in_buffer;
       bytes_in_buffer = 0;
 
-      retcode = remote_hostio_pwrite (find_target_at (process_stratum),
-                                     fd.get (), buffer, bytes,
+      retcode = remote_hostio_pwrite (fd.get (), buffer.data (), bytes,
                                      offset, &remote_errno);
 
       if (retcode < 0)
@@ -12368,37 +12551,41 @@ remote_file_put (const char *local_file, const char *remote_file, int from_tty)
          /* Short write.  Save the rest of the read data for the next
             write.  */
          bytes_in_buffer = bytes - retcode;
-         memmove (buffer, buffer + retcode, bytes_in_buffer);
+         memmove (buffer.data (), buffer.data () + retcode, bytes_in_buffer);
        }
 
       offset += retcode;
     }
 
-  if (remote_hostio_close (find_target_at (process_stratum),
-                          fd.release (), &remote_errno))
+  if (remote_hostio_close (fd.release (), &remote_errno))
     remote_hostio_error (remote_errno);
 
   if (from_tty)
     printf_filtered (_("Successfully sent file \"%s\".\n"), local_file);
-  do_cleanups (back_to);
 }
 
 void
 remote_file_get (const char *remote_file, const char *local_file, int from_tty)
 {
-  struct cleanup *back_to;
-  int remote_errno, bytes, io_size;
-  gdb_byte *buffer;
-  ULONGEST offset;
-  struct remote_state *rs = get_remote_state ();
+  remote_target *remote = get_current_remote_target ();
 
-  if (!rs->remote_desc)
+  if (remote == nullptr)
     error (_("command can only be used with remote target"));
 
+  remote->remote_file_get (remote_file, local_file, from_tty);
+}
+
+void
+remote_target::remote_file_get (const char *remote_file, const char *local_file,
+                               int from_tty)
+{
+  int remote_errno, bytes, io_size;
+  ULONGEST offset;
+
   scoped_remote_fd fd
-    (remote_hostio_open (find_target_at (process_stratum), NULL,
-                        remote_file, FILEIO_O_RDONLY, 0, 0,
-                        &remote_errno));
+    (this, remote_hostio_open (NULL,
+                              remote_file, FILEIO_O_RDONLY, 0, 0,
+                              &remote_errno));
   if (fd.get () == -1)
     remote_hostio_error (remote_errno);
 
@@ -12409,14 +12596,12 @@ remote_file_get (const char *remote_file, const char *local_file, int from_tty)
   /* Send up to this many bytes at once.  They won't all fit in the
      remote packet limit, so we'll transfer slightly fewer.  */
   io_size = get_remote_packet_size ();
-  buffer = (gdb_byte *) xmalloc (io_size);
-  back_to = make_cleanup (xfree, buffer);
+  gdb::byte_vector buffer (io_size);
 
   offset = 0;
   while (1)
     {
-      bytes = remote_hostio_pread (find_target_at (process_stratum),
-                                  fd.get (), buffer, io_size, offset,
+      bytes = remote_hostio_pread (fd.get (), buffer.data (), io_size, offset,
                                   &remote_errno);
       if (bytes == 0)
        /* Success, but no bytes, means end-of-file.  */
@@ -12426,31 +12611,35 @@ remote_file_get (const char *remote_file, const char *local_file, int from_tty)
 
       offset += bytes;
 
-      bytes = fwrite (buffer, 1, bytes, file.get ());
+      bytes = fwrite (buffer.data (), 1, bytes, file.get ());
       if (bytes == 0)
        perror_with_name (local_file);
     }
 
-  if (remote_hostio_close (find_target_at (process_stratum),
-                          fd.release (), &remote_errno))
+  if (remote_hostio_close (fd.release (), &remote_errno))
     remote_hostio_error (remote_errno);
 
   if (from_tty)
     printf_filtered (_("Successfully fetched file \"%s\".\n"), remote_file);
-  do_cleanups (back_to);
 }
 
 void
 remote_file_delete (const char *remote_file, int from_tty)
 {
-  int retcode, remote_errno;
-  struct remote_state *rs = get_remote_state ();
+  remote_target *remote = get_current_remote_target ();
 
-  if (!rs->remote_desc)
+  if (remote == nullptr)
     error (_("command can only be used with remote target"));
 
-  retcode = remote_hostio_unlink (find_target_at (process_stratum),
-                                 NULL, remote_file, &remote_errno);
+  remote->remote_file_delete (remote_file, from_tty);
+}
+
+void
+remote_target::remote_file_delete (const char *remote_file, int from_tty)
+{
+  int retcode, remote_errno;
+
+  retcode = remote_hostio_unlink (NULL, remote_file, &remote_errno);
   if (retcode == -1)
     remote_hostio_error (remote_errno);
 
@@ -12597,9 +12786,9 @@ remote_target::trace_init ()
 /* Recursive routine to walk through command list including loops, and
    download packets for each command.  */
 
-static void
-remote_download_command_source (int num, ULONGEST addr,
-                               struct command_line *cmds)
+void
+remote_target::remote_download_command_source (int num, ULONGEST addr,
+                                              struct command_line *cmds)
 {
   struct remote_state *rs = get_remote_state ();
   struct command_line *cmd;
@@ -12637,26 +12826,35 @@ remote_download_command_source (int num, ULONGEST addr,
 void
 remote_target::download_tracepoint (struct bp_location *loc)
 {
-#define BUF_SIZE 2048
-
   CORE_ADDR tpaddr;
   char addrbuf[40];
-  char buf[BUF_SIZE];
   std::vector<std::string> tdp_actions;
   std::vector<std::string> stepping_actions;
   char *pkt;
   struct breakpoint *b = loc->owner;
   struct tracepoint *t = (struct tracepoint *) b;
   struct remote_state *rs = get_remote_state ();
+  int ret;
+  const char *err_msg = _("Tracepoint packet too large for target.");
+  size_t size_left;
+
+  /* We use a buffer other than rs->buf because we'll build strings
+     across multiple statements, and other statements in between could
+     modify rs->buf.  */
+  gdb::char_vector buf (get_remote_packet_size ());
 
   encode_actions_rsp (loc, &tdp_actions, &stepping_actions);
 
   tpaddr = loc->address;
   sprintf_vma (addrbuf, tpaddr);
-  xsnprintf (buf, BUF_SIZE, "QTDP:%x:%s:%c:%lx:%x", b->number,
-            addrbuf, /* address */
-            (b->enable_state == bp_enabled ? 'E' : 'D'),
-            t->step_count, t->pass_count);
+  ret = snprintf (buf.data (), buf.size (), "QTDP:%x:%s:%c:%lx:%x",
+                 b->number, addrbuf, /* address */
+                 (b->enable_state == bp_enabled ? 'E' : 'D'),
+                 t->step_count, t->pass_count);
+
+  if (ret < 0 || ret >= buf.size ())
+    error ("%s", err_msg);
+
   /* Fast tracepoints are mostly handled by the target, but we can
      tell the target how big of an instruction block should be moved
      around.  */
@@ -12668,8 +12866,15 @@ remote_target::download_tracepoint (struct bp_location *loc)
        {
          if (gdbarch_fast_tracepoint_valid_at (loc->gdbarch, tpaddr,
                                                NULL))
-           xsnprintf (buf + strlen (buf), BUF_SIZE - strlen (buf), ":F%x",
-                      gdb_insn_length (loc->gdbarch, tpaddr));
+           {
+             size_left = buf.size () - strlen (buf.data ());
+             ret = snprintf (buf.data () + strlen (buf.data ()),
+                             size_left, ":F%x",
+                             gdb_insn_length (loc->gdbarch, tpaddr));
+
+             if (ret < 0 || ret >= size_left)
+               error ("%s", err_msg);
+           }
          else
            /* If it passed validation at definition but fails now,
               something is very wrong.  */
@@ -12693,7 +12898,14 @@ remote_target::download_tracepoint (struct bp_location *loc)
          struct static_tracepoint_marker marker;
 
          if (target_static_tracepoint_marker_at (tpaddr, &marker))
-           strcat (buf, ":S");
+           {
+             size_left = buf.size () - strlen (buf.data ());
+             ret = snprintf (buf.data () + strlen (buf.data ()),
+                             size_left, ":S");
+
+             if (ret < 0 || ret >= size_left)
+               error ("%s", err_msg);
+           }
          else
            error (_("Static tracepoint not valid during download"));
        }
@@ -12711,10 +12923,26 @@ remote_target::download_tracepoint (struct bp_location *loc)
         capabilities at definition time.  */
       if (remote_supports_cond_tracepoints ())
        {
-         agent_expr_up aexpr = gen_eval_for_expr (tpaddr, loc->cond.get ());
-         xsnprintf (buf + strlen (buf), BUF_SIZE - strlen (buf), ":X%x,",
-                    aexpr->len);
-         pkt = buf + strlen (buf);
+         agent_expr_up aexpr = gen_eval_for_expr (tpaddr,
+                                                  loc->cond.get ());
+
+         size_left = buf.size () - strlen (buf.data ());
+
+         ret = snprintf (buf.data () + strlen (buf.data ()),
+                         size_left, ":X%x,", aexpr->len);
+
+         if (ret < 0 || ret >= size_left)
+           error ("%s", err_msg);
+
+         size_left = buf.size () - strlen (buf.data ());
+
+         /* Two bytes to encode each aexpr byte, plus the terminating
+            null byte.  */
+         if (aexpr->len * 2 + 1 > size_left)
+           error ("%s", err_msg);
+
+         pkt = buf.data () + strlen (buf.data ());
+
          for (int ndx = 0; ndx < aexpr->len; ++ndx)
            pkt = pack_hex_byte (pkt, aexpr->buf[ndx]);
          *pkt = '\0';
@@ -12725,8 +12953,17 @@ remote_target::download_tracepoint (struct bp_location *loc)
     }
 
   if (b->commands || *default_collect)
-    strcat (buf, "-");
-  putpkt (buf);
+    {
+      size_left = buf.size () - strlen (buf.data ());
+
+      ret = snprintf (buf.data () + strlen (buf.data ()),
+                     size_left, "-");
+
+      if (ret < 0 || ret >= size_left)
+       error ("%s", err_msg);
+    }
+
+  putpkt (buf.data ());
   remote_get_noisy_reply ();
   if (strcmp (rs->buf, "OK"))
     error (_("Target does not support tracepoints."));
@@ -12737,58 +12974,76 @@ remote_target::download_tracepoint (struct bp_location *loc)
     {
       QUIT;    /* Allow user to bail out with ^C.  */
 
-      bool has_more = (action_it != tdp_actions.end ()
+      bool has_more = ((action_it + 1) != tdp_actions.end ()
                       || !stepping_actions.empty ());
 
-      xsnprintf (buf, BUF_SIZE, "QTDP:-%x:%s:%s%c",
-                b->number, addrbuf, /* address */
-                action_it->c_str (),
-                has_more ? '-' : 0);
-      putpkt (buf);
+      ret = snprintf (buf.data (), buf.size (), "QTDP:-%x:%s:%s%c",
+                     b->number, addrbuf, /* address */
+                     action_it->c_str (),
+                     has_more ? '-' : 0);
+
+      if (ret < 0 || ret >= buf.size ())
+       error ("%s", err_msg);
+
+      putpkt (buf.data ());
       remote_get_noisy_reply ();
       if (strcmp (rs->buf, "OK"))
        error (_("Error on target while setting tracepoints."));
     }
 
-    for (auto action_it = stepping_actions.begin ();
-        action_it != stepping_actions.end (); action_it++)
-      {
-       QUIT;   /* Allow user to bail out with ^C.  */
-
-       bool is_first = action_it == stepping_actions.begin ();
-       bool has_more = action_it != stepping_actions.end ();
-
-       xsnprintf (buf, BUF_SIZE, "QTDP:-%x:%s:%s%s%s",
-                  b->number, addrbuf, /* address */
-                  is_first ? "S" : "",
-                  action_it->c_str (),
-                  has_more ? "-" : "");
-       putpkt (buf);
-       remote_get_noisy_reply ();
-       if (strcmp (rs->buf, "OK"))
-         error (_("Error on target while setting tracepoints."));
-      }
+  for (auto action_it = stepping_actions.begin ();
+       action_it != stepping_actions.end (); action_it++)
+    {
+      QUIT;    /* Allow user to bail out with ^C.  */
+
+      bool is_first = action_it == stepping_actions.begin ();
+      bool has_more = (action_it + 1) != stepping_actions.end ();
+
+      ret = snprintf (buf.data (), buf.size (), "QTDP:-%x:%s:%s%s%s",
+                     b->number, addrbuf, /* address */
+                     is_first ? "S" : "",
+                     action_it->c_str (),
+                     has_more ? "-" : "");
+
+      if (ret < 0 || ret >= buf.size ())
+       error ("%s", err_msg);
+
+      putpkt (buf.data ());
+      remote_get_noisy_reply ();
+      if (strcmp (rs->buf, "OK"))
+       error (_("Error on target while setting tracepoints."));
+    }
 
   if (packet_support (PACKET_TracepointSource) == PACKET_ENABLE)
     {
       if (b->location != NULL)
        {
-         strcpy (buf, "QTDPsrc:");
+         ret = snprintf (buf.data (), buf.size (), "QTDPsrc:");
+
+         if (ret < 0 || ret >= buf.size ())
+           error ("%s", err_msg);
+
          encode_source_string (b->number, loc->address, "at",
                                event_location_to_string (b->location.get ()),
-                               buf + strlen (buf), 2048 - strlen (buf));
-         putpkt (buf);
+                               buf.data () + strlen (buf.data ()),
+                               buf.size () - strlen (buf.data ()));
+         putpkt (buf.data ());
          remote_get_noisy_reply ();
          if (strcmp (rs->buf, "OK"))
            warning (_("Target does not support source download."));
        }
       if (b->cond_string)
        {
-         strcpy (buf, "QTDPsrc:");
+         ret = snprintf (buf.data (), buf.size (), "QTDPsrc:");
+
+         if (ret < 0 || ret >= buf.size ())
+           error ("%s", err_msg);
+
          encode_source_string (b->number, loc->address,
-                               "cond", b->cond_string, buf + strlen (buf),
-                               2048 - strlen (buf));
-         putpkt (buf);
+                               "cond", b->cond_string,
+                               buf.data () + strlen (buf.data ()),
+                               buf.size () - strlen (buf.data ()));
+         putpkt (buf.data ());
          remote_get_noisy_reply ();
          if (strcmp (rs->buf, "OK"))
            warning (_("Target does not support source download."));
@@ -13280,7 +13535,7 @@ traceframe_info_up
 remote_target::traceframe_info ()
 {
   gdb::optional<gdb::char_vector> text
-    = target_read_stralloc (target_stack, TARGET_OBJECT_TRACEFRAME_INFO,
+    = target_read_stralloc (current_top_target (), TARGET_OBJECT_TRACEFRAME_INFO,
                            NULL);
   if (text)
     return parse_traceframe_info (text->data ());
@@ -13439,17 +13694,15 @@ struct btrace_target_info
 /* Reset our idea of our target's btrace configuration.  */
 
 static void
-remote_btrace_reset (void)
+remote_btrace_reset (remote_state *rs)
 {
-  struct remote_state *rs = get_remote_state ();
-
   memset (&rs->btrace_config, 0, sizeof (rs->btrace_config));
 }
 
 /* Synchronize the configuration with the target.  */
 
-static void
-btrace_sync_conf (const struct btrace_config *conf)
+void
+remote_target::btrace_sync_conf (const btrace_config *conf)
 {
   struct packet_config *packet;
   struct remote_state *rs;
@@ -13511,20 +13764,22 @@ static void
 btrace_read_config (struct btrace_config *conf)
 {
   gdb::optional<gdb::char_vector> xml
-    = target_read_stralloc (target_stack, TARGET_OBJECT_BTRACE_CONF, "");
+    = target_read_stralloc (current_top_target (), TARGET_OBJECT_BTRACE_CONF, "");
   if (xml)
     parse_xml_btrace_conf (conf, xml->data ());
 }
 
 /* Maybe reopen target btrace.  */
 
-static void
-remote_btrace_maybe_reopen (void)
+void
+remote_target::remote_btrace_maybe_reopen ()
 {
   struct remote_state *rs = get_remote_state ();
   struct thread_info *tp;
   int btrace_target_pushed = 0;
+#if !defined (HAVE_LIBIPT)
   int warned = 0;
+#endif
 
   scoped_restore_current_thread restore_thread;
 
@@ -13707,7 +13962,7 @@ remote_target::read_btrace (struct btrace_data *btrace,
     }
 
   gdb::optional<gdb::char_vector> xml
-    = target_read_stralloc (target_stack, TARGET_OBJECT_BTRACE, annex);
+    = target_read_stralloc (current_top_target (), TARGET_OBJECT_BTRACE, annex);
   if (!xml)
     return BTRACE_ERR_UNKNOWN;
 
@@ -13764,7 +14019,7 @@ remote_target::pid_to_exec_file (int pid)
       xsnprintf (annex, annex_size, "%x", pid);
     }
 
-  filename = target_read_stralloc (target_stack,
+  filename = target_read_stralloc (current_top_target (),
                                   TARGET_OBJECT_EXEC_FILE, annex);
 
   return filename ? filename->data () : nullptr;
@@ -13785,7 +14040,7 @@ remote_target::can_do_single_step ()
       struct remote_state *rs = get_remote_state ();
 
       if (packet_support (PACKET_vCont) == PACKET_SUPPORT_UNKNOWN)
-       remote_vcont_probe (rs);
+       remote_vcont_probe ();
 
       return rs->supports_vCont.s && rs->supports_vCont.S;
     }
@@ -13876,7 +14131,7 @@ remote_async_serial_handler (struct serial *scb, void *context)
 static void
 remote_async_inferior_event_handler (gdb_client_data data)
 {
-  inferior_event_handler (INF_REG_EVENT, NULL);
+  inferior_event_handler (INF_REG_EVENT, data);
 }
 
 void
@@ -13890,8 +14145,8 @@ remote_target::async (int enable)
 
       /* If there are pending events in the stop reply queue tell the
         event loop to process them.  */
-      if (!QUEUE_is_empty (stop_reply_p, stop_reply_queue))
-       mark_async_event_handler (remote_async_inferior_event_token);
+      if (!rs->stop_reply_queue.empty ())
+       mark_async_event_handler (rs->remote_async_inferior_event_token);
       /* For simplicity, below we clear the pending events token
         without remembering whether it is marked, so here we always
         mark it.  If there's actually no pending notification to
@@ -13906,7 +14161,7 @@ remote_target::async (int enable)
       /* If the core is disabling async, it doesn't want to be
         disturbed with target events.  Clear all async event sources
         too.  */
-      clear_async_event_handler (remote_async_inferior_event_token);
+      clear_async_event_handler (rs->remote_async_inferior_event_token);
       if (target_is_non_stop_p ())
        clear_async_event_handler (rs->notif_state->get_pending_events_token);
     }
@@ -13982,10 +14237,10 @@ show_remote_cmd (const char *args, int from_tty)
 static void
 remote_new_objfile (struct objfile *objfile)
 {
-  struct remote_state *rs = get_remote_state ();
+  remote_target *remote = get_current_remote_target ();
 
-  if (rs->remote_desc != 0)            /* Have a remote connection.  */
-    remote_check_symbols ();
+  if (remote != NULL)                  /* Have a remote connection.  */
+    remote->remote_check_symbols ();
 }
 
 /* Pull all the tracepoints defined on the target and create local
@@ -14047,29 +14302,33 @@ show_range_stepping (struct ui_file *file, int from_tty,
                      "is %s.\n"), value);
 }
 
+/* Return true if the vCont;r action is supported by the remote
+   stub.  */
+
+bool
+remote_target::vcont_r_supported ()
+{
+  if (packet_support (PACKET_vCont) == PACKET_SUPPORT_UNKNOWN)
+    remote_vcont_probe ();
+
+  return (packet_support (PACKET_vCont) == PACKET_ENABLE
+         && get_remote_state ()->supports_vCont.r);
+}
+
 /* The "set/show range-stepping" set hook.  */
 
 static void
 set_range_stepping (const char *ignore_args, int from_tty,
                    struct cmd_list_element *c)
 {
-  struct remote_state *rs = get_remote_state ();
-
-  /* Whene enabling, check whether range stepping is actually
-     supported by the target, and warn if not.  */
+  /* When enabling, check whether range stepping is actually supported
+     by the target, and warn if not.  */
   if (use_range_stepping)
     {
-      if (rs->remote_desc != NULL)
-       {
-         if (packet_support (PACKET_vCont) == PACKET_SUPPORT_UNKNOWN)
-           remote_vcont_probe (rs);
-
-         if (packet_support (PACKET_vCont) == PACKET_ENABLE
-             && rs->supports_vCont.r)
-           return;
-       }
-
-      warning (_("Range stepping is not supported by the current target"));
+      remote_target *remote = get_current_remote_target ();
+      if (remote == NULL
+         || !remote->vcont_r_supported ())
+       warning (_("Range stepping is not supported by the current target"));
     }
 }
 
@@ -14087,11 +14346,6 @@ _initialize_remote (void)
     = register_program_space_data_with_cleanup (NULL,
                                                remote_pspace_data_cleanup);
 
-  /* Initialize the per-target state.  At the moment there is only one
-     of these, not one per target.  Only one target is active at a
-     time.  */
-  remote_state = new struct remote_state ();
-
   add_target (remote_target_info, remote_target::open);
   add_target (extended_remote_target_info, extended_remote_target::open);
 
@@ -14102,7 +14356,6 @@ _initialize_remote (void)
   init_remote_threadtests ();
 #endif
 
-  stop_reply_queue = QUEUE_alloc (stop_reply_p, stop_reply_xfree);
   /* set/show remote ...  */
 
   add_prefix_cmd ("remote", class_maintenance, set_remote_cmd, _("\
@@ -14197,32 +14450,28 @@ further restriction and ``limit'' to enable that restriction."),
           _("Show the maximum number of bytes per memory-read packet."),
           &remote_show_cmdlist);
 
-  add_setshow_zinteger_cmd ("hardware-watchpoint-limit", no_class,
+  add_setshow_zuinteger_unlimited_cmd ("hardware-watchpoint-limit", no_class,
                            &remote_hw_watchpoint_limit, _("\
 Set the maximum number of target hardware watchpoints."), _("\
 Show the maximum number of target hardware watchpoints."), _("\
-Specify a negative limit for unlimited."),
-                           NULL, NULL, /* FIXME: i18n: The maximum
-                                          number of target hardware
-                                          watchpoints is %s.  */
-                           &remote_set_cmdlist, &remote_show_cmdlist);
-  add_setshow_zinteger_cmd ("hardware-watchpoint-length-limit", no_class,
+Specify \"unlimited\" for unlimited hardware watchpoints."),
+                           NULL, show_hardware_watchpoint_limit,
+                           &remote_set_cmdlist,
+                           &remote_show_cmdlist);
+  add_setshow_zuinteger_unlimited_cmd ("hardware-watchpoint-length-limit",
+                           no_class,
                            &remote_hw_watchpoint_length_limit, _("\
 Set the maximum length (in bytes) of a target hardware watchpoint."), _("\
 Show the maximum length (in bytes) of a target hardware watchpoint."), _("\
-Specify a negative limit for unlimited."),
-                           NULL, NULL, /* FIXME: i18n: The maximum
-                                           length (in bytes) of a target
-                                           hardware watchpoint is %s.  */
+Specify \"unlimited\" to allow watchpoints of unlimited size."),
+                           NULL, show_hardware_watchpoint_length_limit,
                            &remote_set_cmdlist, &remote_show_cmdlist);
-  add_setshow_zinteger_cmd ("hardware-breakpoint-limit", no_class,
+  add_setshow_zuinteger_unlimited_cmd ("hardware-breakpoint-limit", no_class,
                            &remote_hw_breakpoint_limit, _("\
 Set the maximum number of target hardware breakpoints."), _("\
 Show the maximum number of target hardware breakpoints."), _("\
-Specify a negative limit for unlimited."),
-                           NULL, NULL, /* FIXME: i18n: The maximum
-                                          number of target hardware
-                                          breakpoints is %s.  */
+Specify \"unlimited\" for unlimited hardware breakpoints."),
+                           NULL, show_hardware_breakpoint_limit,
                            &remote_set_cmdlist, &remote_show_cmdlist);
 
   add_setshow_zuinteger_cmd ("remoteaddresssize", class_obscure,
@@ -14587,7 +14836,7 @@ stepping is supported by the target.  The default is on."),
 
   /* Take advantage of the fact that the TID field is not used, to tag
      special ptids with it set to != 0.  */
-  magic_null_ptid = ptid_build (42000, -1, 1);
-  not_sent_ptid = ptid_build (42000, -2, 1);
-  any_thread_ptid = ptid_build (42000, 0, 1);
+  magic_null_ptid = ptid_t (42000, -1, 1);
+  not_sent_ptid = ptid_t (42000, -2, 1);
+  any_thread_ptid = ptid_t (42000, 0, 1);
 }
This page took 0.095681 seconds and 4 git commands to generate.