gdb: fix darwin-nat.c build / adapt to multi-target

The darwin-nat.c file doesn't build since the multi-target changes
(5b6d1e4f, "Multi-target support").  This patch makes it build.  I have
access to a macOS vm, so I am able to build it, but I wasn't able to
successfully codesign it and try to actually debug something, so I don't
know if it works.  I don't have much more time to put on this to figure
it out, so I thought I'd sent the patch anyway, as it's at least a step
in the right direction.

The bulk of the patch is to change a bunch of functions to be methods of
the darwin_nat_target object, so that this can pass `this` to
find_inferior_ptid and other functions that now require a
process_stratum_target pointer.

The darwin_ptrace_him function (renamed to darwin_nat_target::ptrace_him
in this patch) is passed to fork_inferior as the `init_trace_fun`
parameter.  Since the method can't be passed as a plain function pointer
(we need the `this` pointer), I changed the `init_trace_fun` parameter
of fork_inferior to be a gdb::function_view, so we can pass a lambda and
capture `this`.

The changes in darwin-nat.h are only to move definition higher in the
file, so that forward declarations are not needed.

gdb/ChangeLog:

	* darwin-nat.h (struct darwin_exception_msg, enum
	darwin_msg_state, struct darwin_thread_info, darwin_thread_t):
	Move up.
	(class darwin_nat_target) <wait_1, check_new_threads,
	decode_exception_message, decode_message, stop_inferior,
	init_thread_list, ptrace_him, cancel_breakpoint>: Declare.
	* darwin-nat.c (darwin_check_new_threads): Rename to...
	(darwin_nat_target::check_new_threads): ... this.
	(darwin_suspend_inferior_it): Remove.
	(darwin_decode_exception_message): Rename to...
	(darwin_nat_target::decode_exception_message): ... this.
	(darwin_nat_target::resume): Pass target to find_inferior_ptid.
	(darwin_decode_message): Rename to...
	(darwin_nat_target::decode_message): ... this.
	(cancel_breakpoint): Rename to...
	(darwin_nat_target::cancel_breakpoint): ... this.
	(darwin_wait): Rename to...
	(darwin_nat_target::wait_1): ... this.  Use range-based for loop
	instead of iterate_over_inferiors.
	(darwin_nat_target::wait): Call wait_1 instead of darwin_wait.
	(darwin_stop_inferior): Rename to...
	(darwin_nat_target::stop_inferior): ... this.
	(darwin_nat_target::kill): Call wait_1 instead of darwin_wait.
	(darwin_init_thread_list): Rename to...
	(darwin_nat_target::init_thread_list): ... this.
	(darwin_ptrace_him): Rename to...
	(darwin_nat_target::ptrace_him): ... this.
	(darwin_nat_target::create_inferior): Pass lambda function to
	fork_inferior.
	(darwin_nat_target::detach): Call stop_inferior instead of
	darwin_stop_inferior.
	* fork-inferior.h (fork_inferior): Change init_trace_fun
	parameter to gdb::function_view.
	* fork-inferior.c (fork_inferior): Likewise.
This commit is contained in:
Simon Marchi 2020-01-23 14:55:50 -05:00
parent c162ed3e66
commit e7eee665a1
5 changed files with 169 additions and 118 deletions

View File

@ -1,3 +1,40 @@
2020-01-23 Simon Marchi <simon.marchi@efficios.com>
* darwin-nat.h (struct darwin_exception_msg, enum
darwin_msg_state, struct darwin_thread_info, darwin_thread_t):
Move up.
(class darwin_nat_target) <wait_1, check_new_threads,
decode_exception_message, decode_message, stop_inferior,
init_thread_list, ptrace_him, cancel_breakpoint>: Declare.
* darwin-nat.c (darwin_check_new_threads): Rename to...
(darwin_nat_target::check_new_threads): ... this.
(darwin_suspend_inferior_it): Remove.
(darwin_decode_exception_message): Rename to...
(darwin_nat_target::decode_exception_message): ... this.
(darwin_nat_target::resume): Pass target to find_inferior_ptid.
(darwin_decode_message): Rename to...
(darwin_nat_target::decode_message): ... this.
(cancel_breakpoint): Rename to...
(darwin_nat_target::cancel_breakpoint): ... this.
(darwin_wait): Rename to...
(darwin_nat_target::wait_1): ... this. Use range-based for loop
instead of iterate_over_inferiors.
(darwin_nat_target::wait): Call wait_1 instead of darwin_wait.
(darwin_stop_inferior): Rename to...
(darwin_nat_target::stop_inferior): ... this.
(darwin_nat_target::kill): Call wait_1 instead of darwin_wait.
(darwin_init_thread_list): Rename to...
(darwin_nat_target::init_thread_list): ... this.
(darwin_ptrace_him): Rename to...
(darwin_nat_target::ptrace_him): ... this.
(darwin_nat_target::create_inferior): Pass lambda function to
fork_inferior.
(darwin_nat_target::detach): Call stop_inferior instead of
darwin_stop_inferior.
* fork-inferior.h (fork_inferior): Change init_trace_fun
parameter to gdb::function_view.
* fork-inferior.c (fork_inferior): Likewise.
2020-01-23 Hannes Domani <ssbssa@yahoo.de> 2020-01-23 Hannes Domani <ssbssa@yahoo.de>
* i386-cygwin-tdep.c (core_process_module_section): Update. * i386-cygwin-tdep.c (core_process_module_section): Update.

View File

@ -89,12 +89,8 @@
#define PTRACE(CMD, PID, ADDR, SIG) \ #define PTRACE(CMD, PID, ADDR, SIG) \
darwin_ptrace(#CMD, CMD, (PID), (ADDR), (SIG)) darwin_ptrace(#CMD, CMD, (PID), (ADDR), (SIG))
static ptid_t darwin_wait (ptid_t ptid, struct target_waitstatus *status);
static void darwin_ptrace_me (void); static void darwin_ptrace_me (void);
static void darwin_ptrace_him (int pid);
static void darwin_encode_reply (mig_reply_error_t *reply, static void darwin_encode_reply (mig_reply_error_t *reply,
mach_msg_header_t *hdr, integer_t code); mach_msg_header_t *hdr, integer_t code);
@ -258,8 +254,8 @@ cmp_thread_t (const void *l, const void *r)
return (int)(tl - tr); return (int)(tl - tr);
} }
static void void
darwin_check_new_threads (struct inferior *inf) darwin_nat_target::check_new_threads (inferior *inf)
{ {
kern_return_t kret; kern_return_t kret;
thread_array_t thread_list; thread_array_t thread_list;
@ -355,7 +351,7 @@ darwin_check_new_threads (struct inferior *inf)
pti->msg_state = DARWIN_RUNNING; pti->msg_state = DARWIN_RUNNING;
/* Add the new thread. */ /* Add the new thread. */
add_thread_with_info (ptid_t (inf->pid, 0, new_id), pti); add_thread_with_info (this, ptid_t (inf->pid, 0, new_id), pti);
new_thread_vec.push_back (pti); new_thread_vec.push_back (pti);
new_ix++; new_ix++;
continue; continue;
@ -364,7 +360,7 @@ darwin_check_new_threads (struct inferior *inf)
{ {
/* A thread was removed. */ /* A thread was removed. */
struct thread_info *thr struct thread_info *thr
= find_thread_ptid (ptid_t (inf->pid, 0, old_id)); = find_thread_ptid (this, ptid_t (inf->pid, 0, old_id));
delete_thread (thr); delete_thread (thr);
kret = mach_port_deallocate (gdb_task, old_id); kret = mach_port_deallocate (gdb_task, old_id);
MACH_CHECK_ERROR (kret); MACH_CHECK_ERROR (kret);
@ -464,14 +460,6 @@ darwin_resume_inferior (struct inferior *inf)
/* Iterator functions. */ /* Iterator functions. */
static int
darwin_suspend_inferior_it (struct inferior *inf, void *arg)
{
darwin_suspend_inferior (inf);
darwin_check_new_threads (inf);
return 0;
}
static int static int
darwin_resume_inferior_it (struct inferior *inf, void *arg) darwin_resume_inferior_it (struct inferior *inf, void *arg)
{ {
@ -611,9 +599,9 @@ darwin_check_message_ndr (NDR_record_t *ndr)
/* Decode an exception message. */ /* Decode an exception message. */
static int int
darwin_decode_exception_message (mach_msg_header_t *hdr, darwin_nat_target::decode_exception_message (mach_msg_header_t *hdr,
struct inferior **pinf, inferior **pinf,
darwin_thread_t **pthread) darwin_thread_t **pthread)
{ {
mach_msg_body_t *bod = (mach_msg_body_t*)(hdr + 1); mach_msg_body_t *bod = (mach_msg_body_t*)(hdr + 1);
@ -712,7 +700,7 @@ darwin_decode_exception_message (mach_msg_header_t *hdr,
/* Find thread by port. */ /* Find thread by port. */
/* Check for new threads. Do it early so that the port in the exception /* Check for new threads. Do it early so that the port in the exception
message can be deallocated. */ message can be deallocated. */
darwin_check_new_threads (inf); check_new_threads (inf);
/* Free the thread port (as gdb knows the thread, it has already has a right /* Free the thread port (as gdb knows the thread, it has already has a right
for it, so this just decrement a reference counter). */ for it, so this just decrement a reference counter). */
@ -975,7 +963,7 @@ darwin_nat_target::resume (ptid_t ptid, int step, enum gdb_signal signal)
} }
else else
{ {
struct inferior *inf = find_inferior_ptid (ptid); inferior *inf = find_inferior_ptid (this, ptid);
long tid = ptid.tid (); long tid = ptid.tid ();
/* Stop the inferior (should be useless). */ /* Stop the inferior (should be useless). */
@ -1001,11 +989,11 @@ darwin_nat_target::resume (ptid_t ptid, int step, enum gdb_signal signal)
} }
} }
static ptid_t ptid_t
darwin_decode_message (mach_msg_header_t *hdr, darwin_nat_target::decode_message (mach_msg_header_t *hdr,
darwin_thread_t **pthread, darwin_thread_t **pthread,
struct inferior **pinf, inferior **pinf,
struct target_waitstatus *status) target_waitstatus *status)
{ {
darwin_thread_t *thread; darwin_thread_t *thread;
struct inferior *inf; struct inferior *inf;
@ -1016,7 +1004,7 @@ darwin_decode_message (mach_msg_header_t *hdr,
int res; int res;
/* Decode message. */ /* Decode message. */
res = darwin_decode_exception_message (hdr, &inf, &thread); res = decode_exception_message (hdr, &inf, &thread);
if (res < 0) if (res < 0)
{ {
@ -1172,8 +1160,8 @@ darwin_decode_message (mach_msg_header_t *hdr,
return minus_one_ptid; return minus_one_ptid;
} }
static int int
cancel_breakpoint (ptid_t ptid) darwin_nat_target::cancel_breakpoint (ptid_t ptid)
{ {
/* Arrange for a breakpoint to be hit again later. We will handle /* Arrange for a breakpoint to be hit again later. We will handle
the current event, eventually we will resume this thread, and this the current event, eventually we will resume this thread, and this
@ -1183,7 +1171,7 @@ cancel_breakpoint (ptid_t ptid)
delete or disable the breakpoint, but the thread will have already delete or disable the breakpoint, but the thread will have already
tripped on it. */ tripped on it. */
struct regcache *regcache = get_thread_regcache (ptid); struct regcache *regcache = get_thread_regcache (this, ptid);
struct gdbarch *gdbarch = regcache->arch (); struct gdbarch *gdbarch = regcache->arch ();
CORE_ADDR pc; CORE_ADDR pc;
@ -1202,8 +1190,8 @@ cancel_breakpoint (ptid_t ptid)
return 0; return 0;
} }
static ptid_t ptid_t
darwin_wait (ptid_t ptid, struct target_waitstatus *status) darwin_nat_target::wait_1 (ptid_t ptid, struct target_waitstatus *status)
{ {
kern_return_t kret; kern_return_t kret;
union union
@ -1262,7 +1250,7 @@ darwin_wait (ptid_t ptid, struct target_waitstatus *status)
if (darwin_debug_flag > 10) if (darwin_debug_flag > 10)
darwin_dump_message (hdr, darwin_debug_flag > 11); darwin_dump_message (hdr, darwin_debug_flag > 11);
res = darwin_decode_message (hdr, &thread, &inf, status); res = decode_message (hdr, &thread, &inf, status);
if (res == minus_one_ptid) if (res == minus_one_ptid)
continue; continue;
@ -1273,7 +1261,11 @@ darwin_wait (ptid_t ptid, struct target_waitstatus *status)
while (status->kind == TARGET_WAITKIND_IGNORE); while (status->kind == TARGET_WAITKIND_IGNORE);
/* Stop all tasks. */ /* Stop all tasks. */
iterate_over_inferiors (darwin_suspend_inferior_it, NULL); for (inferior *inf : all_inferiors (this))
{
darwin_suspend_inferior (inf);
check_new_threads (inf);
}
/* Read pending messages. */ /* Read pending messages. */
while (1) while (1)
@ -1298,7 +1290,7 @@ darwin_wait (ptid_t ptid, struct target_waitstatus *status)
if (darwin_debug_flag > 10) if (darwin_debug_flag > 10)
darwin_dump_message (hdr, darwin_debug_flag > 11); darwin_dump_message (hdr, darwin_debug_flag > 11);
ptid2 = darwin_decode_message (hdr, &thread, &inf, &status2); ptid2 = decode_message (hdr, &thread, &inf, &status2);
if (inf != NULL && thread != NULL if (inf != NULL && thread != NULL
&& thread->event.ex_type == EXC_BREAKPOINT) && thread->event.ex_type == EXC_BREAKPOINT)
@ -1325,7 +1317,7 @@ ptid_t
darwin_nat_target::wait (ptid_t ptid, struct target_waitstatus *status, darwin_nat_target::wait (ptid_t ptid, struct target_waitstatus *status,
int options) int options)
{ {
return darwin_wait (ptid, status); return wait_1 (ptid, status);
} }
void void
@ -1415,8 +1407,8 @@ darwin_reply_to_all_pending_messages (struct inferior *inf)
} }
} }
static void void
darwin_stop_inferior (struct inferior *inf) darwin_nat_target::stop_inferior (inferior *inf)
{ {
struct target_waitstatus wstatus; struct target_waitstatus wstatus;
ptid_t ptid; ptid_t ptid;
@ -1432,14 +1424,14 @@ darwin_stop_inferior (struct inferior *inf)
if (priv->no_ptrace) if (priv->no_ptrace)
return; return;
res = kill (inf->pid, SIGSTOP); res = ::kill (inf->pid, SIGSTOP);
if (res != 0) if (res != 0)
warning (_("cannot kill: %s"), safe_strerror (errno)); warning (_("cannot kill: %s"), safe_strerror (errno));
/* Wait until the process is really stopped. */ /* Wait until the process is really stopped. */
while (1) while (1)
{ {
ptid = darwin_wait (inferior_ptid, &wstatus); ptid = wait_1 (inferior_ptid, &wstatus);
if (wstatus.kind == TARGET_WAITKIND_STOPPED if (wstatus.kind == TARGET_WAITKIND_STOPPED
&& wstatus.value.sig == GDB_SIGNAL_STOP) && wstatus.value.sig == GDB_SIGNAL_STOP)
break; break;
@ -1564,7 +1556,7 @@ darwin_nat_target::kill ()
darwin_resume_inferior (inf); darwin_resume_inferior (inf);
ptid = darwin_wait (inferior_ptid, &wstatus); ptid = wait_1 (inferior_ptid, &wstatus);
} }
else if (errno != ESRCH) else if (errno != ESRCH)
warning (_("Failed to kill inferior: kill (%d, 9) returned [%s]"), warning (_("Failed to kill inferior: kill (%d, 9) returned [%s]"),
@ -1716,10 +1708,10 @@ thread_info_from_private_thread_info (darwin_thread_info *pti)
gdb_assert_not_reached ("did not find gdb thread for darwin thread"); gdb_assert_not_reached ("did not find gdb thread for darwin thread");
} }
static void void
darwin_init_thread_list (struct inferior *inf) darwin_nat_target::init_thread_list (inferior *inf)
{ {
darwin_check_new_threads (inf); check_new_threads (inf);
darwin_inferior *priv = get_darwin_inferior (inf); darwin_inferior *priv = get_darwin_inferior (inf);
@ -1783,21 +1775,21 @@ darwin_pre_ptrace (void)
mark_fd_no_cloexec (ptrace_fds[1]); mark_fd_no_cloexec (ptrace_fds[1]);
} }
static void void
darwin_ptrace_him (int pid) darwin_nat_target::ptrace_him (int pid)
{ {
struct inferior *inf = current_inferior (); struct inferior *inf = current_inferior ();
darwin_attach_pid (inf); darwin_attach_pid (inf);
/* Let's the child run. */ /* Let's the child run. */
close (ptrace_fds[0]); ::close (ptrace_fds[0]);
close (ptrace_fds[1]); ::close (ptrace_fds[1]);
unmark_fd_no_cloexec (ptrace_fds[0]); unmark_fd_no_cloexec (ptrace_fds[0]);
unmark_fd_no_cloexec (ptrace_fds[1]); unmark_fd_no_cloexec (ptrace_fds[1]);
darwin_init_thread_list (inf); init_thread_list (inf);
gdb_startup_inferior (pid, START_INFERIOR_TRAPS_EXPECTED); gdb_startup_inferior (pid, START_INFERIOR_TRAPS_EXPECTED);
} }
@ -1986,6 +1978,7 @@ darwin_nat_target::create_inferior (const char *exec_file,
char **env, int from_tty) char **env, int from_tty)
{ {
gdb::optional<scoped_restore_tmpl<bool>> restore_startup_with_shell; gdb::optional<scoped_restore_tmpl<bool>> restore_startup_with_shell;
darwin_nat_target *the_target = this;
if (startup_with_shell && may_have_sip ()) if (startup_with_shell && may_have_sip ())
{ {
@ -1998,7 +1991,11 @@ darwin_nat_target::create_inferior (const char *exec_file,
/* Do the hard work. */ /* Do the hard work. */
fork_inferior (exec_file, allargs, env, darwin_ptrace_me, fork_inferior (exec_file, allargs, env, darwin_ptrace_me,
darwin_ptrace_him, darwin_pre_ptrace, copied_shell, [the_target] (int pid)
{
the_target->ptrace_him (pid);
},
darwin_pre_ptrace, copied_shell,
darwin_execvp); darwin_execvp);
} }
@ -2068,7 +2065,7 @@ darwin_nat_target::attach (const char *args, int from_tty)
darwin_suspend_inferior (inf); darwin_suspend_inferior (inf);
darwin_init_thread_list (inf); init_thread_list (inf);
darwin_inferior *priv = get_darwin_inferior (inf); darwin_inferior *priv = get_darwin_inferior (inf);
@ -2099,7 +2096,7 @@ darwin_nat_target::detach (inferior *inf, int from_tty)
/* If ptrace() is in use, stop the process. */ /* If ptrace() is in use, stop the process. */
if (!priv->no_ptrace) if (!priv->no_ptrace)
darwin_stop_inferior (inf); stop_inferior (inf);
kret = darwin_restore_exception_ports (priv); kret = darwin_restore_exception_ports (priv);
MACH_CHECK_ERROR (kret); MACH_CHECK_ERROR (kret);

View File

@ -21,68 +21,6 @@
#include <mach/mach.h> #include <mach/mach.h>
#include "gdbthread.h" #include "gdbthread.h"
/* This needs to be overridden by the platform specific nat code. */
class darwin_nat_target : public inf_child_target
{
void create_inferior (const char *exec_file,
const std::string &allargs,
char **env, int from_tty) override;
void attach (const char *, int) override;
void detach (inferior *, int) override;
ptid_t wait (ptid_t, struct target_waitstatus *, int) override;
void mourn_inferior () override;
void kill () override;
void interrupt () override;
void resume (ptid_t, int , enum gdb_signal) override;
bool thread_alive (ptid_t ptid) override;
std::string pid_to_str (ptid_t) override;
char *pid_to_exec_file (int pid) override;
enum target_xfer_status xfer_partial (enum target_object object,
const char *annex,
gdb_byte *readbuf,
const gdb_byte *writebuf,
ULONGEST offset, ULONGEST len,
ULONGEST *xfered_len) override;
bool supports_multi_process () override;
ptid_t get_ada_task_ptid (long lwp, long thread) override;
};
/* Describe the mach exception handling state for a task. This state is saved
before being changed and restored when a process is detached.
For more information on these fields see task_get_exception_ports manual
page. */
struct darwin_exception_info
{
/* Exceptions handled by the port. */
exception_mask_t masks[EXC_TYPES_COUNT] {};
/* Ports receiving exception messages. */
mach_port_t ports[EXC_TYPES_COUNT] {};
/* Type of messages sent. */
exception_behavior_t behaviors[EXC_TYPES_COUNT] {};
/* Type of state to be sent. */
thread_state_flavor_t flavors[EXC_TYPES_COUNT] {};
/* Number of elements set. */
mach_msg_type_number_t count = 0;
};
struct darwin_exception_msg struct darwin_exception_msg
{ {
mach_msg_header_t header; mach_msg_header_t header;
@ -136,6 +74,83 @@ struct darwin_thread_info : public private_thread_info
}; };
typedef struct darwin_thread_info darwin_thread_t; typedef struct darwin_thread_info darwin_thread_t;
/* This needs to be overridden by the platform specific nat code. */
class darwin_nat_target : public inf_child_target
{
void create_inferior (const char *exec_file,
const std::string &allargs,
char **env, int from_tty) override;
void attach (const char *, int) override;
void detach (inferior *, int) override;
ptid_t wait (ptid_t, struct target_waitstatus *, int) override;
void mourn_inferior () override;
void kill () override;
void interrupt () override;
void resume (ptid_t, int , enum gdb_signal) override;
bool thread_alive (ptid_t ptid) override;
std::string pid_to_str (ptid_t) override;
char *pid_to_exec_file (int pid) override;
enum target_xfer_status xfer_partial (enum target_object object,
const char *annex,
gdb_byte *readbuf,
const gdb_byte *writebuf,
ULONGEST offset, ULONGEST len,
ULONGEST *xfered_len) override;
bool supports_multi_process () override;
ptid_t get_ada_task_ptid (long lwp, long thread) override;
private:
ptid_t wait_1 (ptid_t, struct target_waitstatus *);
void check_new_threads (inferior *inf);
int decode_exception_message (mach_msg_header_t *hdr,
inferior **pinf,
darwin_thread_t **pthread);
ptid_t decode_message (mach_msg_header_t *hdr,
darwin_thread_t **pthread,
inferior **pinf,
target_waitstatus *status);
void stop_inferior (inferior *inf);
void init_thread_list (inferior *inf);
void ptrace_him (int pid);
int cancel_breakpoint (ptid_t ptid);
};
/* Describe the mach exception handling state for a task. This state is saved
before being changed and restored when a process is detached.
For more information on these fields see task_get_exception_ports manual
page. */
struct darwin_exception_info
{
/* Exceptions handled by the port. */
exception_mask_t masks[EXC_TYPES_COUNT] {};
/* Ports receiving exception messages. */
mach_port_t ports[EXC_TYPES_COUNT] {};
/* Type of messages sent. */
exception_behavior_t behaviors[EXC_TYPES_COUNT] {};
/* Type of state to be sent. */
thread_state_flavor_t flavors[EXC_TYPES_COUNT] {};
/* Number of elements set. */
mach_msg_type_number_t count = 0;
};
static inline darwin_thread_info * static inline darwin_thread_info *
get_darwin_thread_info (class thread_info *thread) get_darwin_thread_info (class thread_info *thread)
{ {

View File

@ -267,7 +267,8 @@ execv_argv::init_for_shell (const char *exec_file,
pid_t pid_t
fork_inferior (const char *exec_file_arg, const std::string &allargs, fork_inferior (const char *exec_file_arg, const std::string &allargs,
char **env, void (*traceme_fun) (), char **env, void (*traceme_fun) (),
void (*init_trace_fun) (int), void (*pre_trace_fun) (), gdb::function_view<void (int)> init_trace_fun,
void (*pre_trace_fun) (),
const char *shell_file_arg, const char *shell_file_arg,
void (*exec_fun)(const char *file, char * const *argv, void (*exec_fun)(const char *file, char * const *argv,
char * const *env)) char * const *env))
@ -439,7 +440,7 @@ fork_inferior (const char *exec_file_arg, const std::string &allargs,
initialize anything target-vector-specific that needs initialize anything target-vector-specific that needs
initializing. */ initializing. */
if (init_trace_fun) if (init_trace_fun)
(*init_trace_fun) (pid); init_trace_fun (pid);
/* We are now in the child process of interest, having exec'd the /* We are now in the child process of interest, having exec'd the
correct program, and are poised at the first instruction of the correct program, and are poised at the first instruction of the

View File

@ -21,6 +21,7 @@
#define NAT_FORK_INFERIOR_H #define NAT_FORK_INFERIOR_H
#include <string> #include <string>
#include "gdbsupport/function-view.h"
struct process_stratum_target; struct process_stratum_target;
@ -42,7 +43,7 @@ struct process_stratum_target;
extern pid_t fork_inferior (const char *exec_file_arg, extern pid_t fork_inferior (const char *exec_file_arg,
const std::string &allargs, const std::string &allargs,
char **env, void (*traceme_fun) (), char **env, void (*traceme_fun) (),
void (*init_trace_fun) (int), gdb::function_view<void (int)> init_trace_fun,
void (*pre_trace_fun) (), void (*pre_trace_fun) (),
const char *shell_file_arg, const char *shell_file_arg,
void (*exec_fun) (const char *file, void (*exec_fun) (const char *file,