+2018-01-19 Simon Marchi <simon.marchi@ericsson.com>
+
+ * target.h (struct target_ops) <to_detach>: Add inferior
+ parameter.
+ (target_detach): Likewise.
+ * target.c (dispose_inferior): Pass inferior down.
+ (target_detach): Pass inferior down. Assert that it is equal to
+ the current inferior.
+ * aix-thread.c (aix_thread_detach): Pass inferior down.
+ * corefile.c (core_file_command): Pass current_inferior() down.
+ * corelow.c (core_detach): Add inferior parameter.
+ * darwin-nat.c (darwin_detach): Likewise.
+ * gnu-nat.c (gnu_detach): Likewise.
+ * inf-ptrace.c (inf_ptrace_detach): Likewise.
+ * infcmd.c (detach_command): Pass current_inferior() down to
+ target_detach.
+ * infrun.c (follow_fork_inferior): Pass parent_inf to
+ target_detach.
+ (handle_vfork_child_exec_or_exit): Pass inf->vfork_parent to
+ target_detach.
+ * linux-nat.c (linux_nat_detach): Add inferior parameter.
+ * linux-thread-db.c (thread_db_detach): Likewise.
+ * nto-procfs.c (procfs_detach): Likewise.
+ * procfs.c (procfs_detach): Likewise.
+ * record.c (record_detach): Likewise.
+ * record.h (struct inferior): Forward-declare.
+ (record_detach): Add inferior parameter.
+ * remote-sim.c (gdbsim_detach): Likewise.
+ * remote.c (remote_detach_1): Likewise.
+ (remote_detach): Likewise.
+ (extended_remote_detach): Likewise.
+ * sol-thread.c (sol_thread_detach): Likewise.
+ * target-debug.h (target_debug_print_inferior_p): New macro.
+ * target-delegates.c: Re-generate.
+ * top.c (kill_or_detach): Pass inferior down to target_detach.
+ * windows-nat.c (windows_detach): Add inferior parameter.
+
2018-01-19 Simon Marchi <simon.marchi@ericsson.com>
* target.h (struct target_ops) <to_detach>: Remove args
/* Detach from the process attached to by aix_thread_attach(). */
static void
-aix_thread_detach (struct target_ops *ops, int from_tty)
+aix_thread_detach (struct target_ops *ops, inferior *inf, int from_tty)
{
struct target_ops *beneath = find_target_beneath (ops);
pd_disable ();
- beneath->to_detach (beneath, from_tty);
+ beneath->to_detach (beneath, inf, from_tty);
}
/* Tell the inferior process to continue running thread PID if != -1
gdb_assert (core_target != NULL);
if (!filename)
- (core_target->to_detach) (core_target, from_tty);
+ (core_target->to_detach) (core_target, current_inferior (), from_tty);
else
(core_target->to_open) (filename, from_tty);
}
}
static void
-core_detach (struct target_ops *ops, int from_tty)
+core_detach (struct target_ops *ops, inferior *inf, int from_tty)
{
unpush_target (ops);
reinit_frame_cache ();
previously attached. It *might* work if the program was
started via fork. */
static void
-darwin_detach (struct target_ops *ops, int from_tty)
+darwin_detach (struct target_ops *ops, inferior *inf, int from_tty)
{
pid_t pid = ptid_get_pid (inferior_ptid);
- struct inferior *inf = current_inferior ();
darwin_inferior *priv = get_darwin_inferior (inf);
kern_return_t kret;
int res;
previously attached. It *might* work if the program was
started via fork. */
static void
-gnu_detach (struct target_ops *ops, int from_tty)
+gnu_detach (struct target_ops *ops, inferior *inf, int from_tty)
{
int pid;
/* Detach from the inferior. If FROM_TTY is non-zero, be chatty about it. */
static void
-inf_ptrace_detach (struct target_ops *ops, int from_tty)
+inf_ptrace_detach (struct target_ops *ops, inferior *inf, int from_tty)
{
pid_t pid = ptid_get_pid (inferior_ptid);
disconnect_tracing ();
- target_detach (from_tty);
+ target_detach (current_inferior (), from_tty);
/* The current inferior process was just detached successfully. Get
rid of breakpoints that no longer make sense. Note we don't do
target_pid_to_str (process_ptid));
}
- target_detach (0);
+ target_detach (parent_inf, 0);
}
/* Note that the detach above makes PARENT_INF dangling. */
}
}
- target_detach (0);
+ target_detach (inf->vfork_parent, 0);
/* Put it back. */
inf->pspace = pspace;
}
static void
-linux_nat_detach (struct target_ops *ops, int from_tty)
+linux_nat_detach (struct target_ops *ops, inferior *inf, int from_tty)
{
int pid;
struct lwp_info *main_lwp;
}
static void
-thread_db_detach (struct target_ops *ops, int from_tty)
+thread_db_detach (struct target_ops *ops, inferior *inf, int from_tty)
{
struct target_ops *target_beneath = find_target_beneath (ops);
delete_thread_db_info (ptid_get_pid (inferior_ptid));
- target_beneath->to_detach (target_beneath, from_tty);
+ target_beneath->to_detach (target_beneath, inf, from_tty);
/* NOTE: From this point on, inferior_ptid is null_ptid. */
on signals, etc. We'd better not have left any breakpoints
in the program or it'll die when it hits one. */
static void
-procfs_detach (struct target_ops *ops, int from_tty)
+procfs_detach (struct target_ops *ops, inferior *inf, int from_tty)
{
int pid;
}
static void
-procfs_detach (struct target_ops *ops, int from_tty)
+procfs_detach (struct target_ops *ops, inferior *inf, int from_tty)
{
int pid = ptid_get_pid (inferior_ptid);
/* See record.h. */
void
-record_detach (struct target_ops *t, int from_tty)
+record_detach (struct target_ops *t, inferior *inf, int from_tty)
{
gdb_assert (t->to_stratum == record_stratum);
record_stop (t);
record_unpush (t);
- target_detach (from_tty);
+ target_detach (inf, from_tty);
}
/* See record.h. */
#include "common/enum-flags.h"
struct cmd_list_element;
+struct inferior;
extern unsigned int record_debug;
extern void record_disconnect (struct target_ops *, const char *, int);
/* The default "to_detach" target method for record targets. */
-extern void record_detach (struct target_ops *, int);
+extern void record_detach (struct target_ops *, inferior *, int);
/* The default "to_mourn_inferior" target method for record targets. */
extern void record_mourn_inferior (struct target_ops *);
static void gdbsim_close (struct target_ops *self);
-static void gdbsim_detach (struct target_ops *ops, int from_tty);
+static void gdbsim_detach (struct target_ops *ops, inferior *inf, int from_tty);
static void gdbsim_prepare_to_store (struct target_ops *self,
struct regcache *regcache);
Use this when you want to detach and do something else with your gdb. */
static void
-gdbsim_detach (struct target_ops *ops, int from_tty)
+gdbsim_detach (struct target_ops *ops, inferior *inf, int from_tty)
{
if (remote_debug)
fprintf_unfiltered (gdb_stdlog, "gdbsim_detach\n");
one. */
static void
-remote_detach_1 (int from_tty)
+remote_detach_1 (int from_tty, inferior *inf)
{
int pid = ptid_get_pid (inferior_ptid);
struct remote_state *rs = get_remote_state ();
}
static void
-remote_detach (struct target_ops *ops, int from_tty)
+remote_detach (struct target_ops *ops, inferior *inf, int from_tty)
{
- remote_detach_1 (from_tty);
+ remote_detach_1 (from_tty, inf);
}
static void
-extended_remote_detach (struct target_ops *ops, int from_tty)
+extended_remote_detach (struct target_ops *ops, inferior *inf, int from_tty)
{
- remote_detach_1 (from_tty);
+ remote_detach_1 (from_tty, inf);
}
/* Target follow-fork function for remote targets. On entry, and
program was started via the normal ptrace (PTRACE_TRACEME). */
static void
-sol_thread_detach (struct target_ops *ops, int from_tty)
+sol_thread_detach (struct target_ops *ops, inferior *inf, int from_tty)
{
struct target_ops *beneath = find_target_beneath (ops);
sol_thread_active = 0;
inferior_ptid = pid_to_ptid (ptid_get_pid (main_ph.ptid));
unpush_target (ops);
- beneath->to_detach (beneath, from_tty);
+ beneath->to_detach (beneath, inf, from_tty);
}
/* Resume execution of process PTID. If STEP is nozero, then just
target_debug_do_print (host_address_to_string (X.get ()))
#define target_debug_print_gdb_array_view_const_int(X) \
target_debug_do_print (host_address_to_string (X.data ()))
+#define target_debug_print_inferior_p(inf) \
+ target_debug_do_print (host_address_to_string (inf))
static void
target_debug_print_struct_target_waitstatus_p (struct target_waitstatus *status)
}
static void
-delegate_detach (struct target_ops *self, int arg1)
+delegate_detach (struct target_ops *self, inferior *arg1, int arg2)
{
self = self->beneath;
- self->to_detach (self, arg1);
+ self->to_detach (self, arg1, arg2);
}
static void
-tdefault_detach (struct target_ops *self, int arg1)
+tdefault_detach (struct target_ops *self, inferior *arg1, int arg2)
{
}
static void
-debug_detach (struct target_ops *self, int arg1)
+debug_detach (struct target_ops *self, inferior *arg1, int arg2)
{
fprintf_unfiltered (gdb_stdlog, "-> %s->to_detach (...)\n", debug_target.to_shortname);
- debug_target.to_detach (&debug_target, arg1);
+ debug_target.to_detach (&debug_target, arg1, arg2);
fprintf_unfiltered (gdb_stdlog, "<- %s->to_detach (", debug_target.to_shortname);
target_debug_print_struct_target_ops_p (&debug_target);
fputs_unfiltered (", ", gdb_stdlog);
- target_debug_print_int (arg1);
+ target_debug_print_inferior_p (arg1);
+ fputs_unfiltered (", ", gdb_stdlog);
+ target_debug_print_int (arg2);
fputs_unfiltered (")\n", gdb_stdlog);
}
if (target_has_execution)
target_kill ();
else
- target_detach (0);
+ target_detach (inf, 0);
}
return 0;
/* See target.h. */
void
-target_detach (int from_tty)
+target_detach (inferior *inf, int from_tty)
{
+ /* As long as some to_detach implementations rely on the current_inferior
+ (either directly, or indirectly, like through target_gdbarch or by
+ reading memory), INF needs to be the current inferior. When that
+ requirement will become no longer true, then we can remove this
+ assertion. */
+ gdb_assert (inf == current_inferior ());
+
if (gdbarch_has_global_breakpoints (target_gdbarch ()))
/* Don't remove global breakpoints here. They're removed on
disconnection from the target. */
prepare_for_detach ();
- current_target.to_detach (¤t_target, from_tty);
+ current_target.to_detach (¤t_target, inf, from_tty);
}
void
void (*to_attach) (struct target_ops *ops, const char *, int);
void (*to_post_attach) (struct target_ops *, int)
TARGET_DEFAULT_IGNORE ();
- void (*to_detach) (struct target_ops *ops, int)
+ void (*to_detach) (struct target_ops *ops, inferior *, int)
TARGET_DEFAULT_IGNORE ();
void (*to_disconnect) (struct target_ops *, const char *, int)
TARGET_DEFAULT_NORETURN (tcomplain ());
in the program or it'll die when it hits one. FROM_TTY says whether to be
verbose or not. */
-extern void target_detach (int from_tty);
+extern void target_detach (inferior *inf, int from_tty);
/* Disconnect from the current target without resuming it (leaving it
waiting for a debugger). */
if (target_has_execution)
{
if (inf->attach_flag)
- target_detach (qt->from_tty);
+ target_detach (inf, qt->from_tty);
else
target_kill ();
}
}
static void
-windows_detach (struct target_ops *ops, int from_tty)
+windows_detach (struct target_ops *ops, inferior *inf, int from_tty)
{
int detached = 1;