diff options
author | Tom Tromey <tom@tromey.com> | 2016-10-02 10:50:20 -0600 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2018-03-19 09:37:49 -0600 |
commit | 76727919ceb590f03ff0f6db08b7ceab5b7aeaff (patch) | |
tree | bf78b72a63f09f3d2c619048b15d73c5f343e806 /gdb/observable.h | |
parent | 194ed4130dadb7dd1668f6af87405bdcd8041199 (diff) | |
download | binutils-76727919ceb590f03ff0f6db08b7ceab5b7aeaff.zip binutils-76727919ceb590f03ff0f6db08b7ceab5b7aeaff.tar.gz binutils-76727919ceb590f03ff0f6db08b7ceab5b7aeaff.tar.bz2 |
Convert observers to C++
This converts observers from using a special source-generating script
to be plain C++. This version of the patch takes advantage of C++11
by using std::function and variadic templates; incorporates Pedro's
patches; and renames the header file to "observable.h" (this change
eliminates the need for a clean rebuild).
Note that Pedro's patches used a template lambda in tui-hooks.c, but
this failed to compile on some buildbot instances (presumably due to
differing C++ versions); I replaced this with an ordinary template
function.
Regression tested on the buildbot.
gdb/ChangeLog
2018-03-19 Pedro Alves <palves@redhat.com>
Tom Tromey <tom@tromey.com>
* unittests/observable-selftests.c: New file.
* common/observable.h: New file.
* observable.h: New file.
* ada-lang.c, ada-tasks.c, agent.c, aix-thread.c, annotate.c,
arm-tdep.c, auto-load.c, auxv.c, break-catch-syscall.c,
breakpoint.c, bsd-uthread.c, cli/cli-interp.c, cli/cli-setshow.c,
corefile.c, dummy-frame.c, event-loop.c, event-top.c, exec.c,
extension.c, frame.c, gdbarch.c, guile/scm-breakpoint.c,
infcall.c, infcmd.c, inferior.c, inflow.c, infrun.c, jit.c,
linux-tdep.c, linux-thread-db.c, m68klinux-tdep.c,
mi/mi-cmd-break.c, mi/mi-interp.c, mi/mi-main.c, objfiles.c,
ppc-linux-nat.c, ppc-linux-tdep.c, printcmd.c, procfs.c,
python/py-breakpoint.c, python/py-finishbreakpoint.c,
python/py-inferior.c, python/py-unwind.c, ravenscar-thread.c,
record-btrace.c, record-full.c, record.c, regcache.c, remote.c,
riscv-tdep.c, sol-thread.c, solib-aix.c, solib-spu.c, solib.c,
spu-multiarch.c, spu-tdep.c, stack.c, symfile-mem.c, symfile.c,
symtab.c, thread.c, top.c, tracepoint.c, tui/tui-hooks.c,
tui/tui-interp.c, valops.c: Update all users.
* tui/tui-hooks.c (tui_bp_created_observer)
(tui_bp_deleted_observer, tui_bp_modified_observer)
(tui_inferior_exit_observer, tui_before_prompt_observer)
(tui_normal_stop_observer, tui_register_changed_observer):
Remove.
(tui_observers_token): New global.
(attach_or_detach, tui_attach_detach_observers): New functions.
(tui_install_hooks, tui_remove_hooks): Use
tui_attach_detach_observers.
* record-btrace.c (record_btrace_thread_observer): Remove.
(record_btrace_thread_observer_token): New global.
* observer.sh: Remove.
* observer.c: Rename to observable.c.
* observable.c (namespace gdb_observers): Define new objects.
(observer_debug): Move into gdb_observers namespace.
(struct observer, struct observer_list, xalloc_observer_list_node)
(xfree_observer_list_node, generic_observer_attach)
(generic_observer_detach, generic_observer_notify): Remove.
(_initialize_observer): Update.
Don't include observer.inc.
* Makefile.in (generated_files): Remove observer.h, observer.inc.
(clean mostlyclean): Likewise.
(observer.h, observer.inc): Remove targets.
(SUBDIR_UNITTESTS_SRCS): Add observable-selftests.c.
(COMMON_SFILES): Use observable.c, not observer.c.
* .gitignore: Remove observer.h.
gdb/doc/ChangeLog
2018-03-19 Tom Tromey <tom@tromey.com>
* observer.texi: Remove.
gdb/testsuite/ChangeLog
2018-03-19 Tom Tromey <tom@tromey.com>
* gdb.gdb/observer.exp: Remove.
Diffstat (limited to 'gdb/observable.h')
-rw-r--r-- | gdb/observable.h | 235 |
1 files changed, 235 insertions, 0 deletions
diff --git a/gdb/observable.h b/gdb/observable.h new file mode 100644 index 0000000..34447b9 --- /dev/null +++ b/gdb/observable.h @@ -0,0 +1,235 @@ +/* Observers + + Copyright (C) 2016-2018 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/>. */ + +#if !defined (GDB_OBSERVER_H) +#define GDB_OBSERVER_H + +#include "common/observable.h" + +struct bpstats; +struct so_list; +struct objfile; +struct thread_info; +struct inferior; +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 bpstats *, int> normal_stop; + +/* The inferior was stopped by a signal. */ +extern observable<enum gdb_signal> signal_received; + +/* We are done with a step/next/si/ni command. */ +extern observable<> end_stepping_range; + +/* The inferior was terminated by a signal. */ +extern observable<enum gdb_signal> signal_exited; + +/* The inferior program is finished. */ +extern observable<int> exited; + +/* Reverse execution: target ran out of history info. */ +extern observable<> no_history; + +/* A synchronous command finished. */ +extern observable<> sync_execution_done; + +/* An error was caught while executing a command. */ +extern observable<> command_error; + +/* The target's register contents have changed. */ +extern observable<struct target_ops *> 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<struct target_ops *, int> inferior_created; + +/* The status of process record for inferior inferior in gdb has + changed. The process record is started if started is true, and + the process record is stopped if started is false. + + When started is true, method indicates the short name of the + method used for recording. If the method supports multiple + formats, format indicates which one is being used, otherwise it + is NULL. When started is false, they are both NULL. */ +extern observable<struct inferior *, int, const char *, const char *> + record_changed; + +/* 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_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_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 *> new_objfile; + +/* The object file specified by objfile is about to be freed. */ +extern observable<struct objfile *> free_objfile; + +/* The thread specified by t has been created. */ +extern observable<struct thread_info *> 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 *, int> 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> 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> 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 *> breakpoint_created; + +/* A breakpoint has been destroyed. The argument b is the + pointer to the destroyed breakpoint. */ +extern observable<struct breakpoint *> breakpoint_deleted; + +/* A breakpoint has been modified in some way. The argument b + is the modified breakpoint. */ +extern observable<struct breakpoint *> 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, int> traceframe_changed; + +/* The current architecture has changed. The argument newarch is a + pointer to the new architecture. */ +extern observable<struct gdbarch *> 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<ptid_t, ptid_t> 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 *> inferior_added; + +/* The inferior identified by inf has been attached to a + process. */ +extern observable<struct inferior *> inferior_appeared; + +/* Either the inferior associated with inf has been detached from + the process, or the process has exited. */ +extern observable<struct inferior *> 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 *> inferior_removed; + +/* Bytes from data to data + len have been written to the inferior + at addr. */ +extern observable<struct inferior *, CORE_ADDR, ssize_t, const bfd_byte *> + memory_changed; + +/* Called before a top-level prompt is displayed. current_prompt is + the current top-level prompt. */ +extern observable<const char *> before_prompt; + +/* Variable gdb_datadir has been set. The value may not necessarily + change. */ +extern observable<> gdb_datadir_changed; + +/* The parameter of some 'set' commands in console are changed. + This method is called after a command 'set param value'. param + is the parameter of 'set' command, and value is the value of + changed parameter. */ +extern observable<const char *, const char *> command_param_changed; + +/* The new trace state variable tsv is created. */ +extern observable<const struct trace_state_variable *> tsv_created; + +/* The trace state variable tsv is deleted. If tsv is NULL, all + trace state variables are deleted. */ +extern observable<const struct trace_state_variable *> tsv_deleted; + +/* The trace state value tsv is modified. */ +extern observable<const struct trace_state_variable *> tsv_modified; + +/* An inferior function at address is about to be called in thread + thread. */ +extern observable<ptid_t, CORE_ADDR> 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, CORE_ADDR> inferior_call_post; + +/* A register in the inferior has been modified by the gdb user. */ +extern observable<struct frame_info *, int> 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> user_selected_context_changed; + +} /* namespace observers */ + +} /* namespace gdb */ + +#endif /* GDB_OBSERVER_H */ |