aboutsummaryrefslogtreecommitdiff
path: root/gdb/inf-child.h
blob: 98969bc5fa31fcdb65786840c44ba38cd0025880 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/* Base/prototype target for default child (native) targets.

   Copyright (C) 2004-2018 Free Software Foundation, Inc.

   This file is part of GDB.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

#ifndef INF_CHILD_H
#define INF_CHILD_H

#include "target.h"

/* A prototype child target.  The client can override it with local
   methods.  */

class inf_child_target
  : public memory_breakpoint_target<target_ops>
{
public:
  inf_child_target ();
  ~inf_child_target () override = 0;

  const target_info &info () const override;

  void close () override;

  void disconnect (const char *, int) override;

  void fetch_registers (struct regcache *, int) override = 0;
  void store_registers (struct regcache *, int) override = 0;

  void prepare_to_store (struct regcache *) override;

  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;

  void interrupt () override;
  void pass_ctrlc () override;

  void post_startup_inferior (ptid_t) 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;

  /* We must default these because they must be implemented by any
     target that can run.  */
  bool can_async_p ()  override { return false; }
  bool supports_non_stop ()  override { return false; }
  bool supports_disable_randomization () override { return false; }

  char *pid_to_exec_file (int pid) override;

  bool has_all_memory () override;
  bool has_memory () override;
  bool has_stack () override;
  bool has_registers () override;
  bool has_execution (ptid_t) 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 ();
};

/* Functions for helping to write a native target.  */

/* This is for native targets which use a unix/POSIX-style waitstatus.  */
extern void store_waitstatus (struct target_waitstatus *, int);

/* 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