gdb: add interp::on_no_history method
authorSimon Marchi <simon.marchi@efficios.com>
Thu, 20 Apr 2023 19:35:18 +0000 (15:35 -0400)
committerSimon Marchi <simon.marchi@efficios.com>
Tue, 30 May 2023 19:07:26 +0000 (15:07 -0400)
Same as previous patches, but for no_history.

Change-Id: I06930fe7cb4082138c6c5496c5118fe4951c10da

gdb/cli/cli-interp.c
gdb/cli/cli-interp.h
gdb/infrun.c
gdb/interps.c
gdb/interps.h
gdb/mi/mi-interp.c
gdb/mi/mi-interp.h
gdb/observable.c
gdb/observable.h

index 6cb315cb57d21a6983f0dd5ad6d6ad2fe49161ff..98bc2033f2c69e472d5fa541ca640c54fa1728bc 100644 (file)
@@ -146,19 +146,10 @@ cli_interp_base::on_exited (int status)
   print_exited_reason (this->interp_ui_out (), status);
 }
 
-/* Observer for the no_history notification.  */
-
-static void
-cli_base_on_no_history ()
+void
+cli_interp_base::on_no_history ()
 {
-  SWITCH_THRU_ALL_UIS ()
-    {
-      cli_interp_base *cli = as_cli_interp_base (top_level_interpreter ());
-      if (cli == nullptr)
-       continue;
-
-      print_no_history_reason (cli->interp_ui_out ());
-    }
+  print_no_history_reason (this->interp_ui_out ());
 }
 
 /* Observer for the sync_execution_done notification.  */
@@ -370,7 +361,6 @@ _initialize_cli_interp ()
   interp_factory_register (INTERP_CONSOLE, cli_interp_factory);
 
   /* Note these all work for both the CLI and TUI interpreters.  */
-  gdb::observers::no_history.attach (cli_base_on_no_history, "cli-interp-base");
   gdb::observers::sync_execution_done.attach (cli_base_on_sync_execution_done,
                                              "cli-interp-base");
   gdb::observers::command_error.attach (cli_base_on_command_error,
index 2e50860efa9e764a51c9646579809795ab72e954..7fc22a042d734b40d47196f4eeb872753595c20b 100644 (file)
@@ -37,6 +37,7 @@ public:
   void on_signal_exited (gdb_signal sig) override;
   void on_normal_stop (bpstat *bs, int print_frame) override;
   void on_exited (int status) override;
+  void on_no_history () override;
 
 private:
   struct saved_output_files
index 43a7ff28fe146f0427bf3dd5aecda78a7891c4ac..3328631a7ae554aef8707f97177f43557fc1b7f3 100644 (file)
@@ -6039,7 +6039,7 @@ handle_inferior_event (struct execution_control_state *ecs)
       if (handle_stop_requested (ecs))
        return;
 
-      gdb::observers::no_history.notify ();
+      interps_notify_no_history ();
       stop_waiting (ecs);
       return;
     }
index a7fede1d33129425eb77588d4435ef050a7bc0e5..885bfc36ec70cdd427bcfb29780bc3cec334edab 100644 (file)
@@ -416,6 +416,14 @@ interps_notify_signal_exited (gdb_signal sig)
 
 /* See interps.h.  */
 
+void
+interps_notify_no_history ()
+{
+  interps_notify (&interp::on_no_history);
+}
+
+/* See interps.h.  */
+
 void
 interps_notify_normal_stop (bpstat *bs, int print_frame)
 {
index 6c2656dd1b071e827c878e565dfeb5c132972f20..915a5f74eb7330db81021adf558e41c8e2f470ba 100644 (file)
@@ -98,6 +98,10 @@ public:
      status STATUS.  */
   virtual void on_exited (int status) {}
 
+  /* Notify the interpreter that the current inferior has stopped reverse
+     execution because there is no more history.  */
+  virtual void on_no_history () {}
+
 private:
   /* The memory for this is static, it comes from literal strings (e.g. "cli").  */
   const char *m_name;
@@ -197,6 +201,10 @@ extern void interps_notify_signal_exited (gdb_signal sig);
 /* Notify all interpreters that the current inferior has stopped normally.  */
 extern void interps_notify_normal_stop (bpstat *bs, int print_frame);
 
+/* Notify all interpreters that the current inferior has stopped reverse
+   execution because there is no more history.  */
+extern void interps_notify_no_history ();
+
 /* Notify all interpreters that the current inferior has exited normally with
    status STATUS.  */
 extern void interps_notify_exited (int status);
index cfe15161494795c17775444f388ae47514ed647f..795d70ed76a1fac21fad9a39f605a962025407bc 100644 (file)
@@ -60,8 +60,6 @@ static int mi_interp_query_hook (const char *ctlstr, va_list ap)
 static void mi_insert_notify_hooks (void);
 static void mi_remove_notify_hooks (void);
 
-static void mi_on_no_history (void);
-
 static void mi_new_thread (struct thread_info *t);
 static void mi_thread_exit (struct thread_info *t, int silent);
 static void mi_record_changed (struct inferior*, int, const char *,
@@ -497,26 +495,6 @@ mi_inferior_removed (struct inferior *inf)
     }
 }
 
-/* Return the MI interpreter, if it is active -- either because it's
-   the top-level interpreter or the interpreter executing the current
-   command.  Returns NULL if the MI interpreter is not being used.  */
-
-static struct mi_interp *
-find_mi_interp (void)
-{
-  struct mi_interp *mi;
-
-  mi = as_mi_interp (top_level_interpreter ());
-  if (mi != NULL)
-    return mi;
-
-  mi = as_mi_interp (command_interp ());
-  if (mi != NULL)
-    return mi;
-
-  return NULL;
-}
-
 /* Observers for several run control events that print why the
    inferior has stopped to both the MI event channel and to the MI
    console.  If the MI interpreter is not active, print nothing.  */
@@ -542,21 +520,11 @@ mi_interp::on_exited (int status)
   print_exited_reason (this->cli_uiout, status);
 }
 
-/* Observer for the no_history notification.  */
-
-static void
-mi_on_no_history (void)
+void
+mi_interp::on_no_history ()
 {
-  SWITCH_THRU_ALL_UIS ()
-    {
-      struct mi_interp *mi = find_mi_interp ();
-
-      if (mi == NULL)
-       continue;
-
-      print_no_history_reason (mi->mi_uiout);
-      print_no_history_reason (mi->cli_uiout);
-    }
+  print_no_history_reason (this->mi_uiout);
+  print_no_history_reason (this->cli_uiout);
 }
 
 void
@@ -1253,7 +1221,6 @@ _initialize_mi_interp ()
   interp_factory_register (INTERP_MI4, mi_interp_factory);
   interp_factory_register (INTERP_MI, mi_interp_factory);
 
-  gdb::observers::no_history.attach (mi_on_no_history, "mi-interp");
   gdb::observers::new_thread.attach (mi_new_thread, "mi-interp");
   gdb::observers::thread_exit.attach (mi_thread_exit, "mi-interp");
   gdb::observers::inferior_added.attach (mi_inferior_added, "mi-interp");
index 9b29bb5547f6ff4cc28dc66f58ee55134128b863..45b6f15a1a8ce94e7aaddbe99ea97408734643d3 100644 (file)
@@ -46,6 +46,7 @@ public:
   void on_signal_exited (gdb_signal sig) override;
   void on_normal_stop (struct bpstat *bs, int print_frame) override;
   void on_exited (int status) override;
+  void on_no_history () override;
 
   /* MI's output channels */
   mi_console_file *out;
index 8438900238348e9d289a24d3175228a883790bf6..502e2d988cd1d8712cf80663503e51af5e91ad2d 100644 (file)
@@ -34,7 +34,6 @@ bool observer_debug = false;
 
 DEFINE_OBSERVABLE (normal_stop);
 DEFINE_OBSERVABLE (signal_received);
-DEFINE_OBSERVABLE (no_history);
 DEFINE_OBSERVABLE (sync_execution_done);
 DEFINE_OBSERVABLE (command_error);
 DEFINE_OBSERVABLE (target_changed);
index 25af2da6e93590cc627af3de3986c82073ec22e0..b06d13be036284292803e7179e37ecacbfcc6c03 100644 (file)
@@ -57,9 +57,6 @@ extern observable<struct bpstat */* bs */, int /* print_frame */> normal_stop;
 /* The inferior was stopped by a signal.  */
 extern observable<enum gdb_signal /* siggnal */> signal_received;
 
-/* Reverse execution: target ran out of history info.  */
-extern observable<> no_history;
-
 /* A synchronous command finished.  */
 extern observable<> sync_execution_done;