aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Marchi <simon.marchi@efficios.com>2023-04-20 16:07:12 -0400
committerSimon Marchi <simon.marchi@efficios.com>2023-05-30 15:07:26 -0400
commit77cd03e27c547a5b5b7f086a0b537084eb399258 (patch)
treef38ecc8550cbfd0c4fd13d14de985daf83b764a0
parent2736b77153629619fe75071356e16d9db51606ff (diff)
downloadfsf-binutils-gdb-77cd03e27c547a5b5b7f086a0b537084eb399258.zip
fsf-binutils-gdb-77cd03e27c547a5b5b7f086a0b537084eb399258.tar.gz
fsf-binutils-gdb-77cd03e27c547a5b5b7f086a0b537084eb399258.tar.bz2
gdb: add interp::on_user_selected_context_changed method
Same as previous patches, but for user_selected_context_changed. Change-Id: I40de15be897671227d4bcf3e747f0fd595f0d5be
-rw-r--r--gdb/cli/cli-interp.c36
-rw-r--r--gdb/cli/cli-interp.h1
-rw-r--r--gdb/inferior.c4
-rw-r--r--gdb/infrun.c8
-rw-r--r--gdb/infrun.h3
-rw-r--r--gdb/interps.c8
-rw-r--r--gdb/interps.h8
-rw-r--r--gdb/mi/mi-interp.c64
-rw-r--r--gdb/mi/mi-interp.h1
-rw-r--r--gdb/mi/mi-main.c2
-rw-r--r--gdb/stack.c8
-rw-r--r--gdb/thread.c6
12 files changed, 66 insertions, 83 deletions
diff --git a/gdb/cli/cli-interp.c b/gdb/cli/cli-interp.c
index ffb4072..6a175f7 100644
--- a/gdb/cli/cli-interp.c
+++ b/gdb/cli/cli-interp.c
@@ -67,15 +67,6 @@ cli_interp::cli_interp (const char *name)
/* Suppress notification struct. */
struct cli_suppress_notification cli_suppress_notification;
-/* Returns the INTERP's data cast as cli_interp_base if INTERP is a
- console-like interpreter, and returns NULL otherwise. */
-
-static cli_interp_base *
-as_cli_interp_base (interp *interp)
-{
- return dynamic_cast<cli_interp_base *> (interp);
-}
-
/* See cli-interp.h.
Breakpoint hits should always be mirrored to a console. Deciding
@@ -164,10 +155,8 @@ cli_interp_base::on_command_error ()
display_gdb_prompt (NULL);
}
-/* Observer for the user_selected_context_changed notification. */
-
-static void
-cli_base_on_user_selected_context_changed (user_selected_what selection)
+void
+cli_interp_base::on_user_selected_context_changed (user_selected_what selection)
{
/* This event is suppressed. */
if (cli_suppress_notification.user_selected_context)
@@ -175,19 +164,12 @@ cli_base_on_user_selected_context_changed (user_selected_what selection)
thread_info *tp = inferior_ptid != null_ptid ? inferior_thread () : nullptr;
- SWITCH_THRU_ALL_UIS ()
- {
- cli_interp_base *cli = as_cli_interp_base (top_level_interpreter ());
- if (cli == nullptr)
- continue;
-
- if (selection & USER_SELECTED_INFERIOR)
- print_selected_inferior (cli->interp_ui_out ());
+ if (selection & USER_SELECTED_INFERIOR)
+ print_selected_inferior (this->interp_ui_out ());
- if (tp != nullptr
- && ((selection & (USER_SELECTED_THREAD | USER_SELECTED_FRAME))))
- print_selected_thread_frame (cli->interp_ui_out (), selection);
- }
+ if (tp != nullptr
+ && ((selection & (USER_SELECTED_THREAD | USER_SELECTED_FRAME))))
+ print_selected_thread_frame (this->interp_ui_out (), selection);
}
/* pre_command_loop implementation. */
@@ -347,8 +329,4 @@ void
_initialize_cli_interp ()
{
interp_factory_register (INTERP_CONSOLE, cli_interp_factory);
-
- /* Note these all work for both the CLI and TUI interpreters. */
- gdb::observers::user_selected_context_changed.attach
- (cli_base_on_user_selected_context_changed, "cli-interp-base");
}
diff --git a/gdb/cli/cli-interp.h b/gdb/cli/cli-interp.h
index 5020b2b..a1a20b6 100644
--- a/gdb/cli/cli-interp.h
+++ b/gdb/cli/cli-interp.h
@@ -40,6 +40,7 @@ public:
void on_no_history () override;
void on_sync_execution_done () override;
void on_command_error () override;
+ void on_user_selected_context_changed (user_selected_what selection) override;
private:
struct saved_output_files
diff --git a/gdb/inferior.c b/gdb/inferior.c
index fd451c8..8962b64 100644
--- a/gdb/inferior.c
+++ b/gdb/inferior.c
@@ -745,7 +745,7 @@ inferior_command (const char *args, int from_tty)
switch_to_thread (tp);
}
- gdb::observers::user_selected_context_changed.notify
+ notify_user_selected_context_changed
(USER_SELECTED_INFERIOR
| USER_SELECTED_THREAD
| USER_SELECTED_FRAME);
@@ -754,7 +754,7 @@ inferior_command (const char *args, int from_tty)
{
switch_to_inferior_no_thread (inf);
- gdb::observers::user_selected_context_changed.notify
+ notify_user_selected_context_changed
(USER_SELECTED_INFERIOR);
}
}
diff --git a/gdb/infrun.c b/gdb/infrun.c
index 2d234ed..d433430 100644
--- a/gdb/infrun.c
+++ b/gdb/infrun.c
@@ -6283,6 +6283,14 @@ notify_normal_stop (bpstat *bs, int print_frame)
gdb::observers::normal_stop.notify (bs, print_frame);
}
+/* See infrun.h. */
+
+void notify_user_selected_context_changed (user_selected_what selection)
+{
+ interps_notify_user_selected_context_changed (selection);
+ gdb::observers::user_selected_context_changed.notify (selection);
+}
+
/* Come here when the program has stopped with a signal. */
static void
diff --git a/gdb/infrun.h b/gdb/infrun.h
index cbafc3e..a343d27 100644
--- a/gdb/infrun.h
+++ b/gdb/infrun.h
@@ -218,6 +218,9 @@ extern void notify_signal_received (gdb_signal sig);
normally. */
extern void notify_normal_stop (bpstat *bs, int print_frame);
+/* Notify interpreters and observers that the user focus has changed. */
+extern void notify_user_selected_context_changed (user_selected_what selection);
+
/* Several print_*_reason helper functions to print why the inferior
has stopped to the passed in UIOUT. */
diff --git a/gdb/interps.c b/gdb/interps.c
index 885bfc3..55abcb3 100644
--- a/gdb/interps.c
+++ b/gdb/interps.c
@@ -438,6 +438,14 @@ interps_notify_exited (int status)
interps_notify (&interp::on_exited, status);
}
+/* See interps.h. */
+
+void
+interps_notify_user_selected_context_changed (user_selected_what selection)
+{
+ interps_notify (&interp::on_user_selected_context_changed, selection);
+}
+
/* This just adds the "interpreter-exec" command. */
void _initialize_interpreter ();
void
diff --git a/gdb/interps.h b/gdb/interps.h
index 53d951b..4706c9b 100644
--- a/gdb/interps.h
+++ b/gdb/interps.h
@@ -110,6 +110,10 @@ public:
command on this interpreter. */
virtual void on_command_error () {}
+ /* Notify the interpreter that the user focus has changed. */
+ virtual void on_user_selected_context_changed (user_selected_what selection)
+ {}
+
private:
/* The memory for this is static, it comes from literal strings (e.g. "cli"). */
const char *m_name;
@@ -217,6 +221,10 @@ extern void interps_notify_no_history ();
status STATUS. */
extern void interps_notify_exited (int status);
+/* Notify all interpreters that the user focus has changed. */
+extern void interps_notify_user_selected_context_changed
+ (user_selected_what selection);
+
/* well-known interpreters */
#define INTERP_CONSOLE "console"
#define INTERP_MI2 "mi2"
diff --git a/gdb/mi/mi-interp.c b/gdb/mi/mi-interp.c
index 313d751..2984cb9 100644
--- a/gdb/mi/mi-interp.c
+++ b/gdb/mi/mi-interp.c
@@ -1087,60 +1087,40 @@ mi_memory_changed (struct inferior *inferior, CORE_ADDR memaddr,
}
}
-/* Emit an event when the selection context (inferior, thread, frame)
- changed. */
-
-static void
-mi_user_selected_context_changed (user_selected_what selection)
+void
+mi_interp::on_user_selected_context_changed (user_selected_what selection)
{
- struct thread_info *tp;
-
/* Don't send an event if we're responding to an MI command. */
if (mi_suppress_notification.user_selected_context)
return;
- if (inferior_ptid != null_ptid)
- tp = inferior_thread ();
- else
- tp = NULL;
-
- SWITCH_THRU_ALL_UIS ()
- {
- struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
- struct ui_out *mi_uiout;
-
- if (mi == NULL)
- continue;
+ thread_info *tp = inferior_ptid != null_ptid ? inferior_thread () : nullptr;
+ ui_out *mi_uiout = this->interp_ui_out ();
+ ui_out_redirect_pop redirect_popper (mi_uiout, this->event_channel);
- mi_uiout = top_level_interpreter ()->interp_ui_out ();
+ target_terminal::scoped_restore_terminal_state term_state;
+ target_terminal::ours_for_output ();
- ui_out_redirect_pop redirect_popper (mi_uiout, mi->event_channel);
+ if (selection & USER_SELECTED_INFERIOR)
+ print_selected_inferior (this->cli_uiout);
- target_terminal::scoped_restore_terminal_state term_state;
- target_terminal::ours_for_output ();
+ if (tp != NULL
+ && (selection & (USER_SELECTED_THREAD | USER_SELECTED_FRAME)))
+ {
+ print_selected_thread_frame (this->cli_uiout, selection);
- if (selection & USER_SELECTED_INFERIOR)
- print_selected_inferior (mi->cli_uiout);
+ gdb_printf (this->event_channel, "thread-selected,id=\"%d\"",
+ tp->global_num);
- if (tp != NULL
- && (selection & (USER_SELECTED_THREAD | USER_SELECTED_FRAME)))
+ if (tp->state != THREAD_RUNNING)
{
- print_selected_thread_frame (mi->cli_uiout, selection);
-
- gdb_printf (mi->event_channel,
- "thread-selected,id=\"%d\"",
- tp->global_num);
-
- if (tp->state != THREAD_RUNNING)
- {
- if (has_stack_frames ())
- print_stack_frame_to_uiout (mi_uiout, get_selected_frame (NULL),
- 1, SRC_AND_LOC, 1);
- }
+ if (has_stack_frames ())
+ print_stack_frame_to_uiout (mi_uiout, get_selected_frame (NULL),
+ 1, SRC_AND_LOC, 1);
}
-
- gdb_flush (mi->event_channel);
}
+
+ gdb_flush (this->event_channel);
}
ui_out *
@@ -1234,6 +1214,4 @@ _initialize_mi_interp ()
gdb::observers::command_param_changed.attach (mi_command_param_changed,
"mi-interp");
gdb::observers::memory_changed.attach (mi_memory_changed, "mi-interp");
- gdb::observers::user_selected_context_changed.attach
- (mi_user_selected_context_changed, "mi-interp");
}
diff --git a/gdb/mi/mi-interp.h b/gdb/mi/mi-interp.h
index 6a02eef..bb66e63 100644
--- a/gdb/mi/mi-interp.h
+++ b/gdb/mi/mi-interp.h
@@ -49,6 +49,7 @@ public:
void on_no_history () override;
void on_sync_execution_done () override;
void on_command_error () override;
+ void on_user_selected_context_changed (user_selected_what selection) override;
/* MI's output channels */
mi_console_file *out;
diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c
index dc7d717..7503ffd 100644
--- a/gdb/mi/mi-main.c
+++ b/gdb/mi/mi-main.c
@@ -2138,7 +2138,7 @@ mi_cmd_execute (struct mi_parse *parse)
if (!parse->cmd->preserve_user_selected_context ()
&& current_user_selected_context.has_changed ())
- gdb::observers::user_selected_context_changed.notify
+ interps_notify_user_selected_context_changed
(USER_SELECTED_THREAD | USER_SELECTED_FRAME);
}
diff --git a/gdb/stack.c b/gdb/stack.c
index e941eb6..002bf58 100644
--- a/gdb/stack.c
+++ b/gdb/stack.c
@@ -1831,7 +1831,7 @@ select_frame_command_core (frame_info_ptr fi, bool ignored)
frame_info_ptr prev_frame = get_selected_frame ();
select_frame (fi);
if (get_selected_frame () != prev_frame)
- gdb::observers::user_selected_context_changed.notify (USER_SELECTED_FRAME);
+ notify_user_selected_context_changed (USER_SELECTED_FRAME);
}
/* The core of all the "frame" sub-commands. Select frame FI, and if this
@@ -1844,7 +1844,7 @@ frame_command_core (frame_info_ptr fi, bool ignored)
frame_info_ptr prev_frame = get_selected_frame ();
select_frame (fi);
if (get_selected_frame () != prev_frame)
- gdb::observers::user_selected_context_changed.notify (USER_SELECTED_FRAME);
+ notify_user_selected_context_changed (USER_SELECTED_FRAME);
else
print_selected_thread_frame (current_uiout, USER_SELECTED_FRAME);
}
@@ -2644,7 +2644,7 @@ static void
up_command (const char *count_exp, int from_tty)
{
up_silently_base (count_exp);
- gdb::observers::user_selected_context_changed.notify (USER_SELECTED_FRAME);
+ notify_user_selected_context_changed (USER_SELECTED_FRAME);
}
/* Select the frame down one or COUNT_EXP stack levels from the previously
@@ -2683,7 +2683,7 @@ static void
down_command (const char *count_exp, int from_tty)
{
down_silently_base (count_exp);
- gdb::observers::user_selected_context_changed.notify (USER_SELECTED_FRAME);
+ notify_user_selected_context_changed (USER_SELECTED_FRAME);
}
void
diff --git a/gdb/thread.c b/gdb/thread.c
index e9432f9..13db9f8 100644
--- a/gdb/thread.c
+++ b/gdb/thread.c
@@ -1846,10 +1846,8 @@ thread_command (const char *tidstr, int from_tty)
| USER_SELECTED_FRAME);
}
else
- {
- gdb::observers::user_selected_context_changed.notify
- (USER_SELECTED_THREAD | USER_SELECTED_FRAME);
- }
+ notify_user_selected_context_changed
+ (USER_SELECTED_THREAD | USER_SELECTED_FRAME);
}
}