gdb: add interp::on_traceframe_changed method

Same idea as previous patches, but for traceframe_changed.

Change-Id: Ia473f07d70d57b30aca0094d0e0585d7e0d95637
This commit is contained in:
Simon Marchi 2023-04-21 09:45:30 -04:00
parent 7603ea6afa
commit 0bc845fc98
7 changed files with 32 additions and 32 deletions

View file

@ -527,6 +527,14 @@ interps_notify_solib_unloaded (so_list *so)
interps_notify (&interp::on_solib_unloaded, so);
}
/* See interps.h. */
void
interps_notify_traceframe_changed (int tfnum, int tpnum)
{
interps_notify (&interp::on_traceframe_changed, tfnum, tpnum);
}
/* This just adds the "interpreter-exec" command. */
void _initialize_interpreter ();
void

View file

@ -153,6 +153,9 @@ public:
the inferior to proceed. */
virtual void on_about_to_proceed () {}
/* Notify the interpreter that the selected traceframe changed. */
virtual void on_traceframe_changed (int tfnum, int tpnum) {}
private:
/* The memory for this is static, it comes from literal strings (e.g. "cli"). */
const char *m_name;
@ -304,6 +307,13 @@ extern void interps_notify_solib_loaded (so_list *so);
/* Notify all interpreters that solib SO has been unloaded. */
extern void interps_notify_solib_unloaded (so_list *so);
/* Notify all interpreters that the selected traceframe changed.
The trace frame is changed to TFNUM (e.g., by using the 'tfind' command).
If TFNUM is negative, it means gdb resumed live debugging. The number of
the tracepoint associated with this traceframe is TPNUM. */
extern void interps_notify_traceframe_changed (int tfnum, int tpnum);
/* well-known interpreters */
#define INTERP_CONSOLE "console"
#define INTERP_MI2 "mi2"

View file

@ -60,7 +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_traceframe_changed (int tfnum, int tpnum);
static void mi_tsv_created (const struct trace_state_variable *tsv);
static void mi_tsv_deleted (const struct trace_state_variable *tsv);
static void mi_tsv_modified (const struct trace_state_variable *tsv);
@ -495,33 +494,23 @@ struct mi_suppress_notification mi_suppress_notification =
0,
};
/* Emit notification on changing a traceframe. */
static void
mi_traceframe_changed (int tfnum, int tpnum)
void
mi_interp::on_traceframe_changed (int tfnum, int tpnum)
{
if (mi_suppress_notification.traceframe)
return;
SWITCH_THRU_ALL_UIS ()
{
struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
target_terminal::scoped_restore_terminal_state term_state;
target_terminal::ours_for_output ();
if (mi == NULL)
continue;
if (tfnum >= 0)
gdb_printf (this->event_channel, "traceframe-changed,"
"num=\"%d\",tracepoint=\"%d\"",
tfnum, tpnum);
else
gdb_printf (this->event_channel, "traceframe-changed,end");
target_terminal::scoped_restore_terminal_state term_state;
target_terminal::ours_for_output ();
if (tfnum >= 0)
gdb_printf (mi->event_channel, "traceframe-changed,"
"num=\"%d\",tracepoint=\"%d\"",
tfnum, tpnum);
else
gdb_printf (mi->event_channel, "traceframe-changed,end");
gdb_flush (mi->event_channel);
}
gdb_flush (this->event_channel);
}
/* Emit notification on creating a trace state variable. */
@ -1055,8 +1044,6 @@ _initialize_mi_interp ()
interp_factory_register (INTERP_MI4, mi_interp_factory);
interp_factory_register (INTERP_MI, mi_interp_factory);
gdb::observers::traceframe_changed.attach (mi_traceframe_changed,
"mi-interp");
gdb::observers::tsv_created.attach (mi_tsv_created, "mi-interp");
gdb::observers::tsv_deleted.attach (mi_tsv_deleted, "mi-interp");
gdb::observers::tsv_modified.attach (mi_tsv_modified, "mi-interp");

View file

@ -62,6 +62,7 @@ public:
void on_solib_loaded (so_list *so) override;
void on_solib_unloaded (so_list *so) override;
void on_about_to_proceed () override;
void on_traceframe_changed (int tfnum, int tpnum) override;
/* MI's output channels */
mi_console_file *out;

View file

@ -51,7 +51,6 @@ DEFINE_OBSERVABLE (about_to_proceed);
DEFINE_OBSERVABLE (breakpoint_created);
DEFINE_OBSERVABLE (breakpoint_deleted);
DEFINE_OBSERVABLE (breakpoint_modified);
DEFINE_OBSERVABLE (traceframe_changed);
DEFINE_OBSERVABLE (architecture_changed);
DEFINE_OBSERVABLE (thread_ptid_changed);
DEFINE_OBSERVABLE (inferior_added);

View file

@ -140,12 +140,6 @@ extern observable<struct breakpoint */* b */> breakpoint_deleted;
is the modified breakpoint. */
extern observable<struct breakpoint */* b */> breakpoint_modified;
/* The trace frame is changed to TFNUM (e.g., by using the 'tfind'
command). If TFNUM is negative, it means gdb resumes live
debugging. The number of the tracepoint associated with this
traceframe is TPNUM. */
extern observable<int /* tfnum */, int /* tpnum */> traceframe_changed;
/* The current architecture has changed. The argument NEWARCH is a
pointer to the new architecture. */
extern observable<struct gdbarch */* newarch */> architecture_changed;

View file

@ -59,6 +59,7 @@
#include "cli/cli-style.h"
#include "expop.h"
#include "gdbsupport/buildargv.h"
#include "interps.h"
#include <unistd.h>
@ -2139,7 +2140,7 @@ tfind_1 (enum trace_find_type type, int num,
set_tracepoint_num (tp ? tp->number : target_tracept);
if (target_frameno != get_traceframe_number ())
gdb::observers::traceframe_changed.notify (target_frameno, tracepoint_number);
interps_notify_traceframe_changed (target_frameno, tracepoint_number);
set_current_traceframe (target_frameno);