/* Base/prototype target for default child (native) targets.
- Copyright (C) 2004-2017 Free Software Foundation, Inc.
+ Copyright (C) 2004-2022 Free Software Foundation, Inc.
This file is part of GDB.
#ifndef INF_CHILD_H
#define INF_CHILD_H
-/* Create a prototype child target. The client can override it with
- local methods. */
+#include "target.h"
+#include "process-stratum-target.h"
-extern struct target_ops *inf_child_target (void);
+/* A prototype child target. The client can override it with local
+ methods. */
-/* Functions for helping to write a native target. */
+class inf_child_target
+ : public memory_breakpoint_target<process_stratum_target>
+{
+public:
+ inf_child_target () = default;
+ ~inf_child_target () override = 0;
-/* This is for native targets which use a unix/POSIX-style waitstatus. */
-extern void store_waitstatus (struct target_waitstatus *, int);
+ const target_info &info () const override;
-/* This is to be called by the native target's open routine to push
- the target, in case it need to override to_open. */
+ void close () override;
-extern void inf_child_open_target (struct target_ops *target,
- const char *arg, int from_tty);
+ void disconnect (const char *, int) override;
-/* To be called by the native target's to_mourn_inferior routine. */
+ void fetch_registers (struct regcache *, int) override = 0;
+ void store_registers (struct regcache *, int) override = 0;
-extern void inf_child_mourn_inferior (struct target_ops *ops);
+ void prepare_to_store (struct regcache *) override;
-/* Unpush the target if it wasn't explicitly open with "target native"
- and there are no live inferiors left. Note: if calling this as a
- result of a mourn or detach, the current inferior shall already
- have its PID cleared, so it isn't counted as live. That's usually
- done by calling either generic_mourn_inferior or
- detach_inferior. */
+ bool supports_terminal_ours () override;
+ void terminal_init () override;
+ void terminal_inferior () override;
+ void terminal_save_inferior () override;
+ void terminal_ours_for_output () override;
+ void terminal_ours () override;
+ void terminal_info (const char *, int) override;
-extern void inf_child_maybe_unpush_target (struct target_ops *ops);
+ void interrupt () override;
+ void pass_ctrlc () override;
+
+ void follow_exec (inferior *follow_inf, ptid_t ptid,
+ const char *execd_pathname) override;
+
+ void mourn_inferior () override;
+
+ bool can_run () override;
+
+ bool can_create_inferior () override;
+ void create_inferior (const char *, const std::string &,
+ char **, int) override = 0;
+
+ bool can_attach () override;
+ void attach (const char *, int) override = 0;
+
+ void post_attach (int) override;
+
+ char *pid_to_exec_file (int pid) override;
+
+ int fileio_open (struct inferior *inf, const char *filename,
+ int flags, int mode, int warn_if_slow,
+ int *target_errno) override;
+ int fileio_pwrite (int fd, const gdb_byte *write_buf, int len,
+ ULONGEST offset, int *target_errno) override;
+ int fileio_pread (int fd, gdb_byte *read_buf, int len,
+ ULONGEST offset, int *target_errno) override;
+ int fileio_fstat (int fd, struct stat *sb, int *target_errno) override;
+ int fileio_close (int fd, int *target_errno) override;
+ int fileio_unlink (struct inferior *inf,
+ const char *filename,
+ int *target_errno) override;
+ gdb::optional<std::string> fileio_readlink (struct inferior *inf,
+ const char *filename,
+ int *target_errno) override;
+ bool use_agent (bool use) override;
+
+ bool can_use_agent () override;
+
+protected:
+ /* Unpush the target if it wasn't explicitly open with "target native"
+ and there are no live inferiors left. Note: if calling this as a
+ result of a mourn or detach, the current inferior shall already
+ have its PID cleared, so it isn't counted as live. That's usually
+ done by calling either generic_mourn_inferior or
+ detach_inferior. */
+ void maybe_unpush_target ();
+};
+
+/* Convert the host wait(2) status to a target_waitstatus. */
+
+extern target_waitstatus host_status_to_waitstatus (int hoststatus);
+
+/* Register TARGET as native target and set it up to respond to the
+ "target native" command. */
+extern void add_inf_child_target (inf_child_target *target);
+
+/* target_open_ftype callback for inf-child targets. Used by targets
+ that want to register an alternative target_info object. Most
+ targets use add_inf_child_target instead. */
+extern void inf_child_open_target (const char *arg, int from_tty);
#endif