Pass inferior down to target_detach and to_detach
authorSimon Marchi <simon.marchi@ericsson.com>
Fri, 19 Jan 2018 16:47:57 +0000 (11:47 -0500)
committerSimon Marchi <simon.marchi@ericsson.com>
Fri, 19 Jan 2018 16:47:57 +0000 (11:47 -0500)
The to_detach target_ops method implementations are currently expected
to work on current_inferior/inferior_ptid.  In order to make things more
explicit, and remove some "shadow" parameter passing through globals,
this patch adds an "inferior" parameter to to_detach.  Implementations
will be expected to use this instead of relying on the global.  However,
to keep things simple, this patch only does the minimum that is
necessary to add the parameter.  The following patch gives an example of
how one such implementation would be adapted.  If the approach is deemed
good, we can then look into adapting more implementations.  Until then,
they'll continue to work as they do currently.

gdb/ChangeLog:

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

24 files changed:
gdb/ChangeLog
gdb/aix-thread.c
gdb/corefile.c
gdb/corelow.c
gdb/darwin-nat.c
gdb/gnu-nat.c
gdb/inf-ptrace.c
gdb/infcmd.c
gdb/infrun.c
gdb/linux-nat.c
gdb/linux-thread-db.c
gdb/nto-procfs.c
gdb/procfs.c
gdb/record.c
gdb/record.h
gdb/remote-sim.c
gdb/remote.c
gdb/sol-thread.c
gdb/target-debug.h
gdb/target-delegates.c
gdb/target.c
gdb/target.h
gdb/top.c
gdb/windows-nat.c

index d96da26eb846313066472c9e83afb260e27074df..4a994b411c7530642c78b1906fb352c537fc9991 100644 (file)
@@ -1,3 +1,40 @@
+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
index 0f0404f0139ec727c6c6b7547a295cc6a185d6e0..09d5175d904c57708b021fca6386efbe48193fbe 100644 (file)
@@ -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
index c5e4f91a07c909102a89e245260add8d0a870b6a..abf9ea675d04b5eac970f49188e5ca86af1de7ce 100644 (file)
@@ -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);
 }
index 250f46aa051920ebbd8c04dbd55099241a9473a0..190f0162d959c90977f471af1e6f83be92db171a 100644 (file)
@@ -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 ();
index 1441a6ad6d67fdea9c80d6ae04df557679a2f76b..7a862cdeae43e79aac326057e1a0b0a8fc92e258 100644 (file)
@@ -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;
index 0debb02ee68186ce903d95ef87f3529e30d1df8f..8271565a042b9ea247daa1e27f3d4899acb14aa2 100644 (file)
@@ -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;
 
index 44216c45d621df4899147acfe1ae72e9de25104c..aa8b17f41a52802058cd89ac57cdcc1b5e2db9af 100644 (file)
@@ -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);
 
index 8865244fd9ba9af49b6a315c0a80054b98525fa3..4ad37aa2756a14a8da85ddc93c7913692ecfb53a 100644 (file)
@@ -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
index d240208172b89c34fb44ab9b433e1cc63838258c..45fe36a7175d13515668c8f3a68ad85ce54023d1 100644 (file)
@@ -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;
index 99d12f25262c50f9008e4138a6d5114138311950..70f4c084dc6e0428f7a032b40d6d6a547da9fcb0 100644 (file)
@@ -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;
index 9dcfc0e98bd147c1c73e741720b0ca4f87f1d07a..873f929144b9b4477937915f28b3b6fe46b9bb99 100644 (file)
@@ -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.  */
 
index 2fd2dcf79a920e60a7816ddf17f4a245f62c53d7..6408c21799037066ecfcff8e30369a5a56e654c1 100644 (file)
@@ -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;
 
index 491970a787f943e6c5694c85b414daea05d0e565..2d5ec65c9b8d01e40c55cf41ebed8c1785b599f3 100644 (file)
@@ -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);
 
index 74a14dc07bf08151d55e1c8fcdbcac0be1a1d47f..9a476142e9d2b58dd293409e1a975eaee5153b79 100644 (file)
@@ -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.  */
index a0ca84dff3aee67102b1d8fa3468f4c6b0e459f0..21fafeba82a061b00967dd6eca721b280d42d425 100644 (file)
@@ -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 *);
index edc70d5b3ed8eb4f2531a95d18351bab07779c65..aed7a34b42c5498098869b2f7f266cdabf7119c2 100644 (file)
@@ -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");
index 01b236fcd30276646fed920ce35e20bcf1e93678..5ac84df0a089411adfb6f81fe42382cbf0eda00d 100644 (file)
@@ -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
index e724c7e0fab5adef8347431f96e20f70711b926d..2c7dd0e15dc81adc716f74020bbf9adcb2194add 100644 (file)
@@ -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
index d7d99eff5d7b62186e325677d2e327f230f7236d..d7fc00197509ccb335e8146546396aa4e01a25d5 100644 (file)
   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)
index 6bb7d7fba772848db92ffad138466fefc47a109c..bc847916b494d5c21c02baebb99b58e1413f2f43 100644 (file)
@@ -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);
 }
 
index b01e1ac64569101bdbc28f199ed07ac53de186cb..ce630f43de794b5e487128fcf8650fb616841930 100644 (file)
@@ -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
index 51841a1cbb95980de5e3372ec1480de5f2b34d3a..52361baa364c5e1f658d7baf01ec2d22b39e04ec 100644 (file)
@@ -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).  */
index 1e6d5137b8422d90eb66d11eb9c1f8c800a8b82a..a6166bd2803fb606ce94a15adb3527b4281fb1fb 100644 (file)
--- 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 ();
        }
index 4023089a4dababb4fee62e46d29984fface58d49..5fb143e00db5af2ddc520337ac63dc9e4c27197e 100644 (file)
@@ -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;