aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog37
-rw-r--r--gdb/aix-thread.c4
-rw-r--r--gdb/corefile.c2
-rw-r--r--gdb/corelow.c2
-rw-r--r--gdb/darwin-nat.c3
-rw-r--r--gdb/gnu-nat.c2
-rw-r--r--gdb/inf-ptrace.c2
-rw-r--r--gdb/infcmd.c2
-rw-r--r--gdb/infrun.c4
-rw-r--r--gdb/linux-nat.c2
-rw-r--r--gdb/linux-thread-db.c4
-rw-r--r--gdb/nto-procfs.c2
-rw-r--r--gdb/procfs.c2
-rw-r--r--gdb/record.c4
-rw-r--r--gdb/record.h3
-rw-r--r--gdb/remote-sim.c4
-rw-r--r--gdb/remote.c10
-rw-r--r--gdb/sol-thread.c4
-rw-r--r--gdb/target-debug.h2
-rw-r--r--gdb/target-delegates.c14
-rw-r--r--gdb/target.c13
-rw-r--r--gdb/target.h4
-rw-r--r--gdb/top.c2
-rw-r--r--gdb/windows-nat.c2
24 files changed, 89 insertions, 41 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index d96da26..4a994b4 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,42 @@
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
parameter.
(target_detach): Likewise.
diff --git a/gdb/aix-thread.c b/gdb/aix-thread.c
index 0f0404f..09d5175 100644
--- a/gdb/aix-thread.c
+++ b/gdb/aix-thread.c
@@ -981,12 +981,12 @@ aix_thread_inferior_created (struct target_ops *ops, int from_tty)
/* 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
diff --git a/gdb/corefile.c b/gdb/corefile.c
index c5e4f91..abf9ea6 100644
--- a/gdb/corefile.c
+++ b/gdb/corefile.c
@@ -68,7 +68,7 @@ core_file_command (const char *filename, int from_tty)
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);
}
diff --git a/gdb/corelow.c b/gdb/corelow.c
index 250f46a..190f016 100644
--- a/gdb/corelow.c
+++ b/gdb/corelow.c
@@ -464,7 +464,7 @@ core_open (const char *arg, int 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 ();
diff --git a/gdb/darwin-nat.c b/gdb/darwin-nat.c
index 1441a6a..7a862cd 100644
--- a/gdb/darwin-nat.c
+++ b/gdb/darwin-nat.c
@@ -1938,10 +1938,9 @@ darwin_attach (struct target_ops *ops, const char *args, int from_tty)
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;
diff --git a/gdb/gnu-nat.c b/gdb/gnu-nat.c
index 0debb02..8271565 100644
--- a/gdb/gnu-nat.c
+++ b/gdb/gnu-nat.c
@@ -2255,7 +2255,7 @@ gnu_attach (struct target_ops *ops, const char *args, int from_tty)
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;
diff --git a/gdb/inf-ptrace.c b/gdb/inf-ptrace.c
index 44216c4..aa8b17f 100644
--- a/gdb/inf-ptrace.c
+++ b/gdb/inf-ptrace.c
@@ -244,7 +244,7 @@ inf_ptrace_post_attach (struct target_ops *self, 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);
diff --git a/gdb/infcmd.c b/gdb/infcmd.c
index 8865244..4ad37aa 100644
--- a/gdb/infcmd.c
+++ b/gdb/infcmd.c
@@ -2976,7 +2976,7 @@ detach_command (const char *args, int from_tty)
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
diff --git a/gdb/infrun.c b/gdb/infrun.c
index d240208..45fe36a 100644
--- a/gdb/infrun.c
+++ b/gdb/infrun.c
@@ -606,7 +606,7 @@ holding the child stopped. Try \"set detach-on-fork\" or \
target_pid_to_str (process_ptid));
}
- target_detach (0);
+ target_detach (parent_inf, 0);
}
/* Note that the detach above makes PARENT_INF dangling. */
@@ -976,7 +976,7 @@ handle_vfork_child_exec_or_exit (int exec)
}
}
- target_detach (0);
+ target_detach (inf->vfork_parent, 0);
/* Put it back. */
inf->pspace = pspace;
diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c
index 99d12f2..70f4c08 100644
--- a/gdb/linux-nat.c
+++ b/gdb/linux-nat.c
@@ -1497,7 +1497,7 @@ detach_callback (struct lwp_info *lp, void *data)
}
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;
diff --git a/gdb/linux-thread-db.c b/gdb/linux-thread-db.c
index 9dcfc0e..873f929 100644
--- a/gdb/linux-thread-db.c
+++ b/gdb/linux-thread-db.c
@@ -1090,13 +1090,13 @@ record_thread (struct thread_db_info *info,
}
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. */
diff --git a/gdb/nto-procfs.c b/gdb/nto-procfs.c
index 2fd2dcf..6408c21 100644
--- a/gdb/nto-procfs.c
+++ b/gdb/nto-procfs.c
@@ -943,7 +943,7 @@ procfs_xfer_partial (struct target_ops *ops, enum target_object object,
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;
diff --git a/gdb/procfs.c b/gdb/procfs.c
index 491970a..2d5ec65 100644
--- a/gdb/procfs.c
+++ b/gdb/procfs.c
@@ -1924,7 +1924,7 @@ procfs_attach (struct target_ops *ops, const char *args, int from_tty)
}
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);
diff --git a/gdb/record.c b/gdb/record.c
index 74a14dc..9a47614 100644
--- a/gdb/record.c
+++ b/gdb/record.c
@@ -187,7 +187,7 @@ record_disconnect (struct target_ops *t, const char *args, int from_tty)
/* 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);
@@ -196,7 +196,7 @@ record_detach (struct target_ops *t, int from_tty)
record_stop (t);
record_unpush (t);
- target_detach (from_tty);
+ target_detach (inf, from_tty);
}
/* See record.h. */
diff --git a/gdb/record.h b/gdb/record.h
index a0ca84d..21fafeb 100644
--- a/gdb/record.h
+++ b/gdb/record.h
@@ -24,6 +24,7 @@
#include "common/enum-flags.h"
struct cmd_list_element;
+struct inferior;
extern unsigned int record_debug;
@@ -88,7 +89,7 @@ extern void record_goto (const char *arg);
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 *);
diff --git a/gdb/remote-sim.c b/gdb/remote-sim.c
index edc70d5..aed7a34 100644
--- a/gdb/remote-sim.c
+++ b/gdb/remote-sim.c
@@ -77,7 +77,7 @@ static void gdbsim_open (const char *args, int from_tty);
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);
@@ -820,7 +820,7 @@ gdbsim_close (struct target_ops *self)
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");
diff --git a/gdb/remote.c b/gdb/remote.c
index 01b236f..5ac84df 100644
--- a/gdb/remote.c
+++ b/gdb/remote.c
@@ -5126,7 +5126,7 @@ remote_detach_pid (int pid)
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 ();
@@ -5162,15 +5162,15 @@ remote_detach_1 (int from_tty)
}
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
diff --git a/gdb/sol-thread.c b/gdb/sol-thread.c
index e724c7e..2c7dd0e 100644
--- a/gdb/sol-thread.c
+++ b/gdb/sol-thread.c
@@ -348,14 +348,14 @@ lwp_to_thread (ptid_t lwp)
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
diff --git a/gdb/target-debug.h b/gdb/target-debug.h
index d7d99ef..d7fc001 100644
--- a/gdb/target-debug.h
+++ b/gdb/target-debug.h
@@ -170,6 +170,8 @@
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)
diff --git a/gdb/target-delegates.c b/gdb/target-delegates.c
index 6bb7d7f..bc84791 100644
--- a/gdb/target-delegates.c
+++ b/gdb/target-delegates.c
@@ -28,26 +28,28 @@ debug_post_attach (struct target_ops *self, int arg1)
}
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);
}
diff --git a/gdb/target.c b/gdb/target.c
index b01e1ac..ce630f4 100644
--- a/gdb/target.c
+++ b/gdb/target.c
@@ -2108,7 +2108,7 @@ dispose_inferior (struct inferior *inf, void *args)
if (target_has_execution)
target_kill ();
else
- target_detach (0);
+ target_detach (inf, 0);
}
return 0;
@@ -2144,8 +2144,15 @@ target_preopen (int from_tty)
/* 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. */
@@ -2157,7 +2164,7 @@ target_detach (int from_tty)
prepare_for_detach ();
- current_target.to_detach (&current_target, from_tty);
+ current_target.to_detach (&current_target, inf, from_tty);
}
void
diff --git a/gdb/target.h b/gdb/target.h
index 51841a1..52361ba 100644
--- a/gdb/target.h
+++ b/gdb/target.h
@@ -440,7 +440,7 @@ struct target_ops
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 ());
@@ -1326,7 +1326,7 @@ extern void target_announce_detach (int from_tty);
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). */
diff --git a/gdb/top.c b/gdb/top.c
index 1e6d513..a6166bd 100644
--- a/gdb/top.c
+++ b/gdb/top.c
@@ -1485,7 +1485,7 @@ kill_or_detach (struct inferior *inf, void *args)
if (target_has_execution)
{
if (inf->attach_flag)
- target_detach (qt->from_tty);
+ target_detach (inf, qt->from_tty);
else
target_kill ();
}
diff --git a/gdb/windows-nat.c b/gdb/windows-nat.c
index 4023089..5fb143e 100644
--- a/gdb/windows-nat.c
+++ b/gdb/windows-nat.c
@@ -1931,7 +1931,7 @@ windows_attach (struct target_ops *ops, const char *args, int from_tty)
}
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;