gdb: add interp::on_record_changed method

Same idea as previous patches, but for record_changed

Change-Id: I5eeeacd703af8401c315060514c94e8e6439cc40
This commit is contained in:
Simon Marchi 2023-04-21 09:45:30 -04:00
parent 2646bfa763
commit 44fbffc69d
9 changed files with 57 additions and 57 deletions

View file

@ -494,6 +494,15 @@ interps_notify_inferior_removed (inferior *inf)
interps_notify (&interp::on_inferior_removed, inf);
}
/* See interps.h. */
void
interps_notify_record_changed (inferior *inf, int started, const char *method,
const char *format)
{
interps_notify (&interp::on_record_changed, inf, started, method, format);
}
/* This just adds the "interpreter-exec" command. */
void _initialize_interpreter ();
void

View file

@ -134,6 +134,11 @@ public:
/* Notify the interpreter that inferior INF was removed. */
virtual void on_inferior_removed (inferior *inf) {}
/* Notify the interpreter that the status of process record for INF
changed. */
virtual void on_record_changed (inferior *inf, int started,
const char *method, const char *format) {}
private:
/* The memory for this is static, it comes from literal strings (e.g. "cli"). */
const char *m_name;
@ -263,6 +268,19 @@ extern void interps_notify_inferior_disappeared (inferior *inf);
/* Notify all interpreters that inferior INF was removed. */
extern void interps_notify_inferior_removed (inferior *inf);
/* Notify all interpreters that the status of process record for INF changed.
The process record is started if STARTED is true, and the process record is
stopped if STARTED is false.
When STARTED is true, METHOD indicates the short name of the method used for
recording. If the method supports multiple formats, FORMAT indicates which
one is being used, otherwise it is nullptr. When STARTED is false, they are
both nullptr. */
extern void interps_notify_record_changed (inferior *inf, int started,
const char *method,
const char *format);
/* well-known interpreters */
#define INTERP_CONSOLE "console"
#define INTERP_MI2 "mi2"

View 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_record_changed (struct inferior*, int, const char *,
const char *);
static void mi_on_resume (ptid_t ptid);
static void mi_solib_loaded (struct so_list *solib);
static void mi_solib_unloaded (struct so_list *solib);
@ -312,48 +310,32 @@ mi_interp::on_thread_exited (thread_info *t, int silent)
gdb_flush (this->event_channel);
}
/* Emit notification on changing the state of record. */
static void
mi_record_changed (struct inferior *inferior, int started, const char *method,
const char *format)
void
mi_interp::on_record_changed (inferior *inferior, int started,
const char *method, const char *format)
{
SWITCH_THRU_ALL_UIS ()
target_terminal::scoped_restore_terminal_state term_state;
target_terminal::ours_for_output ();
if (started)
{
struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
if (mi == NULL)
continue;
target_terminal::scoped_restore_terminal_state term_state;
target_terminal::ours_for_output ();
if (started)
{
if (format != NULL)
{
gdb_printf (mi->event_channel,
"record-started,thread-group=\"i%d\","
"method=\"%s\",format=\"%s\"",
inferior->num, method, format);
}
else
{
gdb_printf (mi->event_channel,
"record-started,thread-group=\"i%d\","
"method=\"%s\"",
inferior->num, method);
}
}
if (format != NULL)
gdb_printf (this->event_channel,
"record-started,thread-group=\"i%d\","
"method=\"%s\",format=\"%s\"",
inferior->num, method, format);
else
{
gdb_printf (mi->event_channel,
"record-stopped,thread-group=\"i%d\"",
inferior->num);
}
gdb_flush (mi->event_channel);
gdb_printf (this->event_channel,
"record-started,thread-group=\"i%d\","
"method=\"%s\"",
inferior->num, method);
}
else
gdb_printf (this->event_channel,
"record-stopped,thread-group=\"i%d\"",
inferior->num);
gdb_flush (this->event_channel);
}
void
@ -1110,7 +1092,6 @@ _initialize_mi_interp ()
interp_factory_register (INTERP_MI4, mi_interp_factory);
interp_factory_register (INTERP_MI, mi_interp_factory);
gdb::observers::record_changed.attach (mi_record_changed, "mi-interp");
gdb::observers::target_resumed.attach (mi_on_resume, "mi-interp");
gdb::observers::solib_loaded.attach (mi_solib_loaded, "mi-interp");
gdb::observers::solib_unloaded.attach (mi_solib_unloaded, "mi-interp");

View file

@ -56,6 +56,8 @@ public:
void on_inferior_appeared (inferior *inf) override;
void on_inferior_disappeared (inferior *inf) override;
void on_inferior_removed (inferior *inf) override;
void on_record_changed (inferior *inf, int started, const char *method,
const char *format) override;
/* MI's output channels */
mi_console_file *out;

View file

@ -39,7 +39,6 @@ DEFINE_OBSERVABLE (executable_changed);
DEFINE_OBSERVABLE (inferior_created);
DEFINE_OBSERVABLE (inferior_execd);
DEFINE_OBSERVABLE (inferior_forked);
DEFINE_OBSERVABLE (record_changed);
DEFINE_OBSERVABLE (solib_loaded);
DEFINE_OBSERVABLE (solib_unloaded);
DEFINE_OBSERVABLE (new_objfile);

View file

@ -88,18 +88,6 @@ extern observable<inferior */* exec_inf */, inferior */* follow_inf */>
extern observable<inferior */* parent_inf */, inferior */* child_inf */,
target_waitkind /* fork_kind */> inferior_forked;
/* 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.
When STARTED is true, METHOD indicates the short name of the
method used for recording. If the method supports multiple
formats, FORMAT indicates which one is being used, otherwise it
is NULL. When STARTED is false, they are both NULL. */
extern observable<struct inferior */* inferior */, int /* started */,
const char */* method */, const char */* format */>
record_changed;
/* The shared library specified by SOLIB has been loaded. Note that
when gdb calls this observer, the library's symbols probably
haven't been loaded yet. */

View file

@ -45,6 +45,7 @@
#include "async-event.h"
#include <forward_list>
#include "objfiles.h"
#include "interps.h"
static const target_info record_btrace_target_info = {
"record-btrace",
@ -347,7 +348,7 @@ record_btrace_push_target (void)
record_btrace_generating_corefile = 0;
format = btrace_format_short_string (record_btrace_conf.format);
gdb::observers::record_changed.notify (current_inferior (), 1, "btrace", format);
interps_notify_record_changed (current_inferior (), 1, "btrace", format);
}
/* Disable btrace on a set of threads on scope exit. */

View file

@ -40,6 +40,7 @@
#include "gdbsupport/byte-vector.h"
#include "async-event.h"
#include "valprint.h"
#include "interps.h"
#include <signal.h>
@ -981,7 +982,7 @@ record_full_open (const char *name, int from_tty)
record_full_init_record_breakpoints ();
gdb::observers::record_changed.notify (current_inferior (), 1, "full", NULL);
interps_notify_record_changed (current_inferior (), 1, "full", NULL);
}
/* "close" target method. Close the process record target. */

View file

@ -26,6 +26,7 @@
#include "gdbsupport/common-utils.h"
#include "cli/cli-utils.h"
#include "disasm.h"
#include "interps.h"
#include <ctype.h>
@ -311,7 +312,7 @@ cmd_record_stop (const char *args, int from_tty)
gdb_printf (_("Process record is stopped and all execution "
"logs are deleted.\n"));
gdb::observers::record_changed.notify (current_inferior (), 0, NULL, NULL);
interps_notify_record_changed (current_inferior (), 0, NULL, NULL);
}