|  | /* Observers | 
|  |  | 
|  | Copyright (C) 2016-2023 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 OBSERVABLE_H | 
|  | #define OBSERVABLE_H | 
|  |  | 
|  | #include "gdbsupport/observable.h" | 
|  | #include "target/waitstatus.h" | 
|  |  | 
|  | struct bpstat; | 
|  | struct so_list; | 
|  | struct objfile; | 
|  | struct thread_info; | 
|  | struct inferior; | 
|  | struct process_stratum_target; | 
|  | struct target_ops; | 
|  | struct trace_state_variable; | 
|  |  | 
|  | 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 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).  */ | 
|  | extern observable<> 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<struct so_list */* solib */> solib_loaded; | 
|  |  | 
|  | /* The shared library specified by SOLIB has been unloaded.  Note | 
|  | that when gdb calls this observer, the library's symbols have not | 
|  | been unloaded yet, and thus are still available.  */ | 
|  | extern observable<struct so_list */* solib */> solib_unloaded; | 
|  |  | 
|  | /* The symbol file specified by OBJFILE has been loaded.  Called | 
|  | with OBJFILE equal to NULL to indicate previously loaded symbol | 
|  | table data has now been invalidated.  */ | 
|  | extern observable<struct objfile */* objfile */> new_objfile; | 
|  |  | 
|  | /* 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.  The SILENT argument | 
|  | indicates that gdb is removing the thread from its tables without | 
|  | wanting to notify the user about it.  */ | 
|  | extern observable<struct thread_info */* t */, int /* silent */> thread_exit; | 
|  |  | 
|  | /* 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; | 
|  |  | 
|  | /* The current architecture has changed.  The argument NEWARCH is a | 
|  | pointer to the new architecture.  */ | 
|  | extern observable<struct gdbarch */* newarch */> architecture_changed; | 
|  |  | 
|  | /* 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; | 
|  |  | 
|  | /* 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<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; | 
|  |  | 
|  | } /* namespace observers */ | 
|  |  | 
|  | } /* namespace gdb */ | 
|  |  | 
|  | #endif /* OBSERVABLE_H */ |