[binutils-gdb] gdb: add inferior_execd observable

Simon Marchi simark@sourceware.org
Fri Dec 4 22:27:48 GMT 2020


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=42a4fec513f11d4ff346f62fc0df3731ce9f7d59

commit 42a4fec513f11d4ff346f62fc0df3731ce9f7d59
Author: Simon Marchi <simon.marchi@efficios.com>
Date:   Fri Dec 4 16:43:51 2020 -0500

    gdb: add inferior_execd observable
    
    I want to add another action (clearing displaced stepping state) that
    happens when an inferior execs.  I think it would be cleaner to have an
    observer for this event, rather than have infrun know about each other
    sub-component.
    
    Replace the calls to solib_create_inferior_hook and
    jit_inferior_created_hook in follow_exec by observers.
    
    gdb/ChangeLog:
    
            * observable.h (inferior_execd): Declare new observable.
            * observable.c (inferior_execd): Declare new observable.
            * infrun.c (follow_exec): Notify inferior_execd observer.
            * jit.c (jit_inferior_created_hook): Make static.
            (_initialize_jit): Register inferior_execd observer.
            * jit.h (jit_inferior_created_hook): Remove declaration.
            * solib.c (_initialize_solib): Register inferior_execd observer.
    
    Change-Id: I000cce00094e23baa67df693d912646b6ae38e44

Diff:
---
 gdb/ChangeLog    | 10 ++++++++++
 gdb/infrun.c     |  4 +---
 gdb/jit.c        |  9 +++++++--
 gdb/jit.h        |  7 -------
 gdb/observable.c |  1 +
 gdb/observable.h |  3 +++
 gdb/solib.c      |  4 ++++
 7 files changed, 26 insertions(+), 12 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index b0c3bd62d01..d7bfae85345 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,13 @@
+2020-12-04  Simon Marchi  <simon.marchi@efficios.com>
+
+	* observable.h (inferior_execd): Declare new observable.
+	* observable.c (inferior_execd): Declare new observable.
+	* infrun.c (follow_exec): Notify inferior_execd observer.
+	* jit.c (jit_inferior_created_hook): Make static.
+	(_initialize_jit): Register inferior_execd observer.
+	* jit.h (jit_inferior_created_hook): Remove declaration.
+	* solib.c (_initialize_solib): Register inferior_execd observer.
+
 2020-12-04  Tom de Vries  <tdevries@suse.de>
 
 	PR gdb/27003
diff --git a/gdb/infrun.c b/gdb/infrun.c
index 2e5e837452d..473a0fb8542 100644
--- a/gdb/infrun.c
+++ b/gdb/infrun.c
@@ -1222,9 +1222,7 @@ follow_exec (ptid_t ptid, const char *exec_file_target)
      registers.  */
   target_find_description ();
 
-  solib_create_inferior_hook (0);
-
-  jit_inferior_created_hook (inf);
+  gdb::observers::inferior_execd.notify (inf);
 
   breakpoint_re_set ();
 
diff --git a/gdb/jit.c b/gdb/jit.c
index fd24d539159..9deeed7ab59 100644
--- a/gdb/jit.c
+++ b/gdb/jit.c
@@ -49,6 +49,7 @@ static const char jit_break_name[] = "__jit_debug_register_code";
 
 static const char jit_descriptor_name[] = "__jit_debug_descriptor";
 
+static void jit_inferior_created_hook (inferior *inf);
 static void jit_inferior_exit_hook (struct inferior *inf);
 
 /* An unwinder is registered for every gdbarch.  This key is used to
@@ -1230,9 +1231,12 @@ jit_inferior_init (inferior *inf)
     }
 }
 
-/* See jit.h.  */
+/* Looks for the descriptor and registration symbols and breakpoints
+   the registration function.  If it finds both, it registers all the
+   already JITed code.  If it has already found the symbols, then it
+   doesn't try again.  */
 
-void
+static void
 jit_inferior_created_hook (inferior *inf)
 {
   jit_inferior_init (inf);
@@ -1337,6 +1341,7 @@ _initialize_jit ()
 			     &setdebuglist, &showdebuglist);
 
   gdb::observers::inferior_created.attach (jit_inferior_created_hook);
+  gdb::observers::inferior_execd.attach (jit_inferior_created_hook);
   gdb::observers::inferior_exit.attach (jit_inferior_exit_hook);
   gdb::observers::breakpoint_deleted.attach (jit_breakpoint_deleted);
 
diff --git a/gdb/jit.h b/gdb/jit.h
index 6f972a6e077..96938060733 100644
--- a/gdb/jit.h
+++ b/gdb/jit.h
@@ -103,13 +103,6 @@ struct jited_objfile_data
   CORE_ADDR addr;
 };
 
-/* Looks for the descriptor and registration symbols and breakpoints
-   the registration function.  If it finds both, it registers all the
-   already JITed code.  If it has already found the symbols, then it
-   doesn't try again.  */
-
-extern void jit_inferior_created_hook (inferior *inf);
-
 /* Re-establish the jit breakpoint(s).  */
 
 extern void jit_breakpoint_re_set (void);
diff --git a/gdb/observable.c b/gdb/observable.c
index 81aa392cc21..231f955fa26 100644
--- a/gdb/observable.c
+++ b/gdb/observable.c
@@ -43,6 +43,7 @@ DEFINE_OBSERVABLE (command_error);
 DEFINE_OBSERVABLE (target_changed);
 DEFINE_OBSERVABLE (executable_changed);
 DEFINE_OBSERVABLE (inferior_created);
+DEFINE_OBSERVABLE (inferior_execd);
 DEFINE_OBSERVABLE (record_changed);
 DEFINE_OBSERVABLE (solib_loaded);
 DEFINE_OBSERVABLE (solib_unloaded);
diff --git a/gdb/observable.h b/gdb/observable.h
index 9114b28d04f..1dce6746ff3 100644
--- a/gdb/observable.h
+++ b/gdb/observable.h
@@ -89,6 +89,9 @@ extern observable<> executable_changed;
    information on the inferior has been printed.  */
 extern observable<inferior */* inferior */> inferior_created;
 
+/* The inferior INF has exec'ed a new executable file.  */
+extern observable<struct inferior */* inf */> inferior_execd;
+
 /* The status of process record for inferior inferior in gdb has
    changed.  The process record is started if STARTED is true, and
    the process record is stopped if STARTED is false.
diff --git a/gdb/solib.c b/gdb/solib.c
index b11c6f38900..1f6e91599a5 100644
--- a/gdb/solib.c
+++ b/gdb/solib.c
@@ -1557,6 +1557,10 @@ _initialize_solib ()
   solib_data = gdbarch_data_register_pre_init (solib_init);
 
   gdb::observers::free_objfile.attach (remove_user_added_objfile);
+  gdb::observers::inferior_execd.attach ([] (inferior *inf)
+    {
+      solib_create_inferior_hook (0);
+    });
 
   add_com ("sharedlibrary", class_files, sharedlibrary_command,
 	   _("Load shared object library symbols for files matching REGEXP."));


More information about the Gdb-cvs mailing list