gdb: add inferior_execd observable
authorSimon Marchi <simon.marchi@efficios.com>
Fri, 4 Dec 2020 21:43:51 +0000 (16:43 -0500)
committerSimon Marchi <simon.marchi@efficios.com>
Fri, 4 Dec 2020 21:43:52 +0000 (16:43 -0500)
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

gdb/ChangeLog
gdb/infrun.c
gdb/jit.c
gdb/jit.h
gdb/observable.c
gdb/observable.h
gdb/solib.c

index b0c3bd62d0152dfdf64e68b43cba90a30b1c4158..d7bfae85345bf07f5931b913035d6bff4e1d58a5 100644 (file)
@@ -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
index 2e5e837452da65c5568b99dde9605a9cd3a668b1..473a0fb85420c43196a2b68a8d042f2d8a1ba27c 100644 (file)
@@ -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 ();
 
index fd24d539159635e312b82ddfc54620f0831de72a..9deeed7ab597adf607b039d2e6da12a4fcaaf591 100644 (file)
--- 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);
 
index 6f972a6e077afcff6e5a6dd5414e9d1b4e1605d8..969380607337e6d50a96fa6bfa42275b62e4bbbb 100644 (file)
--- 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);
index 81aa392cc21fe8fad8d86f422e53fae24aa25c4a..231f955fa26016f88e34a9cc7e77eb780936ae62 100644 (file)
@@ -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);
index 9114b28d04f054665430ea312af05342486ba3d7..1dce6746ff393632f8a63fbac02c29fbdfc95416 100644 (file)
@@ -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.
index b11c6f38900901dacf2e842da2243561c8ae0b39..1f6e91599a56c3c6ad1f6abe566dc8b52100224f 100644 (file)
@@ -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."));