| /* 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; | |
| /* The core file loaded into the program space inferior INF has changed. | |
| The process of changing has completed, i.e. when unloading, the unload | |
| is now complete. When loading a new core file, the load is complete, | |
| shared libraries have been loaded, registers and threads read in, etc. */ | |
| extern observable<inferior */* inf */> core_file_changed; | |
| } /* namespace observers */ | |
| } /* namespace gdb */ | |
| #endif /* GDB_OBSERVABLE_H */ |