gdb: make post_startup_inferior a virtual method on inf_ptrace_target
authorAndrew Burgess <aburgess@redhat.com>
Fri, 12 Nov 2021 11:18:58 +0000 (11:18 +0000)
committerAndrew Burgess <aburgess@redhat.com>
Mon, 13 Dec 2021 11:10:29 +0000 (11:10 +0000)
While working on a later patch that required me to understand how GDB
starts up inferiors, I was confused by the
target_ops::post_startup_inferior method.

The post_startup_inferior target function is only called from
inf_ptrace_target::create_inferior.

Part of the target class hierarchy looks like this:

  inf_child_target
     |
     '-- inf_ptrace_target
            |
            |-- linux_nat_target
            |
            |-- fbsd_nat_target
            |
            |-- nbsd_nat_target
            |
            |-- obsd_nat_target
            |
            '-- rs6000_nat_target

Every sub-class of inf_ptrace_target, except rs6000_nat_target,
implements ::post_startup_inferior.  The rs6000_nat_target picks up
the implementation of ::post_startup_inferior not from
inf_ptrace_target, but from inf_child_target.

No descendent of inf_child_target, outside the inf_ptrace_target
sub-tree, implements ::post_startup_inferior, which isn't really
surprising, as they would never see the method called (remember, the
method is only called from inf_ptrace_target::create_inferior).

What I find confusing is the role inf_child_target plays in
implementing, what is really a helper function for just one of its
descendents.

In this commit I propose that we formally make ::post_startup_inferior
a helper function of inf_ptrace_target.  To do this I will remove the
::post_startup_inferior from the target_ops API, and instead make this
a protected, pure virtual function on inf_ptrace_target.

I'll remove the empty implementation of ::post_startup_inferior from
the inf_child_target class, and add a new empty implementation to the
rs6000_nat_target class.

All the other descendents of inf_ptrace_target already provide an
implementation of this method and so don't need to change beyond
making the method protected within their class declarations.

To me, this makes much more sense now.  The helper function, which is
only called from within the inf_ptrace_target class, is now a part of
the inf_ptrace_target class.

The only way in which this change is visible to a user is if the user
turns on 'set debug target 1'.  With this debug flag on, prior to this
patch the user would see something like:

  -> native->post_startup_inferior (...)
  <- native->post_startup_inferior (2588939)

After this patch these lines are no longer present, as the
post_startup_inferior is no longer a top level target method.  For me,
this is an acceptable change.

19 files changed:
gdb/aarch64-linux-nat.c
gdb/fbsd-nat.c
gdb/fbsd-nat.h
gdb/inf-child.c
gdb/inf-child.h
gdb/inf-ptrace.c
gdb/inf-ptrace.h
gdb/linux-nat.c
gdb/linux-nat.h
gdb/netbsd-nat.c
gdb/netbsd-nat.h
gdb/obsd-nat.c
gdb/obsd-nat.h
gdb/rs6000-aix-nat.c
gdb/target-delegates.c
gdb/target.c
gdb/target.h
gdb/x86-linux-nat.c
gdb/x86-linux-nat.h

index aa42365d25d0b60c8e540a0d968937d1855312ba..0ca386331e51baaae194678ce083e500beca1916 100644 (file)
@@ -694,7 +694,7 @@ ps_get_thread_area (struct ps_prochandle *ph,
 }
 \f
 
-/* Implement the "post_startup_inferior" target_ops method.  */
+/* Implement the virtual inf_ptrace_target::post_startup_inferior method.  */
 
 void
 aarch64_linux_nat_target::post_startup_inferior (ptid_t ptid)
index e90aa12e4425a20ed640ed8db845a5306c1581a1..e84dafdad9dc34a85cad2ee319b4c90b9ba251e4 100644 (file)
@@ -1548,7 +1548,7 @@ fbsd_nat_target::remove_vfork_catchpoint (int pid)
 }
 #endif
 
-/* Implement the "post_startup_inferior" target_ops method.  */
+/* Implement the virtual inf_ptrace_target::post_startup_inferior method.  */
 
 void
 fbsd_nat_target::post_startup_inferior (ptid_t pid)
index 34d7e6d25ba195db542fa4b71b2cc9354e3f9302..863c0a4e190397346f9d912b80c68f85e7838f1e 100644 (file)
@@ -76,7 +76,6 @@ public:
 
   ptid_t wait (ptid_t, struct target_waitstatus *, target_wait_flags) override;
 
-  void post_startup_inferior (ptid_t) override;
   void post_attach (int) override;
 
 #ifdef USE_SIGTRAP_SIGINFO
@@ -106,6 +105,10 @@ public:
 
   bool supports_disable_randomization () override;
 
+protected:
+
+  void post_startup_inferior (ptid_t) override;
+
 private:
   /* Helper routines for use in fetch_registers and store_registers in
      subclasses.  These routines fetch and store a single set of
index b65bbf30074762565348cc2ad196dc33cfe609b8..949f530e1288a2a4c1f48b1ae9a99d9a7049a7fb 100644 (file)
@@ -202,13 +202,6 @@ inf_child_target::maybe_unpush_target ()
     current_inferior ()->unpush_target (this);
 }
 
-void
-inf_child_target::post_startup_inferior (ptid_t ptid)
-{
-  /* This target doesn't require a meaningful "post startup inferior"
-     operation by a debugger.  */
-}
-
 bool
 inf_child_target::can_run ()
 {
index 1e009b6b74ae98f32b55f812ac64dfc0b0f9fe8d..ce8feaf05bd21d0497e53f9c5cf69b015a3770d3 100644 (file)
@@ -55,8 +55,6 @@ public:
   void interrupt () override;
   void pass_ctrlc () override;
 
-  void post_startup_inferior (ptid_t) override;
-
   void follow_exec (inferior *follow_inf, ptid_t ptid,
                    const char *execd_pathname) override;
 
index 2e7a03c63f5e460828cdc61cf73cdb313e8b9360..bbf38c0aeacf169ea69eaccf0149f4925eb46fba 100644 (file)
@@ -103,7 +103,7 @@ inf_ptrace_target::create_inferior (const char *exec_file,
 
   /* On some targets, there must be some explicit actions taken after
      the inferior has been started up.  */
-  target_post_startup_inferior (ptid);
+  post_startup_inferior (ptid);
 }
 
 /* Clean up a rotting corpse of an inferior after it died.  */
index 8aded9b60dbba2d0b1196b99858dd40c3cfd3d47..a4ad0969075efe02d41ab9bfc0d24fb4f5617c09 100644 (file)
@@ -60,6 +60,17 @@ struct inf_ptrace_target : public inf_child_target
 protected:
   /* Cleanup the inferior after a successful ptrace detach.  */
   void detach_success (inferior *inf);
+
+  /* Some targets don't allow us to request notification of inferior events
+     such as fork and vfork immediately after the inferior is created.
+     (This is because of how gdb creates inferiors via invoking a shell to
+     do it.  In such a scenario, if the shell init file has commands in it,
+     the shell will fork and exec for each of those commands, and we will
+     see each such fork event.  Very bad.)
+
+     Such targets will supply an appropriate definition for this
+     function.  */
+  virtual void post_startup_inferior (ptid_t ptid) = 0;
 };
 
 #ifndef __NetBSD__
index 9d4b05a2167d1cb4b7682818a726c6405682bffd..20aa4a1322d0c467cc8d54c56935d730aa0449c1 100644 (file)
@@ -411,6 +411,8 @@ linux_nat_target::post_attach (int pid)
   linux_init_ptrace_procfs (pid, 1);
 }
 
+/* Implement the virtual inf_ptrace_target::post_startup_inferior method.  */
+
 void
 linux_nat_target::post_startup_inferior (ptid_t ptid)
 {
index 95e26b7ee4607ad71ff29890b0f72126e843ca34..116eb7ed51b377ecefa7850773d52d820417db31 100644 (file)
@@ -129,8 +129,6 @@ public:
 
   char *pid_to_exec_file (int pid) override;
 
-  void post_startup_inferior (ptid_t) override;
-
   void post_attach (int) override;
 
   void follow_fork (inferior *, ptid_t, target_waitkind, bool, bool) override;
@@ -189,6 +187,10 @@ public:
   /* SIGTRAP-like breakpoint status events recognizer.  The default
      recognizes SIGTRAP only.  */
   virtual bool low_status_is_event (int status);
+
+protected:
+
+    void post_startup_inferior (ptid_t) override;
 };
 
 /* The final/concrete instance.  */
index 7dfc586fc7b18acb1655d865a10fd81fd0f4e88a..1eb2c769411eeb54761e4d401d91fb6ff84dd378 100644 (file)
@@ -132,7 +132,7 @@ nbsd_add_threads (nbsd_nat_target *target, pid_t pid)
   netbsd_nat::for_each_thread (pid, fn);
 }
 
-/* Implement the "post_startup_inferior" target_ops method.  */
+/* Implement the virtual inf_ptrace_target::post_startup_inferior method.  */
 
 void
 nbsd_nat_target::post_startup_inferior (ptid_t ptid)
index 43d60eb3415812c9eff9b93de2f221e772973278..ad83f2036d4cf7366a633d0603d5ce7e77401a40 100644 (file)
@@ -32,7 +32,6 @@ struct nbsd_nat_target : public inf_ptrace_target
 
   bool thread_alive (ptid_t ptid) override;
   const char *thread_name (struct thread_info *thr) override;
-  void post_startup_inferior (ptid_t ptid) override;
   void post_attach (int pid) override;
   void update_thread_list () override;
   std::string pid_to_str (ptid_t ptid) override;
@@ -57,6 +56,9 @@ struct nbsd_nat_target : public inf_ptrace_target
                                        ULONGEST *xfered_len) override;
   bool supports_dumpcore () override;
   void dumpcore (const char *filename) override;
+
+protected:
+  void post_startup_inferior (ptid_t ptid) override;
 };
 
 #endif /* netbsd-nat.h */
index c70820d60d022b2fdec94cab010de7920d23d116..2340dfed1c3677b015ba6af9c2ed967ec76c0f1f 100644 (file)
@@ -145,6 +145,8 @@ obsd_nat_target::post_attach (int pid)
   obsd_enable_proc_events (pid);
 }
 
+/* Implement the virtual inf_ptrace_target::post_startup_inferior method.  */
+
 void
 obsd_nat_target::post_startup_inferior (ptid_t pid)
 {
index 1f74b9984c59ac0c5ff1fa4ef579954df22ee587..5ebbf61db406220637288c731dc7949e9cea7840 100644 (file)
@@ -35,9 +35,10 @@ class obsd_nat_target : public inf_ptrace_target
 
   int remove_fork_catchpoint (int) override;
 
-  void post_startup_inferior (ptid_t) override;
-
   void post_attach (int) override;
+
+protected:
+  void post_startup_inferior (ptid_t) override;
 };
 
 #endif /* obsd-nat.h */
index d74211f048e6e77763fb92439e7dced8e175f47c..682e4e9e75f349de15d50135aa89312acad63621 100644 (file)
@@ -91,6 +91,11 @@ public:
 
   ptid_t wait (ptid_t, struct target_waitstatus *, target_wait_flags) override;
 
+protected:
+
+  void post_startup_inferior (ptid_t ptid) override
+  { /* Nothing.  */ }
+
 private:
   enum target_xfer_status
     xfer_shared_libraries (enum target_object object,
index fb9c78a5f793f1b48ec80efbe8460658bc0f6340..9636e3212bc8aa4aab1fc12d14cdf8b9ebc1c3ea 100644 (file)
@@ -51,7 +51,6 @@ struct dummy_target : public target_ops
   void terminal_info (const char *arg0, int arg1) override;
   void kill () override;
   void load (const char *arg0, int arg1) override;
-  void post_startup_inferior (ptid_t arg0) override;
   int insert_fork_catchpoint (int arg0) override;
   int remove_fork_catchpoint (int arg0) override;
   int insert_vfork_catchpoint (int arg0) override;
@@ -226,7 +225,6 @@ struct debug_target : public target_ops
   void terminal_info (const char *arg0, int arg1) override;
   void kill () override;
   void load (const char *arg0, int arg1) override;
-  void post_startup_inferior (ptid_t arg0) override;
   int insert_fork_catchpoint (int arg0) override;
   int remove_fork_catchpoint (int arg0) override;
   int insert_vfork_catchpoint (int arg0) override;
@@ -1393,27 +1391,6 @@ debug_target::load (const char *arg0, int arg1)
   fputs_unfiltered (")\n", gdb_stdlog);
 }
 
-void
-target_ops::post_startup_inferior (ptid_t arg0)
-{
-  this->beneath ()->post_startup_inferior (arg0);
-}
-
-void
-dummy_target::post_startup_inferior (ptid_t arg0)
-{
-}
-
-void
-debug_target::post_startup_inferior (ptid_t arg0)
-{
-  fprintf_unfiltered (gdb_stdlog, "-> %s->post_startup_inferior (...)\n", this->beneath ()->shortname ());
-  this->beneath ()->post_startup_inferior (arg0);
-  fprintf_unfiltered (gdb_stdlog, "<- %s->post_startup_inferior (", this->beneath ()->shortname ());
-  target_debug_print_ptid_t (arg0);
-  fputs_unfiltered (")\n", gdb_stdlog);
-}
-
 int
 target_ops::insert_fork_catchpoint (int arg0)
 {
index 06a21c46a1966255f0b64b3035f75454c369fb02..65d2a1ca514d96f7c82969447820a4b5f8fde0f1 100644 (file)
@@ -302,14 +302,6 @@ target_files_info ()
 
 /* See target.h.  */
 
-void
-target_post_startup_inferior (ptid_t ptid)
-{
-  return current_inferior ()->top_target ()->post_startup_inferior (ptid);
-}
-
-/* See target.h.  */
-
 int
 target_insert_fork_catchpoint (int pid)
 {
index e709b7d7cfdcf3517537fd6ca633bb7373241380..4736d32e78c57b2998c4c383d4aaa0e895979832 100644 (file)
@@ -626,8 +626,6 @@ struct target_ops
     virtual bool can_create_inferior ();
     virtual void create_inferior (const char *, const std::string &,
                                  char **, int);
-    virtual void post_startup_inferior (ptid_t)
-      TARGET_DEFAULT_IGNORE ();
     virtual int insert_fork_catchpoint (int)
       TARGET_DEFAULT_RETURN (1);
     virtual int remove_fork_catchpoint (int)
@@ -1688,18 +1686,6 @@ extern void target_kill (void);
 
 extern void target_load (const char *arg, int from_tty);
 
-/* Some targets (such as ttrace-based HPUX) don't allow us to request
-   notification of inferior events such as fork and vork immediately
-   after the inferior is created.  (This because of how gdb gets an
-   inferior created via invoking a shell to do it.  In such a scenario,
-   if the shell init file has commands in it, the shell will fork and
-   exec for each of those commands, and we will see each such fork
-   event.  Very bad.)
-
-   Such targets will supply an appropriate definition for this function.  */
-
-extern void target_post_startup_inferior (ptid_t ptid);
-
 /* On some targets, we can catch an inferior fork or vfork event when
    it occurs.  These functions insert/remove an already-created
    catchpoint for such events.  They return  0 for success, 1 if the
index adea1ad00922668f72527e45a3c8838e93076efb..71769085493b2cbede9f6ffaee1dc083947ef032 100644 (file)
@@ -81,6 +81,8 @@ x86_linux_nat_target::~x86_linux_nat_target ()
 {
 }
 
+/* Implement the virtual inf_ptrace_target::post_startup_inferior method.  */
+
 void
 x86_linux_nat_target::post_startup_inferior (ptid_t ptid)
 {
index a8123f76491b661fbb7fb9003114fe4800baece4..e1f232adae82db32f959c61ce352760f2c975f8b 100644 (file)
@@ -29,9 +29,6 @@ struct x86_linux_nat_target : public x86_nat_target<linux_nat_target>
 {
   virtual ~x86_linux_nat_target () override = 0;
 
-  /* Override the GNU/Linux inferior startup hook.  */
-  void post_startup_inferior (ptid_t) override;
-
   /* Add the description reader.  */
   const struct target_desc *read_description () override;
 
@@ -73,6 +70,10 @@ struct x86_linux_nat_target : public x86_nat_target<linux_nat_target>
 
   void low_delete_thread (struct arch_lwp_info *lwp) override
   { x86_linux_delete_thread (lwp); }
+
+protected:
+  /* Override the GNU/Linux inferior startup hook.  */
+  void post_startup_inferior (ptid_t) override;
 };
 
 \f