|  | /* Observers | 
|  |  | 
|  | Copyright (C) 2016-2025 Free Software Foundation, Inc. | 
|  |  | 
|  | This file is part of GDB. | 
|  |  | 
|  | This program is free software; you can redistribute it and/or modify | 
|  | it under the terms of the GNU General Public License as published by | 
|  | the Free Software Foundation; either version 3 of the License, or | 
|  | (at your option) any later version. | 
|  |  | 
|  | This program is distributed in the hope that it will be useful, | 
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|  | GNU General Public License for more details. | 
|  |  | 
|  | You should have received a copy of the GNU General Public License | 
|  | along with this program.  If not, see <http://www.gnu.org/licenses/>.  */ | 
|  |  | 
|  | #ifndef GDB_OBSERVABLE_H | 
|  | #define GDB_OBSERVABLE_H | 
|  |  | 
|  | #include "gdbsupport/observable.h" | 
|  | #include "target/waitstatus.h" | 
|  |  | 
|  | struct bpstat; | 
|  | struct solib; | 
|  | struct objfile; | 
|  | struct thread_info; | 
|  | struct inferior; | 
|  | struct process_stratum_target; | 
|  | struct target_ops; | 
|  | struct trace_state_variable; | 
|  | struct program_space; | 
|  |  | 
|  | namespace gdb | 
|  | { | 
|  |  | 
|  | namespace observers | 
|  | { | 
|  |  | 
|  | /* The inferior has stopped for real.  The BS argument describes the | 
|  | breakpoints were are stopped at, if any.  Second argument | 
|  | PRINT_FRAME non-zero means display the location where the | 
|  | inferior has stopped. | 
|  |  | 
|  | gdb notifies all normal_stop observers when the inferior execution | 
|  | has just stopped, the associated messages and annotations have been | 
|  | printed, and the control is about to be returned to the user. | 
|  |  | 
|  | Note that the normal_stop notification is not emitted when the | 
|  | execution stops due to a breakpoint, and this breakpoint has a | 
|  | condition that is not met.  If the breakpoint has any associated | 
|  | commands list, the commands are executed after the notification is | 
|  | emitted.  */ | 
|  | 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; | 
|  |  | 
|  | /* The target's register contents have changed.  */ | 
|  | extern observable<struct target_ops */* target */> target_changed; | 
|  |  | 
|  | /* The executable being debugged by GDB in PSPACE has changed: The user | 
|  | decided to debug a different program, or the program he was debugging | 
|  | has been modified since being loaded by the debugger (by being | 
|  | recompiled, for instance).  The path to the new executable can be found | 
|  | by examining PSPACE->exec_filename. | 
|  |  | 
|  | When RELOAD is true the path to the executable hasn't changed, but the | 
|  | file does appear to have changed, so GDB reloaded it, e.g. if the user | 
|  | recompiled the executable.  when RELOAD is false then the path to the | 
|  | executable has not changed.  */ | 
|  | extern observable<struct program_space */* pspace */, | 
|  | bool /*reload */> executable_changed; | 
|  |  | 
|  | /* gdb has just connected to an inferior.  For 'run', gdb calls this | 
|  | observer while the inferior is still stopped at the entry-point | 
|  | instruction.  For 'attach' and 'core', gdb calls this observer | 
|  | immediately after connecting to the inferior, and before any | 
|  | information on the inferior has been printed.  */ | 
|  | extern observable<inferior */* inferior */> inferior_created; | 
|  |  | 
|  | /* The inferior EXEC_INF has exec'ed a new executable file. | 
|  |  | 
|  | Execution continues in FOLLOW_INF, which may or may not be the same as | 
|  | EXEC_INF, depending on "set follow-exec-mode".  */ | 
|  | extern observable<inferior */* exec_inf */, inferior */* follow_inf */> | 
|  | inferior_execd; | 
|  |  | 
|  | /* The inferior PARENT_INF has forked.  If we are setting up an inferior for | 
|  | the child (because we follow only the child or we follow both), CHILD_INF | 
|  | is the child inferior.  Otherwise, CHILD_INF is nullptr. | 
|  |  | 
|  | FORK_KIND is TARGET_WAITKIND_FORKED or TARGET_WAITKIND_VFORKED.  */ | 
|  | extern observable<inferior */* parent_inf */, inferior */* child_inf */, | 
|  | target_waitkind /* fork_kind */> inferior_forked; | 
|  |  | 
|  | /* 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.  */ | 
|  | extern observable<solib &/* solib */> solib_loaded; | 
|  |  | 
|  | /* The shared library SOLIB has been unloaded from program space PSPACE. | 
|  | The SILENT argument indicates that GDB doesn't wish to notify the CLI | 
|  | about any non-error consequences of unloading the solib, e.g. when | 
|  | breakpoints are disabled. | 
|  |  | 
|  | Note  when gdb calls this observer, the library's symbols have not | 
|  | been unloaded yet, and thus are still available.  */ | 
|  | extern observable<program_space *, const solib &/* solib */, | 
|  | bool /* still_in_use */, bool /* silent */> solib_unloaded; | 
|  |  | 
|  | /* The symbol file specified by OBJFILE has been loaded.  */ | 
|  | extern observable<struct objfile */* objfile */> new_objfile; | 
|  |  | 
|  | /*  All objfiles from PSPACE were removed.  */ | 
|  | extern observable<program_space */* pspace */> all_objfiles_removed; | 
|  |  | 
|  | /* The object file specified by OBJFILE is about to be freed.  */ | 
|  | extern observable<struct objfile */* objfile */> free_objfile; | 
|  |  | 
|  | /* The thread specified by T has been created.  */ | 
|  | extern observable<struct thread_info */* t */> new_thread; | 
|  |  | 
|  | /* The thread specified by T has exited.  EXIT_CODE is the thread's | 
|  | exit code, if available.  The SILENT argument indicates that GDB is | 
|  | removing the thread from its tables without wanting to notify the | 
|  | CLI about it.  */ | 
|  | extern observable<thread_info */* t */, | 
|  | std::optional<ULONGEST> /* exit_code */, | 
|  | bool /* silent */> thread_exit; | 
|  |  | 
|  | /* The thread specified by T has been deleted, with delete_thread. | 
|  | This is called just before the thread_info object is destroyed with | 
|  | operator delete.  */ | 
|  | extern observable<thread_info */* t */> thread_deleted; | 
|  |  | 
|  | /* An explicit stop request was issued to PTID.  If PTID equals | 
|  | minus_one_ptid, the request applied to all threads.  If | 
|  | ptid_is_pid(PTID) returns true, the request applied to all | 
|  | threads of the process pointed at by PTID.  Otherwise, the | 
|  | request applied to the single thread pointed at by PTID.  */ | 
|  | extern observable<ptid_t /* ptid */> thread_stop_requested; | 
|  |  | 
|  | /* The target was resumed.  The PTID parameter specifies which | 
|  | thread was resume, and may be RESUME_ALL if all threads are | 
|  | resumed.  */ | 
|  | extern observable<ptid_t /* ptid */> target_resumed; | 
|  |  | 
|  | /* The target is about to be proceeded.  */ | 
|  | extern observable<> about_to_proceed; | 
|  |  | 
|  | /* A new breakpoint B has been created.  */ | 
|  | extern observable<struct breakpoint */* b */> breakpoint_created; | 
|  |  | 
|  | /* A breakpoint has been destroyed.  The argument B is the | 
|  | pointer to the destroyed breakpoint.  */ | 
|  | extern observable<struct breakpoint */* b */> breakpoint_deleted; | 
|  |  | 
|  | /* A breakpoint has been modified in some way.  The argument B | 
|  | is the modified breakpoint.  */ | 
|  | extern observable<struct breakpoint */* b */> breakpoint_modified; | 
|  |  | 
|  | /* GDB has instantiated a new architecture, NEWARCH is a pointer to the new | 
|  | architecture.  */ | 
|  | extern observable<struct gdbarch */* newarch */> new_architecture; | 
|  |  | 
|  | /* The thread's ptid has changed.  The OLD_PTID parameter specifies | 
|  | the old value, and NEW_PTID specifies the new value.  */ | 
|  | extern observable<process_stratum_target * /* target */, | 
|  | ptid_t /* old_ptid */, ptid_t /* new_ptid */> | 
|  | thread_ptid_changed; | 
|  |  | 
|  | /* The inferior INF has been added to the list of inferiors.  At | 
|  | this point, it might not be associated with any process.  */ | 
|  | extern observable<struct inferior */* inf */> inferior_added; | 
|  |  | 
|  | /* The inferior identified by INF has been attached to a | 
|  | process.  */ | 
|  | extern observable<struct inferior */* inf */> inferior_appeared; | 
|  |  | 
|  | /* Inferior INF is about to be detached.  */ | 
|  | extern observable<struct inferior */* inf */> inferior_pre_detach; | 
|  |  | 
|  | /* Either the inferior associated with INF has been detached from | 
|  | the process, or the process has exited.  */ | 
|  | extern observable<struct inferior */* inf */> inferior_exit; | 
|  |  | 
|  | /* The inferior INF has been removed from the list of inferiors. | 
|  | This method is called immediately before freeing INF.  */ | 
|  | extern observable<struct inferior */* inf */> inferior_removed; | 
|  |  | 
|  | /* The inferior CLONE has been created by cloning INF.  */ | 
|  | extern observable<struct inferior */* inf */, struct inferior */* clone */> | 
|  | inferior_cloned; | 
|  |  | 
|  | /* Bytes from DATA to DATA + LEN have been written to the inferior | 
|  | at ADDR.  */ | 
|  | extern observable<struct inferior */* inferior */, CORE_ADDR /* addr */, | 
|  | ssize_t /* len */, const bfd_byte */* data */> | 
|  | memory_changed; | 
|  |  | 
|  | /* Called before a top-level prompt is displayed.  CURRENT_PROMPT is | 
|  | the current top-level prompt.  */ | 
|  | extern observable<const char */* current_prompt */> before_prompt; | 
|  |  | 
|  | /* Variable gdb_datadir has been set.  The value may not necessarily | 
|  | change.  */ | 
|  | extern observable<> gdb_datadir_changed; | 
|  |  | 
|  | /* An inferior function at ADDRESS is about to be called in thread | 
|  | THREAD.  */ | 
|  | extern observable<ptid_t /* thread */, CORE_ADDR /* address */> | 
|  | inferior_call_pre; | 
|  |  | 
|  | /* The inferior function at ADDRESS has just been called.  This | 
|  | observer is called even if the inferior exits during the call. | 
|  | THREAD is the thread in which the function was called, which may | 
|  | be different from the current thread.  */ | 
|  | extern observable<ptid_t /* thread */, CORE_ADDR /* address */> | 
|  | inferior_call_post; | 
|  |  | 
|  | /* A register in the inferior has been modified by the gdb user.  */ | 
|  | extern observable<const frame_info_ptr &/* frame */, int /* regnum */> | 
|  | register_changed; | 
|  |  | 
|  | /* The user-selected inferior, thread and/or frame has changed.  The | 
|  | user_select_what flag specifies if the inferior, thread and/or | 
|  | frame has changed.  */ | 
|  | extern observable<user_selected_what /* selection */> | 
|  | user_selected_context_changed; | 
|  |  | 
|  | /* This is notified when a styling setting has changed, content may need | 
|  | to be updated based on the new settings.  */ | 
|  | extern observable<> styling_changed; | 
|  |  | 
|  | /* The CLI's notion of the current source has changed.  This differs | 
|  | from user_selected_context_changed in that it is also set by the | 
|  | "list" command.  */ | 
|  | extern observable<> current_source_symtab_and_line_changed; | 
|  |  | 
|  | /* Called when GDB is about to exit.  */ | 
|  | extern observable<int> gdb_exiting; | 
|  |  | 
|  | /* When a connection is removed.  */ | 
|  | extern observable<process_stratum_target */* target */> connection_removed; | 
|  |  | 
|  | /* About to enter target_wait (). */ | 
|  | extern observable <ptid_t /* ptid */> target_pre_wait; | 
|  |  | 
|  | /* About to leave target_wait (). */ | 
|  | extern observable <ptid_t /* event_ptid */> target_post_wait; | 
|  |  | 
|  | /* New program space PSPACE was created.  */ | 
|  | extern observable <program_space */* pspace */> new_program_space; | 
|  |  | 
|  | /* The program space PSPACE is about to be deleted.  */ | 
|  | extern observable <program_space */* pspace */> free_program_space; | 
|  |  | 
|  | extern observable<bool /* enabled */> tui_enabled; | 
|  |  | 
|  | } /* namespace observers */ | 
|  |  | 
|  | } /* namespace gdb */ | 
|  |  | 
|  | #endif /* GDB_OBSERVABLE_H */ |