* [RFA 3/4] Update all observer uses
2016-10-03 4:22 [RFA 0/4] Conver observers to C++ Tom Tromey
2016-10-03 4:22 ` [RFA 2/4] Change types to match observer.attach Tom Tromey
2016-10-03 4:22 ` [RFA 4/4] Change observer tests to use selftest framework Tom Tromey
@ 2016-10-03 4:22 ` Tom Tromey
2016-10-03 4:22 ` [RFA 1/4] Convert observers to C++ Tom Tromey
3 siblings, 0 replies; 6+ messages in thread
From: Tom Tromey @ 2016-10-03 4:22 UTC (permalink / raw)
To: gdb-patches; +Cc: Tom Tromey
This updates all the uses of observers to the new API.
This patch was generated using this perl script:
perl -pi~ -e 's/observer_(attach|notify|detach)_([a-z_]+)/gdb_observers::\2.\1/g;' \
*.[chyl] */*.[chyl]
2016-10-02 Tom Tromey <tom@tromey.com>
* 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, 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, sol-thread.c,
solib-aix.c, solib-spu.c, solib.c, spu-multiarch.c, spu-tdep.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.
---
gdb/ChangeLog | 16 ++++++++++++
gdb/ada-lang.c | 6 ++---
gdb/ada-tasks.c | 4 +--
gdb/agent.c | 2 +-
gdb/aix-thread.c | 4 +--
gdb/annotate.c | 6 ++---
gdb/arm-tdep.c | 2 +-
gdb/auto-load.c | 4 +--
gdb/auxv.c | 6 ++---
gdb/break-catch-syscall.c | 2 +-
gdb/breakpoint.c | 50 ++++++++++++++++++-------------------
gdb/bsd-uthread.c | 6 ++---
gdb/cli/cli-interp.c | 16 ++++++------
gdb/cli/cli-setshow.c | 10 ++++----
gdb/corefile.c | 2 +-
gdb/dummy-frame.c | 2 +-
gdb/event-loop.c | 2 +-
gdb/event-top.c | 2 +-
gdb/exec.c | 2 +-
gdb/extension.c | 2 +-
gdb/frame.c | 2 +-
gdb/gdbarch.c | 2 +-
gdb/guile/scm-breakpoint.c | 4 +--
gdb/infcall.c | 4 +--
gdb/infcmd.c | 2 +-
gdb/inferior.c | 8 +++---
gdb/inflow.c | 2 +-
gdb/infrun.c | 26 +++++++++----------
gdb/jit.c | 6 ++---
gdb/linux-tdep.c | 4 +--
gdb/linux-thread-db.c | 6 ++---
gdb/m68klinux-tdep.c | 2 +-
gdb/mi/mi-cmd-break.c | 4 +--
gdb/mi/mi-interp.c | 54 ++++++++++++++++++++--------------------
gdb/objfiles.c | 2 +-
gdb/ppc-linux-nat.c | 2 +-
gdb/ppc-linux-tdep.c | 6 ++---
gdb/printcmd.c | 2 +-
gdb/procfs.c | 2 +-
gdb/python/py-breakpoint.c | 6 ++---
gdb/python/py-finishbreakpoint.c | 4 +--
gdb/python/py-inferior.c | 20 +++++++--------
gdb/python/py-unwind.c | 2 +-
gdb/ravenscar-thread.c | 2 +-
gdb/record-btrace.c | 6 ++---
gdb/record-full.c | 2 +-
gdb/record.c | 2 +-
gdb/regcache.c | 4 +--
gdb/remote.c | 8 +++---
gdb/sol-thread.c | 2 +-
gdb/solib-aix.c | 2 +-
gdb/solib-spu.c | 2 +-
gdb/solib.c | 8 +++---
gdb/spu-multiarch.c | 6 ++---
gdb/spu-tdep.c | 6 ++---
gdb/symfile-mem.c | 2 +-
gdb/symfile.c | 14 +++++------
gdb/symtab.c | 6 ++---
gdb/thread.c | 18 +++++++-------
gdb/top.c | 2 +-
gdb/tracepoint.c | 16 ++++++------
gdb/tui/tui-hooks.c | 30 +++++++++++-----------
gdb/tui/tui-interp.c | 16 ++++++------
gdb/valops.c | 4 +--
64 files changed, 246 insertions(+), 230 deletions(-)
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 8265310..fb84728 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,21 @@
2016-10-02 Tom Tromey <tom@tromey.com>
+ * 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, 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, sol-thread.c,
+ solib-aix.c, solib-spu.c, solib.c, spu-multiarch.c, spu-tdep.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)
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index be2f47a..782db36 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -14314,9 +14314,9 @@ DWARF attribute."),
NULL, xcalloc, xfree);
/* The ada-lang observers. */
- observer_attach_new_objfile (ada_new_objfile_observer);
- observer_attach_free_objfile (ada_free_objfile_observer);
- observer_attach_inferior_exit (ada_inferior_exit);
+ gdb_observers::new_objfile.attach (ada_new_objfile_observer);
+ gdb_observers::free_objfile.attach (ada_free_objfile_observer);
+ gdb_observers::inferior_exit.attach (ada_inferior_exit);
/* Setup various context-specific data. */
ada_inferior_data
diff --git a/gdb/ada-tasks.c b/gdb/ada-tasks.c
index c067ae6..78425e3 100644
--- a/gdb/ada-tasks.c
+++ b/gdb/ada-tasks.c
@@ -1441,8 +1441,8 @@ _initialize_tasks (void)
ada_tasks_inferior_data_handle = register_inferior_data ();
/* Attach various observers. */
- observer_attach_normal_stop (ada_tasks_normal_stop_observer);
- observer_attach_new_objfile (ada_tasks_new_objfile_observer);
+ gdb_observers::normal_stop.attach (ada_tasks_normal_stop_observer);
+ gdb_observers::new_objfile.attach (ada_tasks_new_objfile_observer);
/* Some new commands provided by this module. */
add_info ("tasks", info_tasks_command,
diff --git a/gdb/agent.c b/gdb/agent.c
index 8899b77..7bc8cce 100644
--- a/gdb/agent.c
+++ b/gdb/agent.c
@@ -69,7 +69,7 @@ agent_new_objfile (struct objfile *objfile)
void
_initialize_agent (void)
{
- observer_attach_new_objfile (agent_new_objfile);
+ gdb_observers::new_objfile.attach (agent_new_objfile);
add_setshow_enum_cmd ("agent", class_run,
can_use_agent_enum,
diff --git a/gdb/aix-thread.c b/gdb/aix-thread.c
index 693d6f6..b7d08a6 100644
--- a/gdb/aix-thread.c
+++ b/gdb/aix-thread.c
@@ -1845,11 +1845,11 @@ _initialize_aix_thread (void)
complete_target_initialization (&aix_thread_ops);
/* Notice when object files get loaded and unloaded. */
- observer_attach_new_objfile (new_objfile);
+ gdb_observers::new_objfile.attach (new_objfile);
/* Add ourselves to inferior_created event chain.
This is needed to enable the thread target on "attach". */
- observer_attach_inferior_created (aix_thread_inferior_created);
+ gdb_observers::inferior_created.attach (aix_thread_inferior_created);
add_setshow_boolean_cmd ("aix-thread", class_maintenance, &debug_aix_thread,
_("Set debugging of AIX thread module."),
diff --git a/gdb/annotate.c b/gdb/annotate.c
index 64175a4..d4864ba 100644
--- a/gdb/annotate.c
+++ b/gdb/annotate.c
@@ -594,7 +594,7 @@ breakpoint_changed (struct breakpoint *b)
void
_initialize_annotate (void)
{
- observer_attach_breakpoint_created (breakpoint_changed);
- observer_attach_breakpoint_deleted (breakpoint_changed);
- observer_attach_breakpoint_modified (breakpoint_changed);
+ gdb_observers::breakpoint_created.attach (breakpoint_changed);
+ gdb_observers::breakpoint_deleted.attach (breakpoint_changed);
+ gdb_observers::breakpoint_modified.attach (breakpoint_changed);
}
diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c
index a07d93b..14e2193 100644
--- a/gdb/arm-tdep.c
+++ b/gdb/arm-tdep.c
@@ -9568,7 +9568,7 @@ _initialize_arm_tdep (void)
= register_objfile_data_with_cleanup (NULL, arm_objfile_data_free);
/* Add ourselves to objfile event chain. */
- observer_attach_new_objfile (arm_exidx_new_objfile);
+ gdb_observers::new_objfile.attach (arm_exidx_new_objfile);
arm_exidx_data_key
= register_objfile_data_with_cleanup (NULL, arm_exidx_data_free);
diff --git a/gdb/auto-load.c b/gdb/auto-load.c
index de64112..c0fc9ee 100644
--- a/gdb/auto-load.c
+++ b/gdb/auto-load.c
@@ -1615,7 +1615,7 @@ _initialize_auto_load (void)
= register_program_space_data_with_cleanup (NULL,
auto_load_pspace_data_cleanup);
- observer_attach_new_objfile (auto_load_new_objfile);
+ gdb_observers::new_objfile.attach (auto_load_new_objfile);
add_setshow_boolean_cmd ("gdb-scripts", class_support,
&auto_load_gdb_scripts, _("\
@@ -1725,7 +1725,7 @@ This options has security implications for untrusted inferiors."),
show_auto_load_safe_path,
auto_load_set_cmdlist_get (),
auto_load_show_cmdlist_get ());
- observer_attach_gdb_datadir_changed (auto_load_gdb_datadir_changed);
+ gdb_observers::gdb_datadir_changed.attach (auto_load_gdb_datadir_changed);
cmd = add_cmd ("add-auto-load-safe-path", class_support,
add_auto_load_safe_path,
diff --git a/gdb/auxv.c b/gdb/auxv.c
index de9205d..6f2d882 100644
--- a/gdb/auxv.c
+++ b/gdb/auxv.c
@@ -582,7 +582,7 @@ This is information provided by the operating system at program startup."));
= register_inferior_data_with_cleanup (NULL, auxv_inferior_data_cleanup);
/* Observers used to invalidate the auxv cache when needed. */
- observer_attach_inferior_exit (invalidate_auxv_cache_inf);
- observer_attach_inferior_appeared (invalidate_auxv_cache_inf);
- observer_attach_executable_changed (invalidate_auxv_cache);
+ gdb_observers::inferior_exit.attach (invalidate_auxv_cache_inf);
+ gdb_observers::inferior_appeared.attach (invalidate_auxv_cache_inf);
+ gdb_observers::executable_changed.attach (invalidate_auxv_cache);
}
diff --git a/gdb/break-catch-syscall.c b/gdb/break-catch-syscall.c
index 63b8cd2..de4d2f0 100644
--- a/gdb/break-catch-syscall.c
+++ b/gdb/break-catch-syscall.c
@@ -718,7 +718,7 @@ _initialize_break_catch_syscall (void)
{
initialize_syscall_catchpoint_ops ();
- observer_attach_inferior_exit (clear_syscall_counts);
+ gdb_observers::inferior_exit.attach (clear_syscall_counts);
catch_syscall_inferior_data
= register_inferior_data_with_cleanup (NULL,
catch_syscall_inferior_data_cleanup);
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index 1e05932..fbbe7d1 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -1040,7 +1040,7 @@ set_breakpoint_condition (struct breakpoint *b, const char *exp,
}
mark_breakpoint_modified (b);
- observer_notify_breakpoint_modified (b);
+ gdb_observers::breakpoint_modified.notify (b);
}
/* Completion for the "condition" command. */
@@ -1278,7 +1278,7 @@ breakpoint_set_commands (struct breakpoint *b,
decref_counted_command_line (&b->commands);
b->commands = alloc_counted_command_line (commands);
- observer_notify_breakpoint_modified (b);
+ gdb_observers::breakpoint_modified.notify (b);
}
/* Set the internal `silent' flag on the breakpoint. Note that this
@@ -1292,7 +1292,7 @@ breakpoint_set_silent (struct breakpoint *b, int silent)
b->silent = silent;
if (old_silent != silent)
- observer_notify_breakpoint_modified (b);
+ gdb_observers::breakpoint_modified.notify (b);
}
/* Set the thread for this breakpoint. If THREAD is -1, make the
@@ -1305,7 +1305,7 @@ breakpoint_set_thread (struct breakpoint *b, int thread)
b->thread = thread;
if (old_thread != thread)
- observer_notify_breakpoint_modified (b);
+ gdb_observers::breakpoint_modified.notify (b);
}
/* Set the task for this breakpoint. If TASK is 0, make the
@@ -1318,7 +1318,7 @@ breakpoint_set_task (struct breakpoint *b, int task)
b->task = task;
if (old_task != task)
- observer_notify_breakpoint_modified (b);
+ gdb_observers::breakpoint_modified.notify (b);
}
void
@@ -1394,7 +1394,7 @@ do_map_commands_command (struct breakpoint *b, void *data)
incref_counted_command_line (info->cmd);
decref_counted_command_line (&b->commands);
b->commands = info->cmd;
- observer_notify_breakpoint_modified (b);
+ gdb_observers::breakpoint_modified.notify (b);
}
}
@@ -2828,7 +2828,7 @@ insert_bp_location (struct bp_location *bl,
{
/* See also: disable_breakpoints_in_shlibs. */
bl->shlib_disabled = 1;
- observer_notify_breakpoint_modified (bl->owner);
+ gdb_observers::breakpoint_modified.notify (bl->owner);
if (!*disabled_breaks)
{
fprintf_unfiltered (tmp_error_stream,
@@ -5593,7 +5593,7 @@ bpstat_check_breakpoint_conditions (bpstat bs, ptid_t ptid)
bs->stop = 0;
/* Increase the hit count even though we don't stop. */
++(b->hit_count);
- observer_notify_breakpoint_modified (b);
+ gdb_observers::breakpoint_modified.notify (b);
}
}
@@ -5748,7 +5748,7 @@ bpstat_stop_status (struct address_space *aspace,
if (bs->stop)
{
++(b->hit_count);
- observer_notify_breakpoint_modified (b);
+ gdb_observers::breakpoint_modified.notify (b);
/* We will stop here. */
if (b->disposition == disp_disable)
@@ -7991,7 +7991,7 @@ disable_breakpoints_in_unloaded_shlib (struct so_list *solib)
loc->inserted = 0;
/* This may cause duplicate notifications for the same breakpoint. */
- observer_notify_breakpoint_modified (b);
+ gdb_observers::breakpoint_modified.notify (b);
if (!disabled_shlib_breaks)
{
@@ -8074,7 +8074,7 @@ disable_breakpoints_in_freed_objfile (struct objfile *objfile)
}
if (bp_modified)
- observer_notify_breakpoint_modified (b);
+ gdb_observers::breakpoint_modified.notify (b);
}
}
@@ -8642,7 +8642,7 @@ install_breakpoint (int internal, struct breakpoint *b, int update_gll)
set_tracepoint_count (breakpoint_count);
if (!internal)
mention (b);
- observer_notify_breakpoint_created (b);
+ gdb_observers::breakpoint_created.notify (b);
if (update_gll)
update_global_location_list (UGLL_MAY_INSERT);
@@ -10526,7 +10526,7 @@ break_range_command (char *arg, int from_tty)
do_cleanups (cleanup_bkpt);
mention (b);
- observer_notify_breakpoint_created (b);
+ gdb_observers::breakpoint_created.notify (b);
update_global_location_list (UGLL_MAY_INSERT);
}
@@ -12340,7 +12340,7 @@ download_tracepoint_locations (void)
t = (struct tracepoint *) b;
t->number_on_target = b->number;
if (bp_location_downloaded)
- observer_notify_breakpoint_modified (b);
+ gdb_observers::breakpoint_modified.notify (b);
}
do_cleanups (old_chain);
@@ -13898,7 +13898,7 @@ delete_breakpoint (struct breakpoint *bpt)
a problem in that process, we'll be asked to delete the half-created
watchpoint. In that case, don't announce the deletion. */
if (bpt->number)
- observer_notify_breakpoint_deleted (bpt);
+ gdb_observers::breakpoint_deleted.notify (bpt);
if (breakpoint_chain == bpt)
breakpoint_chain = bpt->next;
@@ -14406,7 +14406,7 @@ update_breakpoint_locations (struct breakpoint *b,
}
if (!locations_are_equal (existing_locations, b->loc))
- observer_notify_breakpoint_modified (b);
+ gdb_observers::breakpoint_modified.notify (b);
}
/* Find the SaL locations corresponding to the given LOCATION.
@@ -14734,7 +14734,7 @@ set_ignore_count (int bptnum, int count, int from_tty)
"crossings of breakpoint %d."),
count, bptnum);
}
- observer_notify_breakpoint_modified (b);
+ gdb_observers::breakpoint_modified.notify (b);
return;
}
@@ -14880,7 +14880,7 @@ disable_breakpoint (struct breakpoint *bpt)
update_global_location_list (UGLL_DONT_INSERT);
- observer_notify_breakpoint_modified (bpt);
+ gdb_observers::breakpoint_modified.notify (bpt);
}
/* A callback for iterate_over_related_breakpoints. */
@@ -15002,7 +15002,7 @@ enable_breakpoint_disp (struct breakpoint *bpt, enum bpdisp disposition,
bpt->enable_count = count;
update_global_location_list (UGLL_MAY_INSERT);
- observer_notify_breakpoint_modified (bpt);
+ gdb_observers::breakpoint_modified.notify (bpt);
}
@@ -15537,7 +15537,7 @@ static void
trace_pass_set_count (struct tracepoint *tp, int count, int from_tty)
{
tp->pass_count = count;
- observer_notify_breakpoint_modified (&tp->base);
+ gdb_observers::breakpoint_modified.notify (&tp->base);
if (from_tty)
printf_filtered (_("Setting tracepoint %d's passcount to %d\n"),
tp->base.number, count);
@@ -16183,9 +16183,9 @@ _initialize_breakpoint (void)
initialize_breakpoint_ops ();
- observer_attach_solib_unloaded (disable_breakpoints_in_unloaded_shlib);
- observer_attach_free_objfile (disable_breakpoints_in_freed_objfile);
- observer_attach_memory_changed (invalidate_bp_value_on_memory_change);
+ gdb_observers::solib_unloaded.attach (disable_breakpoints_in_unloaded_shlib);
+ gdb_observers::free_objfile.attach (disable_breakpoints_in_freed_objfile);
+ gdb_observers::memory_changed.attach (invalidate_bp_value_on_memory_change);
breakpoint_objfile_key
= register_objfile_data_with_cleanup (NULL, free_breakpoint_probes);
@@ -16734,6 +16734,6 @@ agent-printf \"printf format string\", arg1, arg2, arg3, ..., argn\n\
automatic_hardware_breakpoints = 1;
- observer_attach_about_to_proceed (breakpoint_about_to_proceed);
- observer_attach_thread_exit (remove_threaded_breakpoints);
+ gdb_observers::about_to_proceed.attach (breakpoint_about_to_proceed);
+ gdb_observers::thread_exit.attach (remove_threaded_breakpoints);
}
diff --git a/gdb/bsd-uthread.c b/gdb/bsd-uthread.c
index 4ce0a6c..dba0b3b 100644
--- a/gdb/bsd-uthread.c
+++ b/gdb/bsd-uthread.c
@@ -545,7 +545,7 @@ _initialize_bsd_uthread (void)
bsd_uthread_data = gdbarch_data_register_pre_init (bsd_uthread_init);
- observer_attach_inferior_created (bsd_uthread_inferior_created);
- observer_attach_solib_loaded (bsd_uthread_solib_loaded);
- observer_attach_solib_unloaded (bsd_uthread_solib_unloaded);
+ gdb_observers::inferior_created.attach (bsd_uthread_inferior_created);
+ gdb_observers::solib_loaded.attach (bsd_uthread_solib_loaded);
+ gdb_observers::solib_unloaded.attach (bsd_uthread_solib_unloaded);
}
diff --git a/gdb/cli/cli-interp.c b/gdb/cli/cli-interp.c
index 5d67ba4..7185519 100644
--- a/gdb/cli/cli-interp.c
+++ b/gdb/cli/cli-interp.c
@@ -385,12 +385,12 @@ _initialize_cli_interp (void)
interp_factory_register (INTERP_CONSOLE, cli_interp_factory);
/* If changing this, remember to update tui-interp.c as well. */
- observer_attach_normal_stop (cli_on_normal_stop);
- observer_attach_end_stepping_range (cli_on_end_stepping_range);
- observer_attach_signal_received (cli_on_signal_received);
- observer_attach_signal_exited (cli_on_signal_exited);
- observer_attach_exited (cli_on_exited);
- observer_attach_no_history (cli_on_no_history);
- observer_attach_sync_execution_done (cli_on_sync_execution_done);
- observer_attach_command_error (cli_on_command_error);
+ gdb_observers::normal_stop.attach (cli_on_normal_stop);
+ gdb_observers::end_stepping_range.attach (cli_on_end_stepping_range);
+ gdb_observers::signal_received.attach (cli_on_signal_received);
+ gdb_observers::signal_exited.attach (cli_on_signal_exited);
+ gdb_observers::exited.attach (cli_on_exited);
+ gdb_observers::no_history.attach (cli_on_no_history);
+ gdb_observers::sync_execution_done.attach (cli_on_sync_execution_done);
+ gdb_observers::command_error.attach (cli_on_command_error);
}
diff --git a/gdb/cli/cli-setshow.c b/gdb/cli/cli-setshow.c
index eb17158..988fd4c 100644
--- a/gdb/cli/cli-setshow.c
+++ b/gdb/cli/cli-setshow.c
@@ -519,20 +519,20 @@ do_set_command (const char *arg, int from_tty, struct cmd_list_element *c)
case var_filename:
case var_optional_filename:
case var_enum:
- observer_notify_command_param_changed (name, *(char **) c->var);
+ gdb_observers::command_param_changed.notify (name, *(char **) c->var);
break;
case var_boolean:
{
const char *opt = *(int *) c->var ? "on" : "off";
- observer_notify_command_param_changed (name, opt);
+ gdb_observers::command_param_changed.notify (name, opt);
}
break;
case var_auto_boolean:
{
const char *s = auto_boolean_enums[*(enum auto_boolean *) c->var];
- observer_notify_command_param_changed (name, s);
+ gdb_observers::command_param_changed.notify (name, s);
}
break;
case var_uinteger:
@@ -541,7 +541,7 @@ do_set_command (const char *arg, int from_tty, struct cmd_list_element *c)
char s[64];
xsnprintf (s, sizeof s, "%u", *(unsigned int *) c->var);
- observer_notify_command_param_changed (name, s);
+ gdb_observers::command_param_changed.notify (name, s);
}
break;
case var_integer:
@@ -551,7 +551,7 @@ do_set_command (const char *arg, int from_tty, struct cmd_list_element *c)
char s[64];
xsnprintf (s, sizeof s, "%d", *(int *) c->var);
- observer_notify_command_param_changed (name, s);
+ gdb_observers::command_param_changed.notify (name, s);
}
break;
}
diff --git a/gdb/corefile.c b/gdb/corefile.c
index 64de931..2c97e21 100644
--- a/gdb/corefile.c
+++ b/gdb/corefile.c
@@ -421,7 +421,7 @@ write_memory_with_notification (CORE_ADDR memaddr, const bfd_byte *myaddr,
ssize_t len)
{
write_memory (memaddr, myaddr, len);
- observer_notify_memory_changed (current_inferior (), memaddr, len, myaddr);
+ gdb_observers::memory_changed.notify (current_inferior (), memaddr, len, myaddr);
}
/* Store VALUE at ADDR in the inferior as a LEN-byte unsigned
diff --git a/gdb/dummy-frame.c b/gdb/dummy-frame.c
index 606fb85..ef16c71 100644
--- a/gdb/dummy-frame.c
+++ b/gdb/dummy-frame.c
@@ -429,5 +429,5 @@ _initialize_dummy_frame (void)
_("Print the contents of the internal dummy-frame stack."),
&maintenanceprintlist);
- observer_attach_inferior_created (cleanup_dummy_frames);
+ gdb_observers::inferior_created.attach (cleanup_dummy_frames);
}
diff --git a/gdb/event-loop.c b/gdb/event-loop.c
index f94a6fa..eb5efa3 100644
--- a/gdb/event-loop.c
+++ b/gdb/event-loop.c
@@ -382,7 +382,7 @@ start_event_loop (void)
get around to resetting the prompt, which leaves readline
in a messed-up state. Reset it here. */
current_ui->prompt_state = PROMPT_NEEDED;
- observer_notify_command_error ();
+ gdb_observers::command_error.notify ();
/* This call looks bizarre, but it is required. If the user
entered a command that caused an error,
after_char_processing_hook won't be called from
diff --git a/gdb/event-top.c b/gdb/event-top.c
index 576eded..e20b363 100644
--- a/gdb/event-top.c
+++ b/gdb/event-top.c
@@ -422,7 +422,7 @@ top_level_prompt (void)
/* Give observers a chance of changing the prompt. E.g., the python
`gdb.prompt_hook' is installed as an observer. */
- observer_notify_before_prompt (get_prompt ());
+ gdb_observers::before_prompt.notify (get_prompt ());
prompt = get_prompt ();
diff --git a/gdb/exec.c b/gdb/exec.c
index d858e99..c32fb1e 100644
--- a/gdb/exec.c
+++ b/gdb/exec.c
@@ -408,7 +408,7 @@ exec_file_attach (const char *filename, int from_tty)
do_cleanups (cleanups);
bfd_cache_close_all ();
- observer_notify_executable_changed ();
+ gdb_observers::executable_changed.notify ();
}
/* Process the first arg in ARGS as the new exec file.
diff --git a/gdb/extension.c b/gdb/extension.c
index c9f5664..f99445f 100644
--- a/gdb/extension.c
+++ b/gdb/extension.c
@@ -1066,5 +1066,5 @@ extern initialize_file_ftype _initialize_extension;
void
_initialize_extension (void)
{
- observer_attach_before_prompt (ext_lang_before_prompt);
+ gdb_observers::before_prompt.attach (ext_lang_before_prompt);
}
diff --git a/gdb/frame.c b/gdb/frame.c
index d3f3056..50f057d 100644
--- a/gdb/frame.c
+++ b/gdb/frame.c
@@ -2839,7 +2839,7 @@ _initialize_frame (void)
frame_stash_create ();
- observer_attach_target_changed (frame_observer_target_changed);
+ gdb_observers::target_changed.attach (frame_observer_target_changed);
add_prefix_cmd ("backtrace", class_maintenance, set_backtrace_cmd, _("\
Set backtrace specific variables.\n\
diff --git a/gdb/gdbarch.c b/gdb/gdbarch.c
index 4d8ef18..ec01f30 100644
--- a/gdb/gdbarch.c
+++ b/gdb/gdbarch.c
@@ -5298,7 +5298,7 @@ set_target_gdbarch (struct gdbarch *new_gdbarch)
gdb_assert (new_gdbarch != NULL);
gdb_assert (new_gdbarch->initialized_p);
current_inferior ()->gdbarch = new_gdbarch;
- observer_notify_architecture_changed (new_gdbarch);
+ gdb_observers::architecture_changed.notify (new_gdbarch);
registers_changed ();
}
diff --git a/gdb/guile/scm-breakpoint.c b/gdb/guile/scm-breakpoint.c
index baecf01..2da4868 100644
--- a/gdb/guile/scm-breakpoint.c
+++ b/gdb/guile/scm-breakpoint.c
@@ -1337,8 +1337,8 @@ gdbscm_initialize_breakpoints (void)
scm_set_smob_free (breakpoint_smob_tag, bpscm_free_breakpoint_smob);
scm_set_smob_print (breakpoint_smob_tag, bpscm_print_breakpoint_smob);
- observer_attach_breakpoint_created (bpscm_breakpoint_created);
- observer_attach_breakpoint_deleted (bpscm_breakpoint_deleted);
+ gdb_observers::breakpoint_created.attach (bpscm_breakpoint_created);
+ gdb_observers::breakpoint_deleted.attach (bpscm_breakpoint_deleted);
gdbscm_define_integer_constants (breakpoint_integer_constants, 1);
gdbscm_define_functions (breakpoint_functions, 1);
diff --git a/gdb/infcall.c b/gdb/infcall.c
index ab7426d..4dc1f1d 100644
--- a/gdb/infcall.c
+++ b/gdb/infcall.c
@@ -885,7 +885,7 @@ call_function_by_hand_dummy (struct value *function,
target_values_type = values_type;
}
- observer_notify_inferior_call_pre (inferior_ptid, funaddr);
+ gdb_observers::inferior_call_pre.notify (inferior_ptid, funaddr);
/* Determine the location of the breakpoint (and possibly other
stuff) that the called function will return to. The SPARC, for a
@@ -1150,7 +1150,7 @@ call_function_by_hand_dummy (struct value *function,
e = run_inferior_call (sm, tp, real_pc);
- observer_notify_inferior_call_post (call_thread_ptid, funaddr);
+ gdb_observers::inferior_call_post.notify (call_thread_ptid, funaddr);
tp = find_thread_ptid (call_thread_ptid);
if (tp != NULL)
diff --git a/gdb/infcmd.c b/gdb/infcmd.c
index 8e34b7e..4726db4 100644
--- a/gdb/infcmd.c
+++ b/gdb/infcmd.c
@@ -474,7 +474,7 @@ post_create_inferior (struct target_ops *target, int from_tty)
if the now pushed target supports hardware watchpoints. */
breakpoint_re_set ();
- observer_notify_inferior_created (target, from_tty);
+ gdb_observers::inferior_created.notify (target, from_tty);
}
/* Kill the inferior if already running. This function is designed
diff --git a/gdb/inferior.c b/gdb/inferior.c
index 47d91c7..14f61f5 100644
--- a/gdb/inferior.c
+++ b/gdb/inferior.c
@@ -152,7 +152,7 @@ add_inferior_silent (int pid)
inferior_alloc_data (inf);
- observer_notify_inferior_added (inf);
+ gdb_observers::inferior_added.notify (inf);
if (pid != 0)
inferior_appeared (inf, pid);
@@ -219,7 +219,7 @@ delete_inferior (struct inferior *todel)
else
inferior_list = inf->next;
- observer_notify_inferior_removed (inf);
+ gdb_observers::inferior_removed.notify (inf);
/* If this program space is rendered useless, remove it. */
if (program_space_empty_p (inf->pspace))
@@ -249,7 +249,7 @@ exit_inferior_1 (struct inferior *inftoex, int silent)
iterate_over_threads (delete_thread_of_inferior, &arg);
- observer_notify_inferior_exit (inf);
+ gdb_observers::inferior_exit.notify (inf);
inf->pid = 0;
inf->fake_pid_p = 0;
@@ -312,7 +312,7 @@ inferior_appeared (struct inferior *inf, int pid)
inf->has_exit_code = 0;
inf->exit_code = 0;
- observer_notify_inferior_appeared (inf);
+ gdb_observers::inferior_appeared.notify (inf);
}
void
diff --git a/gdb/inflow.c b/gdb/inflow.c
index 5b55cec..527da5e 100644
--- a/gdb/inflow.c
+++ b/gdb/inflow.c
@@ -885,7 +885,7 @@ _initialize_inflow (void)
#endif /* TIOCGPGRP */
#endif /* sgtty */
- observer_attach_inferior_exit (inflow_inferior_exit);
+ gdb_observers::inferior_exit.attach (inflow_inferior_exit);
inflow_inferior_data
= register_inferior_data_with_cleanup (NULL, inflow_inferior_data_cleanup);
diff --git a/gdb/infrun.c b/gdb/infrun.c
index 2636a19..8d08ef8 100644
--- a/gdb/infrun.c
+++ b/gdb/infrun.c
@@ -2902,7 +2902,7 @@ clear_proceed_status (int step)
inferior->control.stop_soon = NO_STOP_QUIETLY;
}
- observer_notify_about_to_proceed ();
+ gdb_observers::about_to_proceed.notify ();
}
/* Returns true if TP is still stopped at a breakpoint that needs
@@ -3847,7 +3847,7 @@ check_curr_ui_sync_execution_done (void)
&& !gdb_in_secondary_prompt_p (ui))
{
target_terminal_ours ();
- observer_notify_sync_execution_done ();
+ gdb_observers::sync_execution_done.notify ();
ui_register_input_event_handler (ui);
}
}
@@ -5099,7 +5099,7 @@ handle_inferior_event_1 (struct execution_control_state *ecs)
/* Support the --return-child-result option. */
return_child_result_value = ecs->ws.value.integer;
- observer_notify_exited (ecs->ws.value.integer);
+ gdb_observers::exited.notify (ecs->ws.value.integer);
}
else
{
@@ -5128,7 +5128,7 @@ handle_inferior_event_1 (struct execution_control_state *ecs)
Cannot fill $_exitsignal with the correct signal number.\n"));
}
- observer_notify_signal_exited (ecs->ws.value.sig);
+ gdb_observers::signal_exited.notify (ecs->ws.value.sig);
}
gdb_flush (gdb_stdout);
@@ -5406,7 +5406,7 @@ Cannot fill $_exitsignal with the correct signal number.\n"));
delete_just_stopped_threads_single_step_breakpoints ();
stop_pc = regcache_read_pc (get_thread_regcache (inferior_ptid));
- observer_notify_no_history ();
+ gdb_observers::no_history.notify ();
stop_waiting (ecs);
return;
}
@@ -6100,7 +6100,7 @@ handle_signal_stop (struct execution_control_state *ecs)
{
/* The signal table tells us to print about this signal. */
target_terminal_ours_for_output ();
- observer_notify_signal_received (ecs->event_thread->suspend.stop_signal);
+ gdb_observers::signal_received.notify (ecs->event_thread->suspend.stop_signal);
target_terminal_inferior ();
}
@@ -8270,7 +8270,7 @@ normal_stop (void)
update_thread_list ();
if (last.kind == TARGET_WAITKIND_STOPPED && stopped_by_random_signal)
- observer_notify_signal_received (inferior_thread ()->suspend.stop_signal);
+ gdb_observers::signal_received.notify (inferior_thread ()->suspend.stop_signal);
/* As with the notification of thread events, we want to delay
notifying the user that we've switched thread context until
@@ -8387,10 +8387,10 @@ normal_stop (void)
/* Notify observers about the stop. This is where the interpreters
print the stop event. */
if (!ptid_equal (inferior_ptid, null_ptid))
- observer_notify_normal_stop (inferior_thread ()->control.stop_bpstat,
+ gdb_observers::normal_stop.notify (inferior_thread ()->control.stop_bpstat,
stop_print_frame);
else
- observer_notify_normal_stop (NULL, stop_print_frame);
+ gdb_observers::normal_stop.notify (NULL, stop_print_frame);
annotate_stopped ();
@@ -9539,10 +9539,10 @@ enabled by default on some platforms."),
inferior_ptid = null_ptid;
target_last_wait_ptid = minus_one_ptid;
- observer_attach_thread_ptid_changed (infrun_thread_ptid_changed);
- observer_attach_thread_stop_requested (infrun_thread_stop_requested);
- observer_attach_thread_exit (infrun_thread_thread_exit);
- observer_attach_inferior_exit (infrun_inferior_exit);
+ gdb_observers::thread_ptid_changed.attach (infrun_thread_ptid_changed);
+ gdb_observers::thread_stop_requested.attach (infrun_thread_stop_requested);
+ gdb_observers::thread_exit.attach (infrun_thread_thread_exit);
+ gdb_observers::inferior_exit.attach (infrun_inferior_exit);
/* Explicitly create without lookup, since that tries to create a
value with a void typed value, and when we get here, gdbarch
diff --git a/gdb/jit.c b/gdb/jit.c
index 81a2c26..840c91e 100644
--- a/gdb/jit.c
+++ b/gdb/jit.c
@@ -1519,9 +1519,9 @@ _initialize_jit (void)
show_jit_debug,
&setdebuglist, &showdebuglist);
- observer_attach_inferior_created (jit_inferior_created);
- observer_attach_inferior_exit (jit_inferior_exit_hook);
- observer_attach_breakpoint_deleted (jit_breakpoint_deleted);
+ gdb_observers::inferior_created.attach (jit_inferior_created);
+ gdb_observers::inferior_exit.attach (jit_inferior_exit_hook);
+ gdb_observers::breakpoint_deleted.attach (jit_breakpoint_deleted);
jit_objfile_data =
register_objfile_data_with_cleanup (NULL, free_objfile_data);
diff --git a/gdb/linux-tdep.c b/gdb/linux-tdep.c
index 718dc1a..341644d 100644
--- a/gdb/linux-tdep.c
+++ b/gdb/linux-tdep.c
@@ -2545,8 +2545,8 @@ _initialize_linux_tdep (void)
linux_inferior_data
= register_inferior_data_with_cleanup (NULL, linux_inferior_data_cleanup);
/* Observers used to invalidate the cache when needed. */
- observer_attach_inferior_exit (invalidate_linux_cache_inf);
- observer_attach_inferior_appeared (invalidate_linux_cache_inf);
+ gdb_observers::inferior_exit.attach (invalidate_linux_cache_inf);
+ gdb_observers::inferior_appeared.attach (invalidate_linux_cache_inf);
add_setshow_boolean_cmd ("use-coredump-filter", class_files,
&use_coredump_filter, _("\
diff --git a/gdb/linux-thread-db.c b/gdb/linux-thread-db.c
index 6ed3997..a8e4bf9 100644
--- a/gdb/linux-thread-db.c
+++ b/gdb/linux-thread-db.c
@@ -988,7 +988,7 @@ thread_db_new_objfile (struct objfile *objfile)
if (objfile != NULL
/* libpthread with separate debug info has its debug info file already
loaded (and notified without successful thread_db initialization)
- the time observer_notify_new_objfile is called for the library itself.
+ the time gdb_observers::new_objfile.notify is called for the library itself.
Static executables have their separate debug info loaded already
before the inferior has started. */
&& objfile->separate_debug_objfile_backlink == NULL
@@ -1750,10 +1750,10 @@ Usage: info auto-load libthread-db"),
auto_load_info_cmdlist_get ());
/* Add ourselves to objfile event chain. */
- observer_attach_new_objfile (thread_db_new_objfile);
+ gdb_observers::new_objfile.attach (thread_db_new_objfile);
/* Add ourselves to inferior_created event chain.
This is needed to handle debugging statically linked programs where
the new_objfile observer won't get called for libpthread. */
- observer_attach_inferior_created (thread_db_inferior_created);
+ gdb_observers::inferior_created.attach (thread_db_inferior_created);
}
diff --git a/gdb/m68klinux-tdep.c b/gdb/m68klinux-tdep.c
index 94fb953..cfbe7ed 100644
--- a/gdb/m68klinux-tdep.c
+++ b/gdb/m68klinux-tdep.c
@@ -431,5 +431,5 @@ _initialize_m68k_linux_tdep (void)
{
gdbarch_register_osabi (bfd_arch_m68k, 0, GDB_OSABI_LINUX,
m68k_linux_init_abi);
- observer_attach_inferior_created (m68k_linux_inferior_created);
+ gdb_observers::inferior_created.attach (m68k_linux_inferior_created);
}
diff --git a/gdb/mi/mi-cmd-break.c b/gdb/mi/mi-cmd-break.c
index 3d40629..967148b 100644
--- a/gdb/mi/mi-cmd-break.c
+++ b/gdb/mi/mi-cmd-break.c
@@ -76,7 +76,7 @@ setup_breakpoint_reporting (void)
if (! mi_breakpoint_observers_installed)
{
- observer_attach_breakpoint_created (breakpoint_notify);
+ gdb_observers::breakpoint_created.attach (breakpoint_notify);
mi_breakpoint_observers_installed = 1;
}
@@ -403,7 +403,7 @@ mi_cmd_break_passcount (char *command, char **argv, int argc)
if (t)
{
t->pass_count = p;
- observer_notify_breakpoint_modified (&t->base);
+ gdb_observers::breakpoint_modified.notify (&t->base);
}
else
{
diff --git a/gdb/mi/mi-interp.c b/gdb/mi/mi-interp.c
index e3c7dbd..42499ad 100644
--- a/gdb/mi/mi-interp.c
+++ b/gdb/mi/mi-interp.c
@@ -1439,31 +1439,31 @@ _initialize_mi_interp (void)
interp_factory_register (INTERP_MI3, mi_interp_factory);
interp_factory_register (INTERP_MI, mi_interp_factory);
- observer_attach_signal_received (mi_on_signal_received);
- observer_attach_end_stepping_range (mi_on_end_stepping_range);
- observer_attach_signal_exited (mi_on_signal_exited);
- observer_attach_exited (mi_on_exited);
- observer_attach_no_history (mi_on_no_history);
- observer_attach_new_thread (mi_new_thread);
- observer_attach_thread_exit (mi_thread_exit);
- observer_attach_inferior_added (mi_inferior_added);
- observer_attach_inferior_appeared (mi_inferior_appeared);
- observer_attach_inferior_exit (mi_inferior_exit);
- observer_attach_inferior_removed (mi_inferior_removed);
- observer_attach_record_changed (mi_record_changed);
- observer_attach_normal_stop (mi_on_normal_stop);
- observer_attach_target_resumed (mi_on_resume);
- observer_attach_solib_loaded (mi_solib_loaded);
- observer_attach_solib_unloaded (mi_solib_unloaded);
- observer_attach_about_to_proceed (mi_about_to_proceed);
- observer_attach_traceframe_changed (mi_traceframe_changed);
- observer_attach_tsv_created (mi_tsv_created);
- observer_attach_tsv_deleted (mi_tsv_deleted);
- observer_attach_tsv_modified (mi_tsv_modified);
- observer_attach_breakpoint_created (mi_breakpoint_created);
- observer_attach_breakpoint_deleted (mi_breakpoint_deleted);
- observer_attach_breakpoint_modified (mi_breakpoint_modified);
- observer_attach_command_param_changed (mi_command_param_changed);
- observer_attach_memory_changed (mi_memory_changed);
- observer_attach_sync_execution_done (mi_on_sync_execution_done);
+ gdb_observers::signal_received.attach (mi_on_signal_received);
+ gdb_observers::end_stepping_range.attach (mi_on_end_stepping_range);
+ gdb_observers::signal_exited.attach (mi_on_signal_exited);
+ gdb_observers::exited.attach (mi_on_exited);
+ gdb_observers::no_history.attach (mi_on_no_history);
+ gdb_observers::new_thread.attach (mi_new_thread);
+ gdb_observers::thread_exit.attach (mi_thread_exit);
+ gdb_observers::inferior_added.attach (mi_inferior_added);
+ gdb_observers::inferior_appeared.attach (mi_inferior_appeared);
+ gdb_observers::inferior_exit.attach (mi_inferior_exit);
+ gdb_observers::inferior_removed.attach (mi_inferior_removed);
+ gdb_observers::record_changed.attach (mi_record_changed);
+ gdb_observers::normal_stop.attach (mi_on_normal_stop);
+ gdb_observers::target_resumed.attach (mi_on_resume);
+ gdb_observers::solib_loaded.attach (mi_solib_loaded);
+ gdb_observers::solib_unloaded.attach (mi_solib_unloaded);
+ gdb_observers::about_to_proceed.attach (mi_about_to_proceed);
+ gdb_observers::traceframe_changed.attach (mi_traceframe_changed);
+ gdb_observers::tsv_created.attach (mi_tsv_created);
+ gdb_observers::tsv_deleted.attach (mi_tsv_deleted);
+ gdb_observers::tsv_modified.attach (mi_tsv_modified);
+ gdb_observers::breakpoint_created.attach (mi_breakpoint_created);
+ gdb_observers::breakpoint_deleted.attach (mi_breakpoint_deleted);
+ gdb_observers::breakpoint_modified.attach (mi_breakpoint_modified);
+ gdb_observers::command_param_changed.attach (mi_command_param_changed);
+ gdb_observers::memory_changed.attach (mi_memory_changed);
+ gdb_observers::sync_execution_done.attach (mi_on_sync_execution_done);
}
diff --git a/gdb/objfiles.c b/gdb/objfiles.c
index 71f771d..7b28f5f 100644
--- a/gdb/objfiles.c
+++ b/gdb/objfiles.c
@@ -634,7 +634,7 @@ void
free_objfile (struct objfile *objfile)
{
/* First notify observers that this objfile is about to be freed. */
- observer_notify_free_objfile (objfile);
+ gdb_observers::free_objfile.notify (objfile);
/* Free all separate debug objfiles. */
free_objfile_separate_debug (objfile);
diff --git a/gdb/ppc-linux-nat.c b/gdb/ppc-linux-nat.c
index 84c14a1..c9a2592 100644
--- a/gdb/ppc-linux-nat.c
+++ b/gdb/ppc-linux-nat.c
@@ -2516,7 +2516,7 @@ _initialize_ppc_linux_nat (void)
t->to_read_description = ppc_linux_read_description;
t->to_auxv_parse = ppc_linux_auxv_parse;
- observer_attach_thread_exit (ppc_linux_thread_exit);
+ gdb_observers::thread_exit.attach (ppc_linux_thread_exit);
/* Register the target. */
linux_nat_add_target (t);
diff --git a/gdb/ppc-linux-tdep.c b/gdb/ppc-linux-tdep.c
index ee158e3..d4dcdd6 100644
--- a/gdb/ppc-linux-tdep.c
+++ b/gdb/ppc-linux-tdep.c
@@ -1852,9 +1852,9 @@ _initialize_ppc_linux_tdep (void)
ppc_linux_init_abi);
/* Attach to observers to track __spe_current_active_context. */
- observer_attach_inferior_created (ppc_linux_spe_context_inferior_created);
- observer_attach_solib_loaded (ppc_linux_spe_context_solib_loaded);
- observer_attach_solib_unloaded (ppc_linux_spe_context_solib_unloaded);
+ gdb_observers::inferior_created.attach (ppc_linux_spe_context_inferior_created);
+ gdb_observers::solib_loaded.attach (ppc_linux_spe_context_solib_loaded);
+ gdb_observers::solib_unloaded.attach (ppc_linux_spe_context_solib_unloaded);
/* Initialize the Linux target descriptions. */
initialize_tdesc_powerpc_32l ();
diff --git a/gdb/printcmd.c b/gdb/printcmd.c
index d4a4b9e..8873143 100644
--- a/gdb/printcmd.c
+++ b/gdb/printcmd.c
@@ -2761,7 +2761,7 @@ _initialize_printcmd (void)
current_display_number = -1;
- observer_attach_free_objfile (clear_dangling_display_expressions);
+ gdb_observers::free_objfile.attach (clear_dangling_display_expressions);
add_info ("address", address_info,
_("Describe where symbol SYM is stored."));
diff --git a/gdb/procfs.c b/gdb/procfs.c
index fab15ed..b503bea 100644
--- a/gdb/procfs.c
+++ b/gdb/procfs.c
@@ -5273,7 +5273,7 @@ extern void _initialize_procfs (void);
void
_initialize_procfs (void)
{
- observer_attach_inferior_created (procfs_inferior_created);
+ gdb_observers::inferior_created.attach (procfs_inferior_created);
add_com ("proc-trace-entry", no_class, proc_trace_sysentry_cmd,
_("Give a trace of entries into the syscall."));
diff --git a/gdb/python/py-breakpoint.c b/gdb/python/py-breakpoint.c
index 80f5d1f..260e137 100644
--- a/gdb/python/py-breakpoint.c
+++ b/gdb/python/py-breakpoint.c
@@ -1008,9 +1008,9 @@ gdbpy_initialize_breakpoints (void)
(PyObject *) &breakpoint_object_type) < 0)
return -1;
- observer_attach_breakpoint_created (gdbpy_breakpoint_created);
- observer_attach_breakpoint_deleted (gdbpy_breakpoint_deleted);
- observer_attach_breakpoint_modified (gdbpy_breakpoint_modified);
+ gdb_observers::breakpoint_created.attach (gdbpy_breakpoint_created);
+ gdb_observers::breakpoint_deleted.attach (gdbpy_breakpoint_deleted);
+ gdb_observers::breakpoint_modified.attach (gdbpy_breakpoint_modified);
/* Add breakpoint types constants. */
for (i = 0; pybp_codes[i].name; ++i)
diff --git a/gdb/python/py-finishbreakpoint.c b/gdb/python/py-finishbreakpoint.c
index 74d225b..cbeec70 100644
--- a/gdb/python/py-finishbreakpoint.c
+++ b/gdb/python/py-finishbreakpoint.c
@@ -427,8 +427,8 @@ gdbpy_initialize_finishbreakpoints (void)
(PyObject *) &finish_breakpoint_object_type) < 0)
return -1;
- observer_attach_normal_stop (bpfinishpy_handle_stop);
- observer_attach_inferior_exit (bpfinishpy_handle_exit);
+ gdb_observers::normal_stop.attach (bpfinishpy_handle_stop);
+ gdb_observers::inferior_exit.attach (bpfinishpy_handle_exit);
return 0;
}
diff --git a/gdb/python/py-inferior.c b/gdb/python/py-inferior.c
index 8732b87..e5b47de 100644
--- a/gdb/python/py-inferior.c
+++ b/gdb/python/py-inferior.c
@@ -886,16 +886,16 @@ gdbpy_initialize_inferior (void)
infpy_inf_data_key =
register_inferior_data_with_cleanup (NULL, py_free_inferior);
- observer_attach_new_thread (add_thread_object);
- observer_attach_thread_exit (delete_thread_object);
- observer_attach_normal_stop (python_on_normal_stop);
- observer_attach_target_resumed (python_on_resume);
- observer_attach_inferior_call_pre (python_on_inferior_call_pre);
- observer_attach_inferior_call_post (python_on_inferior_call_post);
- observer_attach_memory_changed (python_on_memory_change);
- observer_attach_register_changed (python_on_register_change);
- observer_attach_inferior_exit (python_inferior_exit);
- observer_attach_new_objfile (python_new_objfile);
+ gdb_observers::new_thread.attach (add_thread_object);
+ gdb_observers::thread_exit.attach (delete_thread_object);
+ gdb_observers::normal_stop.attach (python_on_normal_stop);
+ gdb_observers::target_resumed.attach (python_on_resume);
+ gdb_observers::inferior_call_pre.attach (python_on_inferior_call_pre);
+ gdb_observers::inferior_call_post.attach (python_on_inferior_call_post);
+ gdb_observers::memory_changed.attach (python_on_memory_change);
+ gdb_observers::register_changed.attach (python_on_register_change);
+ gdb_observers::inferior_exit.attach (python_inferior_exit);
+ gdb_observers::new_objfile.attach (python_new_objfile);
membuf_object_type.tp_new = PyType_GenericNew;
if (PyType_Ready (&membuf_object_type) < 0)
diff --git a/gdb/python/py-unwind.c b/gdb/python/py-unwind.c
index cc685ae..c7a692b 100644
--- a/gdb/python/py-unwind.c
+++ b/gdb/python/py-unwind.c
@@ -670,7 +670,7 @@ gdbpy_initialize_unwind (void)
&setdebuglist, &showdebuglist);
pyuw_gdbarch_data
= gdbarch_data_register_post_init (pyuw_gdbarch_data_init);
- observer_attach_architecture_changed (pyuw_on_new_gdbarch);
+ gdb_observers::architecture_changed.attach (pyuw_on_new_gdbarch);
if (PyType_Ready (&pending_frame_object_type) < 0)
return -1;
diff --git a/gdb/ravenscar-thread.c b/gdb/ravenscar-thread.c
index 3e0687d..6cd7cd4 100644
--- a/gdb/ravenscar-thread.c
+++ b/gdb/ravenscar-thread.c
@@ -432,7 +432,7 @@ _initialize_ravenscar (void)
/* Notice when the inferior is created in order to push the
ravenscar ops if needed. */
- observer_attach_inferior_created (ravenscar_inferior_created);
+ gdb_observers::inferior_created.attach (ravenscar_inferior_created);
complete_target_initialization (&ravenscar_ops);
diff --git a/gdb/record-btrace.c b/gdb/record-btrace.c
index 9876943..33906c9 100644
--- a/gdb/record-btrace.c
+++ b/gdb/record-btrace.c
@@ -176,7 +176,7 @@ record_btrace_auto_enable (void)
DEBUG ("attach thread observer");
record_btrace_thread_observer
- = observer_attach_new_thread (record_btrace_enable_warn);
+ = gdb_observers::new_thread.attach (record_btrace_enable_warn);
}
/* Disable automatic tracing of new threads. */
@@ -190,7 +190,7 @@ record_btrace_auto_disable (void)
DEBUG ("detach thread observer");
- observer_detach_new_thread (record_btrace_thread_observer);
+ gdb_observers::new_thread.detach (record_btrace_thread_observer);
record_btrace_thread_observer = NULL;
}
@@ -219,7 +219,7 @@ record_btrace_push_target (void)
record_btrace_generating_corefile = 0;
format = btrace_format_short_string (record_btrace_conf.format);
- observer_notify_record_changed (current_inferior (), 1, "btrace", format);
+ gdb_observers::record_changed.notify (current_inferior (), 1, "btrace", format);
}
/* The to_open method of target record-btrace. */
diff --git a/gdb/record-full.c b/gdb/record-full.c
index e4dd55b..3b1ae04 100644
--- a/gdb/record-full.c
+++ b/gdb/record-full.c
@@ -869,7 +869,7 @@ record_full_open (const char *name, int from_tty)
record_full_init_record_breakpoints ();
- observer_notify_record_changed (current_inferior (), 1, "full", NULL);
+ gdb_observers::record_changed.notify (current_inferior (), 1, "full", NULL);
}
/* "to_close" target method. Close the process record target. */
diff --git a/gdb/record.c b/gdb/record.c
index 34ebd1b..153b75e 100644
--- a/gdb/record.c
+++ b/gdb/record.c
@@ -268,7 +268,7 @@ cmd_record_stop (char *args, int from_tty)
printf_unfiltered (_("Process record is stopped and all execution "
"logs are deleted.\n"));
- observer_notify_record_changed (current_inferior (), 0, NULL, NULL);
+ gdb_observers::record_changed.notify (current_inferior (), 0, NULL, NULL);
}
/* The "set record" command. */
diff --git a/gdb/regcache.c b/gdb/regcache.c
index a5c90a6..ed01ce0 100644
--- a/gdb/regcache.c
+++ b/gdb/regcache.c
@@ -1533,8 +1533,8 @@ _initialize_regcache (void)
regcache_descr_handle
= gdbarch_data_register_post_init (init_regcache_descr);
- observer_attach_target_changed (regcache_observer_target_changed);
- observer_attach_thread_ptid_changed (regcache_thread_ptid_changed);
+ gdb_observers::target_changed.attach (regcache_observer_target_changed);
+ gdb_observers::thread_ptid_changed.attach (regcache_thread_ptid_changed);
add_com ("flushregs", class_maintenance, reg_flush_command,
_("Force gdb to flush its register cache (maintainer command)"));
diff --git a/gdb/remote.c b/gdb/remote.c
index af7508a..0118c1a 100644
--- a/gdb/remote.c
+++ b/gdb/remote.c
@@ -3835,9 +3835,9 @@ print_one_stopped_thread (struct thread_info *thread)
enum gdb_signal sig = ws->value.sig;
if (signal_print_state (sig))
- observer_notify_signal_received (sig);
+ gdb_observers::signal_received.notify (sig);
}
- observer_notify_normal_stop (NULL, 1);
+ gdb_observers::normal_stop.notify (NULL, 1);
}
/* Process all initial stop replies the remote side sent in response
@@ -13537,10 +13537,10 @@ _initialize_remote (void)
add_target (&extended_remote_ops);
/* Hook into new objfile notification. */
- observer_attach_new_objfile (remote_new_objfile);
+ gdb_observers::new_objfile.attach (remote_new_objfile);
/* We're no longer interested in notification events of an inferior
when it exits. */
- observer_attach_inferior_exit (discard_pending_stop_replies);
+ gdb_observers::inferior_exit.attach (discard_pending_stop_replies);
#if 0
init_remote_threadtests ();
diff --git a/gdb/sol-thread.c b/gdb/sol-thread.c
index 000d223..7c47805 100644
--- a/gdb/sol-thread.c
+++ b/gdb/sol-thread.c
@@ -1282,7 +1282,7 @@ _initialize_sol_thread (void)
_("Show info on Solaris user threads."), &maintenanceinfolist);
/* Hook into new_objfile notification. */
- observer_attach_new_objfile (sol_thread_new_objfile);
+ gdb_observers::new_objfile.attach (sol_thread_new_objfile);
return;
die:
diff --git a/gdb/solib-aix.c b/gdb/solib-aix.c
index 51ab93e..90cd282 100644
--- a/gdb/solib-aix.c
+++ b/gdb/solib-aix.c
@@ -834,7 +834,7 @@ _initialize_solib_aix (void)
solib_aix_inferior_data_handle = register_inferior_data ();
- observer_attach_normal_stop (solib_aix_normal_stop_observer);
+ gdb_observers::normal_stop.attach (solib_aix_normal_stop_observer);
/* Debug this file's internals. */
add_setshow_boolean_cmd ("aix-solib", class_maintenance,
diff --git a/gdb/solib-spu.c b/gdb/solib-spu.c
index fa2977e..08a8354 100644
--- a/gdb/solib-spu.c
+++ b/gdb/solib-spu.c
@@ -551,7 +551,7 @@ extern initialize_file_ftype _initialize_spu_solib;
void
_initialize_spu_solib (void)
{
- observer_attach_solib_loaded (spu_solib_loaded);
+ gdb_observers::solib_loaded.attach (spu_solib_loaded);
ocl_program_data_key = register_objfile_data ();
}
diff --git a/gdb/solib.c b/gdb/solib.c
index 2235505..734fe31 100644
--- a/gdb/solib.c
+++ b/gdb/solib.c
@@ -848,7 +848,7 @@ update_solib_list (int from_tty, struct target_ops *target)
{
/* Notify any observer that the shared object has been
unloaded before we remove it from GDB's tables. */
- observer_notify_solib_unloaded (gdb);
+ gdb_observers::solib_unloaded.notify (gdb);
VEC_safe_push (char_ptr, current_program_space->deleted_solibs,
xstrdup (gdb->so_name));
@@ -910,7 +910,7 @@ update_solib_list (int from_tty, struct target_ops *target)
/* Notify any observer that the shared object has been
loaded now that we've added it to GDB's tables. */
- observer_notify_solib_loaded (i);
+ gdb_observers::solib_loaded.notify (i);
}
/* If a library was not found, issue an appropriate warning
@@ -1255,7 +1255,7 @@ clear_solib (void)
struct so_list *so = so_list_head;
so_list_head = so->next;
- observer_notify_solib_unloaded (so);
+ gdb_observers::solib_unloaded.notify (so);
remove_target_sections (so);
free_so (so);
}
@@ -1669,7 +1669,7 @@ _initialize_solib (void)
{
solib_data = gdbarch_data_register_pre_init (solib_init);
- observer_attach_free_objfile (remove_user_added_objfile);
+ gdb_observers::free_objfile.attach (remove_user_added_objfile);
add_com ("sharedlibrary", class_files, sharedlibrary_command,
_("Load shared object library symbols for files matching REGEXP."));
diff --git a/gdb/spu-multiarch.c b/gdb/spu-multiarch.c
index d4da08e..145f76d 100644
--- a/gdb/spu-multiarch.c
+++ b/gdb/spu-multiarch.c
@@ -402,8 +402,8 @@ _initialize_spu_multiarch (void)
complete_target_initialization (&spu_ops);
/* Install observers to watch for SPU objects. */
- observer_attach_inferior_created (spu_multiarch_inferior_created);
- observer_attach_solib_loaded (spu_multiarch_solib_loaded);
- observer_attach_solib_unloaded (spu_multiarch_solib_unloaded);
+ gdb_observers::inferior_created.attach (spu_multiarch_inferior_created);
+ gdb_observers::solib_loaded.attach (spu_multiarch_solib_loaded);
+ gdb_observers::solib_unloaded.attach (spu_multiarch_solib_unloaded);
}
diff --git a/gdb/spu-tdep.c b/gdb/spu-tdep.c
index f62e8e7..85ddbb2 100644
--- a/gdb/spu-tdep.c
+++ b/gdb/spu-tdep.c
@@ -2817,14 +2817,14 @@ _initialize_spu_tdep (void)
register_gdbarch_init (bfd_arch_spu, spu_gdbarch_init);
/* Add ourselves to objfile event chain. */
- observer_attach_new_objfile (spu_overlay_new_objfile);
+ gdb_observers::new_objfile.attach (spu_overlay_new_objfile);
spu_overlay_data = register_objfile_data ();
/* Install spu stop-on-load handler. */
- observer_attach_new_objfile (spu_catch_start);
+ gdb_observers::new_objfile.attach (spu_catch_start);
/* Add ourselves to normal_stop event chain. */
- observer_attach_normal_stop (spu_attach_normal_stop);
+ gdb_observers::normal_stop.attach (spu_attach_normal_stop);
/* Add root prefix command for all "set spu"/"show spu" commands. */
add_prefix_cmd ("spu", no_class, set_spu_command,
diff --git a/gdb/symfile-mem.c b/gdb/symfile-mem.c
index 79739a6..be8d959 100644
--- a/gdb/symfile-mem.c
+++ b/gdb/symfile-mem.c
@@ -250,5 +250,5 @@ _initialize_symfile_mem (void)
/* Want to know of each new inferior so that its vsyscall info can
be extracted. */
- observer_attach_inferior_created (add_vsyscall_page);
+ gdb_observers::inferior_created.attach (add_vsyscall_page);
}
diff --git a/gdb/symfile.c b/gdb/symfile.c
index 7eb6cdc..368564b 100644
--- a/gdb/symfile.c
+++ b/gdb/symfile.c
@@ -1226,13 +1226,13 @@ symbol_file_add_with_addrs (bfd *abfd, const char *name, int add_flags,
if (objfile->sf == NULL)
{
- observer_notify_new_objfile (objfile);
+ gdb_observers::new_objfile.notify (objfile);
return objfile; /* No symbols. */
}
finish_new_objfile (objfile, add_flags);
- observer_notify_new_objfile (objfile);
+ gdb_observers::new_objfile.notify (objfile);
bfd_cache_close_all ();
return (objfile);
@@ -2691,14 +2691,14 @@ reread_symbols (void)
clear_symtab_users (0);
/* clear_objfile_data for each objfile was called before freeing it and
- observer_notify_new_objfile (NULL) has been called by
+ gdb_observers::new_objfile.notify (NULL) has been called by
clear_symtab_users above. Notify the new files now. */
for (ix = 0; VEC_iterate (objfilep, new_objfiles, ix, objfile); ix++)
- observer_notify_new_objfile (objfile);
+ gdb_observers::new_objfile.notify (objfile);
/* At least one objfile has changed, so we can consider that
the executable we're debugging has changed too. */
- observer_notify_executable_changed ();
+ gdb_observers::executable_changed.notify ();
}
do_cleanups (all_cleanups);
@@ -2953,7 +2953,7 @@ clear_symtab_users (int add_flags)
clear_displays ();
clear_last_displayed_sal ();
clear_pc_function_cache ();
- observer_notify_new_objfile (NULL);
+ gdb_observers::new_objfile.notify (NULL);
/* Clear globals which might have pointed into a removed objfile.
FIXME: It's not clear which of these are supposed to persist
@@ -3904,7 +3904,7 @@ _initialize_symfile (void)
{
struct cmd_list_element *c;
- observer_attach_free_objfile (symfile_free_objfile);
+ gdb_observers::free_objfile.attach (symfile_free_objfile);
c = add_cmd ("symbol-file", class_files, symbol_file_command, _("\
Load symbol table from executable file FILE.\n\
diff --git a/gdb/symtab.c b/gdb/symtab.c
index e776a0c..5840c7e 100644
--- a/gdb/symtab.c
+++ b/gdb/symtab.c
@@ -6342,7 +6342,7 @@ If zero then the symbol cache is disabled."),
_("Flush the symbol cache for each program space."),
&maintenancelist);
- observer_attach_executable_changed (symtab_observer_executable_changed);
- observer_attach_new_objfile (symtab_new_objfile_observer);
- observer_attach_free_objfile (symtab_free_objfile_observer);
+ gdb_observers::executable_changed.attach (symtab_observer_executable_changed);
+ gdb_observers::new_objfile.attach (symtab_new_objfile_observer);
+ gdb_observers::free_objfile.attach (symtab_free_objfile_observer);
}
diff --git a/gdb/thread.c b/gdb/thread.c
index a66a2b5..d805578 100644
--- a/gdb/thread.c
+++ b/gdb/thread.c
@@ -300,7 +300,7 @@ add_thread_silent (ptid_t ptid)
tp->state = THREAD_STOPPED;
switch_to_thread (ptid);
- observer_notify_new_thread (tp);
+ gdb_observers::new_thread.notify (tp);
/* All done. */
return tp;
@@ -311,7 +311,7 @@ add_thread_silent (ptid_t ptid)
}
tp = new_thread (inf, ptid);
- observer_notify_new_thread (tp);
+ gdb_observers::new_thread.notify (tp);
return tp;
}
@@ -444,7 +444,7 @@ delete_thread_1 (ptid_t ptid, int silent)
{
if (tp->state != THREAD_EXITED)
{
- observer_notify_thread_exit (tp, silent);
+ gdb_observers::thread_exit.notify (tp, silent);
/* Tag it as exited. */
tp->state = THREAD_EXITED;
@@ -459,7 +459,7 @@ delete_thread_1 (ptid_t ptid, int silent)
/* Notify thread exit, but only if we haven't already. */
if (tp->state != THREAD_EXITED)
- observer_notify_thread_exit (tp, silent);
+ gdb_observers::thread_exit.notify (tp, silent);
/* Tag it as exited. */
tp->state = THREAD_EXITED;
@@ -890,7 +890,7 @@ thread_change_ptid (ptid_t old_ptid, ptid_t new_ptid)
tp = find_thread_ptid (old_ptid);
tp->ptid = new_ptid;
- observer_notify_thread_ptid_changed (old_ptid, new_ptid);
+ gdb_observers::thread_ptid_changed.notify (old_ptid, new_ptid);
}
/* See gdbthread.h. */
@@ -970,7 +970,7 @@ set_running (ptid_t ptid, int running)
any_started = 1;
}
if (any_started)
- observer_notify_target_resumed (ptid);
+ gdb_observers::target_resumed.notify (ptid);
}
static int
@@ -1069,7 +1069,7 @@ set_stop_requested (ptid_t ptid, int stop)
/* Call the stop requested observer so other components of GDB can
react to this request. */
if (stop)
- observer_notify_thread_stop_requested (ptid);
+ gdb_observers::thread_stop_requested.notify (ptid);
}
void
@@ -1106,7 +1106,7 @@ finish_thread_state (ptid_t ptid)
}
if (any_started)
- observer_notify_target_resumed (ptid);
+ gdb_observers::target_resumed.notify (ptid);
}
void
@@ -2238,5 +2238,5 @@ Show printing of thread events (such as thread start and exit)."), NULL,
create_internalvar_type_lazy ("_thread", &thread_funcs, NULL);
create_internalvar_type_lazy ("_gthread", >hread_funcs, NULL);
- observer_attach_thread_ptid_changed (restore_current_thread_ptid_changed);
+ gdb_observers::thread_ptid_changed.attach (restore_current_thread_ptid_changed);
}
diff --git a/gdb/top.c b/gdb/top.c
index 3cfa113..b49d6c2 100644
--- a/gdb/top.c
+++ b/gdb/top.c
@@ -1998,7 +1998,7 @@ static void
set_gdb_datadir (char *args, int from_tty, struct cmd_list_element *c)
{
set_gdb_data_directory (staged_gdb_datadir);
- observer_notify_gdb_datadir_changed ();
+ gdb_observers::gdb_datadir_changed.notify ();
}
/* "show" command for the gdb_datadir configuration variable. */
diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c
index c89c77e..6b1b2e2 100644
--- a/gdb/tracepoint.c
+++ b/gdb/tracepoint.c
@@ -349,7 +349,7 @@ delete_trace_state_variable (const char *name)
for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
if (strcmp (name, tsv->name) == 0)
{
- observer_notify_tsv_deleted (tsv);
+ gdb_observers::tsv_deleted.notify (tsv);
xfree ((void *)tsv->name);
VEC_unordered_remove (tsv_s, tvariables, ix);
@@ -426,7 +426,7 @@ trace_variable_command (char *args, int from_tty)
if (tsv->initial_value != initval)
{
tsv->initial_value = initval;
- observer_notify_tsv_modified (tsv);
+ gdb_observers::tsv_modified.notify (tsv);
}
printf_filtered (_("Trace state variable $%s "
"now has initial value %s.\n"),
@@ -439,7 +439,7 @@ trace_variable_command (char *args, int from_tty)
tsv = create_trace_state_variable (name);
tsv->initial_value = initval;
- observer_notify_tsv_created (tsv);
+ gdb_observers::tsv_created.notify (tsv);
printf_filtered (_("Trace state variable $%s "
"created, with initial value %s.\n"),
@@ -460,7 +460,7 @@ delete_trace_variable_command (char *args, int from_tty)
if (query (_("Delete all trace state variables? ")))
VEC_free (tsv_s, tvariables);
dont_repeat ();
- observer_notify_tsv_deleted (NULL);
+ gdb_observers::tsv_deleted.notify (NULL);
return;
}
@@ -1861,7 +1861,7 @@ start_tracing (char *notes)
loc->gdbarch);
if (bp_location_downloaded)
- observer_notify_breakpoint_modified (b);
+ gdb_observers::breakpoint_modified.notify (b);
}
VEC_free (breakpoint_p, tp_vec);
@@ -2379,7 +2379,7 @@ tfind_1 (enum trace_find_type type, int num,
set_tracepoint_num (tp ? tp->base.number : target_tracept);
if (target_frameno != get_traceframe_number ())
- observer_notify_traceframe_changed (target_frameno, tracepoint_number);
+ gdb_observers::traceframe_changed.notify (target_frameno, tracepoint_number);
set_current_traceframe (target_frameno);
@@ -3448,7 +3448,7 @@ merge_uploaded_tracepoints (struct uploaded_tp **uploaded_tps)
/* Notify 'breakpoint-modified' observer that at least one of B's
locations was changed. */
for (ix = 0; VEC_iterate (breakpoint_p, modified_tp, ix, b); ix++)
- observer_notify_breakpoint_modified (b);
+ gdb_observers::breakpoint_modified.notify (b);
VEC_free (breakpoint_p, modified_tp);
free_uploaded_tps (uploaded_tps);
@@ -3501,7 +3501,7 @@ create_tsv_from_upload (struct uploaded_tsv *utsv)
tsv->initial_value = utsv->initial_value;
tsv->builtin = utsv->builtin;
- observer_notify_tsv_created (tsv);
+ gdb_observers::tsv_created.notify (tsv);
do_cleanups (old_chain);
diff --git a/gdb/tui/tui-hooks.c b/gdb/tui/tui-hooks.c
index 8ca254d..899b767 100644
--- a/gdb/tui/tui-hooks.c
+++ b/gdb/tui/tui-hooks.c
@@ -235,19 +235,19 @@ tui_install_hooks (void)
/* Install the event hooks. */
tui_bp_created_observer
- = observer_attach_breakpoint_created (tui_event_create_breakpoint);
+ = gdb_observers::breakpoint_created.attach (tui_event_create_breakpoint);
tui_bp_deleted_observer
- = observer_attach_breakpoint_deleted (tui_event_delete_breakpoint);
+ = gdb_observers::breakpoint_deleted.attach (tui_event_delete_breakpoint);
tui_bp_modified_observer
- = observer_attach_breakpoint_modified (tui_event_modify_breakpoint);
+ = gdb_observers::breakpoint_modified.attach (tui_event_modify_breakpoint);
tui_inferior_exit_observer
- = observer_attach_inferior_exit (tui_inferior_exit);
+ = gdb_observers::inferior_exit.attach (tui_inferior_exit);
tui_before_prompt_observer
- = observer_attach_before_prompt (tui_before_prompt);
+ = gdb_observers::before_prompt.attach (tui_before_prompt);
tui_normal_stop_observer
- = observer_attach_normal_stop (tui_normal_stop);
+ = gdb_observers::normal_stop.attach (tui_normal_stop);
tui_register_changed_observer
- = observer_attach_register_changed (tui_register_changed);
+ = gdb_observers::register_changed.attach (tui_register_changed);
}
/* Remove the TUI specific hooks. */
@@ -257,19 +257,19 @@ tui_remove_hooks (void)
deprecated_print_frame_info_listing_hook = 0;
deprecated_query_hook = 0;
/* Remove our observers. */
- observer_detach_breakpoint_created (tui_bp_created_observer);
+ gdb_observers::breakpoint_created.detach (tui_bp_created_observer);
tui_bp_created_observer = NULL;
- observer_detach_breakpoint_deleted (tui_bp_deleted_observer);
+ gdb_observers::breakpoint_deleted.detach (tui_bp_deleted_observer);
tui_bp_deleted_observer = NULL;
- observer_detach_breakpoint_modified (tui_bp_modified_observer);
+ gdb_observers::breakpoint_modified.detach (tui_bp_modified_observer);
tui_bp_modified_observer = NULL;
- observer_detach_inferior_exit (tui_inferior_exit_observer);
+ gdb_observers::inferior_exit.detach (tui_inferior_exit_observer);
tui_inferior_exit_observer = NULL;
- observer_detach_before_prompt (tui_before_prompt_observer);
+ gdb_observers::before_prompt.detach (tui_before_prompt_observer);
tui_before_prompt_observer = NULL;
- observer_detach_normal_stop (tui_normal_stop_observer);
+ gdb_observers::normal_stop.detach (tui_normal_stop_observer);
tui_normal_stop_observer = NULL;
- observer_detach_register_changed (tui_register_changed_observer);
+ gdb_observers::register_changed.detach (tui_register_changed_observer);
tui_register_changed_observer = NULL;
}
@@ -279,5 +279,5 @@ void
_initialize_tui_hooks (void)
{
/* Install the permanent hooks. */
- observer_attach_new_objfile (tui_new_objfile_hook);
+ gdb_observers::new_objfile.attach (tui_new_objfile_hook);
}
diff --git a/gdb/tui/tui-interp.c b/gdb/tui/tui-interp.c
index 3856382..ed33c1b 100644
--- a/gdb/tui/tui-interp.c
+++ b/gdb/tui/tui-interp.c
@@ -315,12 +315,12 @@ _initialize_tui_interp (void)
}
/* If changing this, remember to update cli-interp.c as well. */
- observer_attach_normal_stop (tui_on_normal_stop);
- observer_attach_signal_received (tui_on_signal_received);
- observer_attach_end_stepping_range (tui_on_end_stepping_range);
- observer_attach_signal_exited (tui_on_signal_exited);
- observer_attach_exited (tui_on_exited);
- observer_attach_no_history (tui_on_no_history);
- observer_attach_sync_execution_done (tui_on_sync_execution_done);
- observer_attach_command_error (tui_on_command_error);
+ gdb_observers::normal_stop.attach (tui_on_normal_stop);
+ gdb_observers::signal_received.attach (tui_on_signal_received);
+ gdb_observers::end_stepping_range.attach (tui_on_end_stepping_range);
+ gdb_observers::signal_exited.attach (tui_on_signal_exited);
+ gdb_observers::exited.attach (tui_on_exited);
+ gdb_observers::no_history.attach (tui_on_no_history);
+ gdb_observers::sync_execution_done.attach (tui_on_sync_execution_done);
+ gdb_observers::command_error.attach (tui_on_command_error);
}
diff --git a/gdb/valops.c b/gdb/valops.c
index 40392e8..5ecadba 100644
--- a/gdb/valops.c
+++ b/gdb/valops.c
@@ -1178,7 +1178,7 @@ value_assign (struct value *toval, struct value *fromval)
}
}
- observer_notify_register_changed (frame, value_reg);
+ gdb_observers::register_changed.notify (frame, value_reg);
break;
}
@@ -1209,7 +1209,7 @@ value_assign (struct value *toval, struct value *fromval)
case lval_register:
case lval_computed:
- observer_notify_target_changed (¤t_target);
+ gdb_observers::target_changed.notify (¤t_target);
/* Having destroyed the frame cache, restore the selected
frame. */
--
2.7.4
^ permalink raw reply [flat|nested] 6+ messages in thread
* [RFA 1/4] Convert observers to C++
2016-10-03 4:22 [RFA 0/4] Conver observers to C++ Tom Tromey
` (2 preceding siblings ...)
2016-10-03 4:22 ` [RFA 3/4] Update all observer uses Tom Tromey
@ 2016-10-03 4:22 ` Tom Tromey
2016-10-03 17:32 ` Trevor Saunders
3 siblings, 1 reply; 6+ messages in thread
From: Tom Tromey @ 2016-10-03 4:22 UTC (permalink / raw)
To: gdb-patches; +Cc: Tom Tromey
This converts observers from using a special source-generating script
to be plain C++.
This translation is less ideal than I'd like in a couple of ways.
Still, I think it's a mild improvement, on the basis that ordinary
code is preferable to an ad hoc code generator.
First, it introduces a gdb analogue to std::function, the real one not
being available until C++11.
Second, it works around the lack of variadic templates in a mildly
ugly way.
In C++11 it would be ~300 lines of code shorter.
2016-10-02 Tom Tromey <tom@tromey.com>
* observer.sh: Remove.
* observer.h: New file.
* observer.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.
* gdb_function.h: New file.
* Makefile.in (generated_files): Remove observer.h, observer.inc.
(clean mostlyclean): Likewise.
(observer.h, observer.inc): Remove targets.
* .gitignore: Remove observer.h.
2016-10-02 Tom Tromey <tom@tromey.com>
* observer.texi: Remove.
---
gdb/.gitignore | 1 -
gdb/ChangeLog | 17 +++
gdb/Makefile.in | 10 +-
gdb/doc/ChangeLog | 4 +
gdb/doc/observer.texi | 309 ---------------------------------------
gdb/gdb_function.h | 149 +++++++++++++++++++
gdb/observer.c | 236 ++++++++++++------------------
gdb/observer.h | 394 ++++++++++++++++++++++++++++++++++++++++++++++++++
gdb/observer.sh | 200 -------------------------
9 files changed, 658 insertions(+), 662 deletions(-)
delete mode 100644 gdb/doc/observer.texi
create mode 100644 gdb/gdb_function.h
create mode 100644 gdb/observer.h
delete mode 100755 gdb/observer.sh
diff --git a/gdb/.gitignore b/gdb/.gitignore
index e7e1087..b9b2c6f 100644
--- a/gdb/.gitignore
+++ b/gdb/.gitignore
@@ -21,7 +21,6 @@
/jv-exp.c
/m2-exp.c
/objc-exp.c
-/observer.h
/observer.inc
/p-exp.c
/rust-exp.c
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index ffbdc3d..69d8a82 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,20 @@
+2016-10-02 Tom Tromey <tom@tromey.com>
+
+ * observer.sh: Remove.
+ * observer.h: New file.
+ * observer.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.
+ * gdb_function.h: New file.
+ * Makefile.in (generated_files): Remove observer.h, observer.inc.
+ (clean mostlyclean): Likewise.
+ (observer.h, observer.inc): Remove targets.
+ * .gitignore: Remove observer.h.
+
2016-09-29 Jan Kratochvil <jan.kratochvil@redhat.com>
PR gdb/20609 - attach of JIT-debug-enabled inf 7.11.1 regression
diff --git a/gdb/Makefile.in b/gdb/Makefile.in
index d0a968a..cf242b3 100644
--- a/gdb/Makefile.in
+++ b/gdb/Makefile.in
@@ -1121,7 +1121,7 @@ DISTSTUFF = $(YYFILES)
# All generated files which can be included by another file.
-generated_files = config.h observer.h observer.inc ada-lex.c jit-reader.h \
+generated_files = config.h ada-lex.c jit-reader.h \
$(GNULIB_H) $(NAT_GENERATED_FILES) gcore
.c.o:
@@ -1450,7 +1450,7 @@ tags: TAGS
clean mostlyclean: $(CONFIG_CLEAN)
@$(MAKE) $(FLAGS_TO_PASS) DO=clean "DODIRS=$(CLEANDIRS)" subdir_do
rm -f *.o *.a $(ADD_FILES) *~ init.c-tmp init.l-tmp version.c-tmp
- rm -f init.c version.c observer.h observer.inc
+ rm -f init.c version.c
rm -f gdb$(EXEEXT) core make.log
rm -f gdb[0-9]$(EXEEXT)
rm -f test-cp-name-parser$(EXEEXT)
@@ -1631,12 +1631,6 @@ version.c: Makefile version.in $(srcdir)/../bfd/version.h $(srcdir)/common/creat
$(SHELL) $(srcdir)/common/create-version.sh $(srcdir) \
$(host_alias) $(target_alias) version.c
-observer.h: observer.sh doc/observer.texi
- ${srcdir}/observer.sh h ${srcdir}/doc/observer.texi observer.h
-
-observer.inc: observer.sh doc/observer.texi
- ${srcdir}/observer.sh inc ${srcdir}/doc/observer.texi observer.inc
-
lint: $(LINTFILES)
$(LINT) $(INCLUDE_CFLAGS) $(LINTFLAGS) $(LINTFILES) \
`echo $(DEPFILES) $(CONFIG_OBS) | sed 's/\.o /\.c /g'`
diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog
index d0b071a..cf5a7af 100644
--- a/gdb/doc/ChangeLog
+++ b/gdb/doc/ChangeLog
@@ -1,3 +1,7 @@
+2016-10-02 Tom Tromey <tom@tromey.com>
+
+ * observer.texi: Remove.
+
2016-09-28 Tom Tromey <tom@tromey.com>
* gdb.texinfo (Packets) <z0>: Use "software breakpoint" rather
diff --git a/gdb/doc/observer.texi b/gdb/doc/observer.texi
deleted file mode 100644
index fc7aac4..0000000
--- a/gdb/doc/observer.texi
+++ /dev/null
@@ -1,309 +0,0 @@
-@c -*-texinfo-*-
-
-@c This file is part of the GDB manual.
-@c
-@c Copyright (C) 2003-2016 Free Software Foundation, Inc.
-@c
-@c See the file gdbint.texinfo for copying conditions.
-@c
-@c Also, the @deftypefun lines from this file are processed into a
-@c header file during the GDB build process. Permission is granted
-@c to redistribute and/or modify those lines under the terms of the
-@c GNU General Public License as published by the Free Software
-@c Foundation; either version 3 of the License, or (at your option)
-@c any later version.
-
-@node GDB Observers
-@appendix @value{GDBN} Currently available observers
-
-@section Implementation rationale
-@cindex observers implementation rationale
-
-An @dfn{observer} is an entity which is interested in being notified
-when GDB reaches certain states, or certain events occur in GDB.
-The entity being observed is called the @dfn{subject}. To receive
-notifications, the observer attaches a callback to the subject.
-One subject can have several observers.
-
-@file{observer.c} implements an internal generic low-level event
-notification mechanism. This generic event notification mechanism is
-then re-used to implement the exported high-level notification
-management routines for all possible notifications.
-
-The current implementation of the generic observer provides support
-for contextual data. This contextual data is given to the subject
-when attaching the callback. In return, the subject will provide
-this contextual data back to the observer as a parameter of the
-callback.
-
-Note that the current support for the contextual data is only partial,
-as it lacks a mechanism that would deallocate this data when the
-callback is detached. This is not a problem so far, as this contextual
-data is only used internally to hold a function pointer. Later on, if
-a certain observer needs to provide support for user-level contextual
-data, then the generic notification mechanism will need to be
-enhanced to allow the observer to provide a routine to deallocate the
-data when attaching the callback.
-
-The observer implementation is also currently not reentrant.
-In particular, it is therefore not possible to call the attach
-or detach routines during a notification.
-
-@section Debugging
-Observer notifications can be traced using the command @samp{set debug
-observer 1} (@pxref{Debugging Output, , Optional messages about
-internal happenings, gdb, Debugging with @var{GDBN}}).
-
-@section @code{normal_stop} Notifications
-@cindex @code{normal_stop} observer
-@cindex notification about inferior execution stop
-
-@value{GDBN} notifies all @code{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 @code{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.
-
-The following interfaces are available to manage observers:
-
-@deftypefun extern struct observer *observer_attach_@var{event} (observer_@var{event}_ftype *@var{f})
-Using the function @var{f}, create an observer that is notified when
-ever @var{event} occurs, return the observer.
-@end deftypefun
-
-@deftypefun extern void observer_detach_@var{event} (struct observer *@var{observer});
-Remove @var{observer} from the list of observers to be notified when
-@var{event} occurs.
-@end deftypefun
-
-@deftypefun extern void observer_notify_@var{event} (void);
-Send a notification to all @var{event} observers.
-@end deftypefun
-
-The following observable events are defined:
-
-@deftypefun void normal_stop (struct bpstats *@var{bs}, int @var{print_frame})
-The inferior has stopped for real. The @var{bs} argument describes
-the breakpoints were are stopped at, if any. Second argument
-@var{print_frame} non-zero means display the location where the
-inferior has stopped.
-@end deftypefun
-
-@deftypefun void signal_received (enum gdb_signal @var{siggnal})
-The inferior was stopped by a signal.
-@end deftypefun
-
-@deftypefun void end_stepping_range (void)
-We are done with a step/next/si/ni command.
-@end deftypefun
-
-@deftypefun void signal_exited (enum gdb_signal @var{siggnal})
-The inferior was terminated by a signal.
-@end deftypefun
-
-@deftypefun void exited (int @var{exitstatus})
-The inferior program is finished.
-@end deftypefun
-
-@deftypefun void no_history (void)
-Reverse execution: target ran out of history info.
-@end deftypefun
-
-@deftypefun void sync_execution_done (void)
-A synchronous command finished.
-@end deftypefun
-
-@deftypefun void command_error (void)
-An error was caught while executing a command.
-@end deftypefun
-
-@deftypefun void target_changed (struct target_ops *@var{target})
-The target's register contents have changed.
-@end deftypefun
-
-@deftypefun void executable_changed (void)
-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).
-@end deftypefun
-
-@deftypefun void inferior_created (struct target_ops *@var{objfile}, int @var{from_tty})
-@value{GDBN} has just connected to an inferior. For @samp{run},
-@value{GDBN} calls this observer while the inferior is still stopped
-at the entry-point instruction. For @samp{attach} and @samp{core},
-@value{GDBN} calls this observer immediately after connecting to the
-inferior, and before any information on the inferior has been printed.
-@end deftypefun
-
-@deftypefun void record_changed (struct inferior *@var{inferior}, int @var{started}, const char *@var{method}, const char *@var{format})
-The status of process record for inferior @var{inferior} in
-@value{GDBN} has changed. The process record is started if
-@var{started} is true, and the process record is stopped if
-@var{started} is false.
-
-When @var{started} is true, @var{method} indicates the short name of the method
-used for recording. If the method supports multiple formats, @var{format}
-indicates which one is being used, otherwise it is NULL. When @var{started} is
-false, they are both NULL.
-@end deftypefun
-
-@deftypefun void solib_loaded (struct so_list *@var{solib})
-The shared library specified by @var{solib} has been loaded. Note that
-when @value{GDBN} calls this observer, the library's symbols probably
-haven't been loaded yet.
-@end deftypefun
-
-@deftypefun void solib_unloaded (struct so_list *@var{solib})
-The shared library specified by @var{solib} has been unloaded.
-Note that when @value{GDBN} calls this observer, the library's
-symbols have not been unloaded yet, and thus are still available.
-@end deftypefun
-
-@deftypefun void new_objfile (struct objfile *@var{objfile})
-The symbol file specified by @var{objfile} has been loaded.
-Called with @var{objfile} equal to @code{NULL} to indicate
-previously loaded symbol table data has now been invalidated.
-@end deftypefun
-
-@deftypefun void free_objfile (struct objfile *@var{objfile})
-The object file specified by @var{objfile} is about to be freed.
-@end deftypefun
-
-@deftypefun void new_thread (struct thread_info *@var{t})
-The thread specified by @var{t} has been created.
-@end deftypefun
-
-@deftypefun void thread_exit (struct thread_info *@var{t}, int @var{silent})
-The thread specified by @var{t} has exited. The @var{silent} argument
-indicates that @value{GDBN} is removing the thread from its tables
-without wanting to notify the user about it.
-@end deftypefun
-
-@deftypefun void thread_stop_requested (ptid_t @var{ptid})
-An explicit stop request was issued to @var{ptid}. If @var{ptid}
-equals @var{minus_one_ptid}, the request applied to all threads. If
-@code{ptid_is_pid(ptid)} returns true, the request applied to all
-threads of the process pointed at by @var{ptid}. Otherwise, the
-request applied to the single thread pointed at by @var{ptid}.
-@end deftypefun
-
-@deftypefun void target_resumed (ptid_t @var{ptid})
-The target was resumed. The @var{ptid} parameter specifies which
-thread was resume, and may be RESUME_ALL if all threads are resumed.
-@end deftypefun
-
-@deftypefun void about_to_proceed (void)
-The target is about to be proceeded.
-@end deftypefun
-
-@deftypefun void breakpoint_created (struct breakpoint *@var{b})
-A new breakpoint @var{b} has been created.
-@end deftypefun
-
-@deftypefun void breakpoint_deleted (struct breakpoint *@var{b})
-A breakpoint has been destroyed. The argument @var{b} is the
-pointer to the destroyed breakpoint.
-@end deftypefun
-
-@deftypefun void breakpoint_modified (struct breakpoint *@var{b})
-A breakpoint has been modified in some way. The argument @var{b}
-is the modified breakpoint.
-@end deftypefun
-
-@deftypefun void traceframe_changed (int @var{tfnum}, int @var{tpnum})
-The trace frame is changed to @var{tfnum} (e.g., by using the
-@code{tfind} command). If @var{tfnum} is negative, it means
-@value{GDBN} resumes live debugging. The number of the tracepoint
-associated with this traceframe is @var{tpnum}.
-@end deftypefun
-
-@deftypefun void architecture_changed (struct gdbarch *@var{newarch})
-The current architecture has changed. The argument @var{newarch} is
-a pointer to the new architecture.
-@end deftypefun
-
-@deftypefun void thread_ptid_changed (ptid_t @var{old_ptid}, ptid_t @var{new_ptid})
-The thread's ptid has changed. The @var{old_ptid} parameter specifies
-the old value, and @var{new_ptid} specifies the new value.
-@end deftypefun
-
-@deftypefun void inferior_added (struct inferior *@var{inf})
-The inferior @var{inf} has been added to the list of inferiors. At
-this point, it might not be associated with any process.
-@end deftypefun
-
-@deftypefun void inferior_appeared (struct inferior *@var{inf})
-The inferior identified by @var{inf} has been attached to a process.
-@end deftypefun
-
-@deftypefun void inferior_exit (struct inferior *@var{inf})
-Either the inferior associated with @var{inf} has been detached from the
-process, or the process has exited.
-@end deftypefun
-
-@deftypefun void inferior_removed (struct inferior *@var{inf})
-The inferior @var{inf} has been removed from the list of inferiors.
-This method is called immediately before freeing @var{inf}.
-@end deftypefun
-
-@deftypefun void memory_changed (struct inferior *@var{inferior}, CORE_ADDR @var{addr}, ssize_t @var{len}, const bfd_byte *@var{data})
-Bytes from @var{data} to @var{data} + @var{len} have been written
-to the @var{inferior} at @var{addr}.
-@end deftypefun
-
-@deftypefun void before_prompt (const char *@var{current_prompt})
-Called before a top-level prompt is displayed. @var{current_prompt} is
-the current top-level prompt.
-@end deftypefun
-
-@deftypefun void gdb_datadir_changed (void)
-Variable gdb_datadir has been set. The value may not necessarily change.
-@end deftypefun
-
-@deftypefun void command_param_changed (const char *@var{param}, const char *@var{value})
-The parameter of some @code{set} commands in console are changed. This
-method is called after a command @code{set @var{param} @var{value}}.
-@var{param} is the parameter of @code{set} command, and @var{value}
-is the value of changed parameter.
-@end deftypefun
-
-@deftypefun void tsv_created (const struct trace_state_variable *@var{tsv})
-The new trace state variable @var{tsv} is created.
-@end deftypefun
-
-@deftypefun void tsv_deleted (const struct trace_state_variable *@var{tsv})
-The trace state variable @var{tsv} is deleted. If @var{tsv} is
-@code{NULL}, all trace state variables are deleted.
-@end deftypefun
-
-@deftypefun void tsv_modified (const struct trace_state_variable *@var{tsv})
-The trace state value @var{tsv} is modified.
-@end deftypefun
-
-@deftypefun void inferior_call_pre (ptid_t @var{thread}, CORE_ADDR @var{address})
-An inferior function at @var{address} is about to be called in thread
-@var{thread}.
-@end deftypefun
-
-@deftypefun void inferior_call_post (ptid_t @var{thread}, CORE_ADDR @var{address})
-The inferior function at @var{address} has just been called. This observer
-is called even if the inferior exits during the call. @var{thread} is the
-thread in which the function was called, which may be different from the
-current thread.
-@end deftypefun
-
-@deftypefun void register_changed (struct frame_info *@var{frame}, int @var{regnum})
-A register in the inferior has been modified by the @value{GDBN} user.
-@end deftypefun
-
-@deftypefun void test_notification (int @var{somearg})
-This observer is used for internal testing. Do not use.
-See testsuite/gdb.gdb/observer.exp.
-@end deftypefun
-
diff --git a/gdb/gdb_function.h b/gdb/gdb_function.h
new file mode 100644
index 0000000..2b8b5b1
--- /dev/null
+++ b/gdb/gdb_function.h
@@ -0,0 +1,149 @@
+/* Functions
+
+ Copyright (C) 2016 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_FUNCTION_H)
+#define GDB_FUNCTION_H
+
+// Replacements for std::function. This only implements the subset of
+// the API needed by gdb. Because we don't have variadic templates,
+// there is a separate template for each required number of arguments.
+// Also, this doesn't do perfect forwarding correctly, so should only
+// be used with C types.
+
+template<typename R>
+class gdb_function0
+{
+ typedef R self_func_type ();
+
+ public:
+
+ gdb_function0 () : m_func (NULL)
+ {
+ }
+
+ gdb_function0 (self_func_type *func) : m_func (func)
+ {
+ }
+
+ R operator() () const
+ {
+ return m_func ();
+ }
+
+ bool operator== (const gdb_function0 &other)
+ {
+ return m_func == other.m_func;
+ }
+
+ private:
+
+ self_func_type *m_func;
+};
+
+template<typename R, typename A>
+class gdb_function1
+{
+ typedef R self_func_type (A);
+
+ public:
+
+ gdb_function1 () : m_func (NULL)
+ {
+ }
+
+ gdb_function1 (self_func_type *func) : m_func (func)
+ {
+ }
+
+ R operator() (A a) const
+ {
+ return m_func (a);
+ }
+
+ bool operator== (const gdb_function1 &other)
+ {
+ return m_func == other.m_func;
+ }
+
+ private:
+
+ self_func_type *m_func;
+};
+
+template<typename R, typename A1, typename A2>
+class gdb_function2
+{
+ typedef R self_func_type (A1, A2);
+
+ public:
+
+ gdb_function2 () : m_func (NULL)
+ {
+ }
+
+ gdb_function2 (self_func_type *func) : m_func (func)
+ {
+ }
+
+ R operator() (A1 a1, A2 a2) const
+ {
+ return m_func (a1, a2);
+ }
+
+ bool operator== (const gdb_function2 &other)
+ {
+ return m_func == other.m_func;
+ }
+
+ private:
+
+ self_func_type *m_func;
+};
+
+template<typename R, typename A1, typename A2, typename A3, typename A4>
+class gdb_function4
+{
+ typedef R self_func_type (A1, A2, A3, A4);
+
+ public:
+
+ gdb_function4 () : m_func (NULL)
+ {
+ }
+
+ gdb_function4 (self_func_type *func) : m_func (func)
+ {
+ }
+
+ R operator() (A1 a1, A2 a2, A3 a3, A4 a4) const
+ {
+ return m_func (a1, a2, a3, a4);
+ }
+
+ bool operator== (const gdb_function4 &other)
+ {
+ return m_func == other.m_func;
+ }
+
+ private:
+
+ self_func_type *m_func;
+};
+
+#endif /* GDB_FUNCTION_H */
diff --git a/gdb/observer.c b/gdb/observer.c
index d678eea..ae7b725 100644
--- a/gdb/observer.c
+++ b/gdb/observer.c
@@ -17,159 +17,109 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
-/* An observer is an entity who is interested in being notified when GDB
- reaches certain states, or certain events occur in GDB. The entity being
- observed is called the Subject. To receive notifications, the observer
- attaches a callback to the subject. One subject can have several
- observers.
-
- This file implements an internal generic low-level event notification
- mechanism based on the Observer paradigm described in the book "Design
- Patterns". This generic event notification mechansim is then re-used
- to implement the exported high-level notification management routines
- for all possible notifications.
-
- The current implementation of the generic observer provides support
- for contextual data. This contextual data is given to the subject
- when attaching the callback. In return, the subject will provide
- this contextual data back to the observer as a parameter of the
- callback.
-
- FIXME: The current support for the contextual data is only partial,
- as it lacks a mechanism that would deallocate this data when the
- callback is detached. This is not a problem so far, as this contextual
- data is only used internally to hold a function pointer. Later on,
- if a certain observer needs to provide support for user-level
- contextual data, then the generic notification mechanism will need
- need to be enhanced to allow the observer to provide a routine to
- deallocate the data when attaching the callback.
-
- This file is currently maintained by hand, but the long term plan
- if the number of different notifications starts growing is to create
- a new script (observer.sh) that would generate this file, and the
- associated documentation. */
-
#include "defs.h"
#include "observer.h"
#include "command.h"
#include "gdbcmd.h"
-static unsigned int observer_debug;
-static void
-show_observer_debug (struct ui_file *file, int from_tty,
- struct cmd_list_element *c, const char *value)
-{
- fprintf_filtered (file, _("Observer debugging is %s.\n"), value);
-}
-
-/* The internal generic observer. */
-
-typedef void (generic_observer_notification_ftype) (const void *data,
- const void *args);
-
-struct observer
-{
- generic_observer_notification_ftype *notify;
- /* No memory management needed for the following field for now. */
- void *data;
-};
-
-/* A list of observers, maintained by the subject. A subject is
- actually represented by its list of observers. */
-
-struct observer_list
-{
- struct observer_list *next;
- struct observer *observer;
-};
-
-/* Allocate a struct observer_list, intended to be used as a node
- in the list of observers maintained by a subject. */
-
-static struct observer_list *
-xalloc_observer_list_node (void)
-{
- struct observer_list *node = XNEW (struct observer_list);
-
- node->observer = XNEW (struct observer);
- return node;
-}
-
-/* The opposite of xalloc_observer_list_node, frees the memory for
- the given node. */
-
-static void
-xfree_observer_list_node (struct observer_list *node)
-{
- xfree (node->observer);
- xfree (node);
-}
-
-/* Attach the callback NOTIFY to a SUBJECT. The DATA is also stored,
- in order for the subject to provide it back to the observer during
- a notification. */
-
-static struct observer *
-generic_observer_attach (struct observer_list **subject,
- generic_observer_notification_ftype * notify,
- void *data)
-{
- struct observer_list *observer_list = xalloc_observer_list_node ();
-
- observer_list->next = *subject;
- observer_list->observer->notify = notify;
- observer_list->observer->data = data;
- *subject = observer_list;
-
- return observer_list->observer;
-}
-
-/* Remove the given OBSERVER from the SUBJECT. Once detached, OBSERVER
- should no longer be used, as it is no longer valid. */
-
-static void
-generic_observer_detach (struct observer_list **subject,
- const struct observer *observer)
+namespace gdb_observers
{
- struct observer_list *previous_node = NULL;
- struct observer_list *current_node = *subject;
-
- while (current_node != NULL)
- {
- if (current_node->observer == observer)
- {
- if (previous_node != NULL)
- previous_node->next = current_node->next;
- else
- *subject = current_node->next;
- xfree_observer_list_node (current_node);
- return;
- }
- previous_node = current_node;
- current_node = current_node->next;
- }
-
- /* We should never reach this point. However, this should not be
- a very serious error, so simply report a warning to the user. */
- warning (_("Failed to detach observer"));
+ unsigned int observer_debug;
+
+ observer2<struct bpstats *, int>
+ normal_stop ("normal_stop");
+ observer1<enum gdb_signal>
+ signal_received ("signal_received");
+ observer0
+ end_stepping_range ("end_stepping_range");
+ observer1<enum gdb_signal>
+ signal_exited ("signal_exited");
+ observer1<int>
+ exited ("exited");
+ observer0
+ no_history ("no_history");
+ observer0
+ sync_execution_done ("sync_execution_done");
+ observer0
+ command_error ("command_error");
+ observer1<struct target_ops *>
+ target_changed ("target_changed");
+ observer0
+ executable_changed ("executable_changed");
+ observer2<struct target_ops *, int>
+ inferior_created ("inferior_created");
+ observer4<struct inferior *, int, const char *, const char *>
+ record_changed ("record_changed");
+ observer1<struct so_list *>
+ solib_loaded ("solib_loaded");
+ observer1<struct so_list *>
+ solib_unloaded ("solib_unloaded");
+ observer1<struct objfile *>
+ new_objfile ("new_objfile");
+ observer1<struct objfile *>
+ free_objfile ("free_objfile");
+ observer1<struct thread_info *>
+ new_thread ("new_thread");
+ observer2<struct thread_info *, int>
+ thread_exit ("thread_exit");
+ observer1<ptid_t>
+ thread_stop_requested ("thread_stop_requested");
+ observer1<ptid_t>
+ target_resumed ("target_resumed");
+ observer0
+ about_to_proceed ("about_to_proceed");
+ observer1<struct breakpoint *>
+ breakpoint_created ("breakpoint_created");
+ observer1<struct breakpoint *>
+ breakpoint_deleted ("breakpoint_deleted");
+ observer1<struct breakpoint *>
+ breakpoint_modified ("breakpoint_modified");
+ observer2<int, int>
+ traceframe_changed ("traceframe_changed");
+ observer1<struct gdbarch *>
+ architecture_changed ("architecture_changed");
+ observer2<ptid_t, ptid_t>
+ thread_ptid_changed ("thread_ptid_changed");
+ observer1<struct inferior *>
+ inferior_added ("inferior_added");
+ observer1<struct inferior *>
+ inferior_appeared ("inferior_appeared");
+ observer1<struct inferior *>
+ inferior_exit ("inferior_exit");
+ observer1<struct inferior *>
+ inferior_removed ("inferior_removed");
+ observer4<struct inferior *, CORE_ADDR,
+ ssize_t, const bfd_byte *>
+ memory_changed ("memory_changed");
+ observer1<const char *>
+ before_prompt ("before_prompt");
+ observer0
+ gdb_datadir_changed ("gdb_datadir_changed");
+ observer2<const char *, const char *>
+ command_param_changed ("command_param_changed");
+ observer1<const struct trace_state_variable *>
+ tsv_created ("tsv_created");
+ observer1<const struct trace_state_variable *>
+ tsv_deleted ("tsv_deleted");
+ observer1<const struct trace_state_variable *>
+ tsv_modified ("tsv_modified");
+ observer2<ptid_t, CORE_ADDR>
+ inferior_call_pre ("inferior_call_pre");
+ observer2<ptid_t, CORE_ADDR>
+ inferior_call_post ("inferior_call_post");
+ observer2<struct frame_info *, int>
+ register_changed ("register_changed");
+ observer1<int>
+ test_notification ("test_notification");
}
-/* Send a notification to all the observers of SUBJECT. ARGS is passed to
- all observers as an argument to the notification callback. */
-
static void
-generic_observer_notify (struct observer_list *subject, const void *args)
+show_observer_debug (struct ui_file *file, int from_tty,
+ struct cmd_list_element *c, const char *value)
{
- struct observer_list *current_node = subject;
-
- while (current_node != NULL)
- {
- (*current_node->observer->notify) (current_node->observer->data, args);
- current_node = current_node->next;
- }
+ fprintf_filtered (file, _("Observer debugging is %s.\n"), value);
}
-
/* The following code is only used to unit-test the observers from our
testsuite. DO NOT USE IT within observer.c (or anywhere else for
that matter)! */
@@ -210,7 +160,7 @@ void
_initialize_observer (void)
{
add_setshow_zuinteger_cmd ("observer", class_maintenance,
- &observer_debug, _("\
+ &gdb_observers::observer_debug, _("\
Set observer debugging."), _("\
Show observer debugging."), _("\
When non-zero, observer debugging is enabled."),
@@ -218,5 +168,3 @@ When non-zero, observer debugging is enabled."),
show_observer_debug,
&setdebuglist, &showdebuglist);
}
-
-#include "observer.inc"
diff --git a/gdb/observer.h b/gdb/observer.h
new file mode 100644
index 0000000..0fa5ab6
--- /dev/null
+++ b/gdb/observer.h
@@ -0,0 +1,394 @@
+/* Observers
+
+ Copyright (C) 2016 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 "gdb_function.h"
+#include <forward_list>
+
+struct bpstats;
+struct so_list;
+struct objfile;
+struct thread_info;
+struct inferior;
+struct trace_state_variable;
+
+namespace gdb_observers
+{
+ extern unsigned int observer_debug;
+
+ // An observer is an entity which is interested in being notified when
+ // GDB reaches certain states, or certain events occur in GDB. The
+ // entity being observed is called the subject. To receive
+ // notifications, the observer attaches a callback to the subject.
+ // One subject can have several observers.
+ //
+ // The observer implementation is also currently not reentrant.
+ // In particular, it is therefore not possible to call the attach
+ // or detach routines during a notification.
+ //
+ // Because we don't have varied templates, we have one template for
+ // each needed number of arguments.
+ class observer0
+ {
+ public:
+
+ typedef gdb_function0<void> func_type;
+
+ observer0 (const char *name) : m_name (name)
+ {
+ }
+
+ func_type attach (const func_type &f)
+ {
+ m_observers.push_front (f);
+ return f;
+ }
+
+ void detach (const func_type &f)
+ {
+ m_observers.remove (f);
+ }
+
+ void notify () const
+ {
+ if (observer_debug)
+ fprintf_unfiltered (gdb_stdlog, "observer %s notify() called\n",
+ m_name);
+ for (iter_type iter = m_observers.begin ();
+ iter != m_observers.end ();
+ ++iter)
+ (*iter) ();
+ }
+
+ private:
+
+ typedef std::forward_list<func_type>::const_iterator iter_type;
+
+ std::forward_list<func_type> m_observers;
+ const char *m_name;
+ };
+
+ template<typename A>
+ class observer1
+ {
+ public:
+
+ typedef gdb_function1<void, A> func_type;
+
+ observer1 (const char *name) : m_name (name)
+ {
+ }
+
+ func_type attach (const func_type &f)
+ {
+ m_observers.push_front (f);
+ return f;
+ }
+
+ void detach (const func_type &f)
+ {
+ m_observers.remove (f);
+ }
+
+ void notify (A arg) const
+ {
+ if (observer_debug)
+ fprintf_unfiltered (gdb_stdlog, "observer %s notify() called\n",
+ m_name);
+ for (iter_type iter = m_observers.begin ();
+ iter != m_observers.end ();
+ ++iter)
+ (*iter) (arg);
+ }
+
+ private:
+
+ typedef typename std::forward_list<func_type>::const_iterator iter_type;
+
+ std::forward_list<func_type> m_observers;
+ const char *m_name;
+ };
+
+
+ template<typename A1, typename A2>
+ class observer2
+ {
+ public:
+
+ typedef gdb_function2<void, A1, A2> func_type;
+
+ observer2 (const char *name) : m_name (name)
+ {
+ }
+
+ func_type attach (const func_type &f)
+ {
+ m_observers.push_front (f);
+ return f;
+ }
+
+ void detach (const func_type &f)
+ {
+ m_observers.remove (f);
+ }
+
+ void notify (A1 arg1, A2 arg2) const
+ {
+ if (observer_debug)
+ fprintf_unfiltered (gdb_stdlog, "observer %s notify() called\n",
+ m_name);
+ for (iter_type iter = m_observers.begin ();
+ iter != m_observers.end ();
+ ++iter)
+ (*iter) (arg1, arg2);
+ }
+
+ private:
+
+ typedef typename std::forward_list<func_type>::const_iterator iter_type;
+
+ std::forward_list<func_type> m_observers;
+ const char *m_name;
+ };
+
+ template<typename A1, typename A2, typename A3, typename A4>
+ class observer4
+ {
+ public:
+
+ typedef gdb_function4<void, A1, A2, A3, A4> func_type;
+
+ observer4 (const char *name) : m_name (name)
+ {
+ }
+
+ func_type attach (const func_type &f)
+ {
+ m_observers.push_front (f);
+ return f;
+ }
+
+ void detach (const func_type &f)
+ {
+ m_observers.remove (f);
+ }
+
+ void notify (A1 arg1, A2 arg2, A3 arg3, A4 arg4) const
+ {
+ if (observer_debug)
+ fprintf_unfiltered (gdb_stdlog, "observer %s notify() called\n",
+ m_name);
+ for (iter_type iter = m_observers.begin ();
+ iter != m_observers.end ();
+ ++iter)
+ (*iter) (arg1, arg2, arg3, arg4);
+ }
+
+ private:
+
+ typedef typename std::forward_list<func_type>::const_iterator iter_type;
+
+ std::forward_list<func_type> m_observers;
+ const char *m_name;
+ };
+
+ // 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.
+ extern observer2<struct bpstats *, int> normal_stop;
+
+ // The inferior was stopped by a signal.
+ extern observer1<enum gdb_signal> signal_received;
+
+ // We are done with a step/next/si/ni command.
+ extern observer0 end_stepping_range;
+
+ // The inferior was terminated by a signal.
+ extern observer1<enum gdb_signal> signal_exited;
+
+ // The inferior program is finished.
+ extern observer1<int> exited;
+
+ // Reverse execution: target ran out of history info.
+ extern observer0 no_history;
+
+ // A synchronous command finished.
+ extern observer0 sync_execution_done;
+
+ // An error was caught while executing a command.
+ extern observer0 command_error;
+
+ // The target's register contents have changed.
+ extern observer1<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 observer0 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 observer2<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 observer4<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 observer1<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 observer1<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 observer1<struct objfile *> new_objfile;
+
+ // The object file specified by objfile is about to be freed.
+ extern observer1<struct objfile *> free_objfile;
+
+ // The thread specified by t has been created.
+ extern observer1<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 observer2<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 observer1<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 observer1<ptid_t> target_resumed;
+
+ // The target is about to be proceeded.
+ extern observer0 about_to_proceed;
+
+ // A new breakpoint b has been created.
+ extern observer1<struct breakpoint *> breakpoint_created;
+
+ // A breakpoint has been destroyed. The argument b is the
+ // pointer to the destroyed breakpoint.
+ extern observer1<struct breakpoint *> breakpoint_deleted;
+
+ // A breakpoint has been modified in some way. The argument b
+ // is the modified breakpoint.
+ extern observer1<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 observer2<int, int> traceframe_changed;
+
+ // The current architecture has changed. The argument newarch is
+ // a pointer to the new architecture.
+ extern observer1<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 observer2<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 observer1<struct inferior *> inferior_added;
+
+ // The inferior identified by inf has been attached to a process.
+ extern observer1<struct inferior *> inferior_appeared;
+
+ // Either the inferior associated with inf has been detached from the
+ // process, or the process has exited.
+ extern observer1<struct inferior *> inferior_exit;
+
+ // The inferior inf has been removed from the list of inferiors.
+ // This method is called immediately before freeing inf.
+ extern observer1<struct inferior *> inferior_removed;
+
+ // Bytes from data to data + len have been written
+ // to the inferior at addr.
+ extern observer4<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 observer1<const char *> before_prompt;
+
+ // Variable gdb_datadir has been set. The value may not necessarily change.
+ extern observer0 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 observer2<const char *, const char *> command_param_changed;
+
+ // The new trace state variable tsv is created.
+ extern observer1<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 observer1<const struct trace_state_variable *> tsv_deleted;
+
+ // The trace state value tsv is modified.
+ extern observer1<const struct trace_state_variable *> tsv_modified;
+
+ // An inferior function at address is about to be called in thread
+ // thread.
+ extern observer2<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 observer2<ptid_t, CORE_ADDR> inferior_call_post;
+
+ // A register in the inferior has been modified by the gdb user.
+ extern observer2<struct frame_info *, int> register_changed;
+
+ // This observer is used for internal testing. Do not use.
+ // See testsuite/gdb.gdb/observer.exp.
+ extern observer1<int> test_notification;
+}
+
+#endif /* GDB_OBSERVER_H */
diff --git a/gdb/observer.sh b/gdb/observer.sh
deleted file mode 100755
index cc613a7..0000000
--- a/gdb/observer.sh
+++ /dev/null
@@ -1,200 +0,0 @@
-#!/bin/sh -e
-
-# Make certain that the script is not running in an internationalized
-# environment.
-LANG=C ; export LANG
-LC_ALL=C ; export LC_ALL
-
-if test $# -ne 3
-then
- echo "Usage: $0 <h|inc> <observer.texi> <observer.out>" 1>&2
- exit 0
-fi
-
-lang=$1 ; shift
-texi=$1 ; shift
-o=$1
-case $lang in
- h) tmp=htmp ;;
- inc) tmp=itmp ;;
-esac
-otmp="`echo $1 | sed -e 's,\.[^.]*$,,'`.$tmp"; shift
-echo "Creating ${otmp}" 1>&2
-rm -f ${otmp}
-
-# Can use any of the following: cat cmp cp diff echo egrep expr false
-# grep install-info ln ls mkdir mv pwd rm rmdir sed sleep sort tar
-# test touch true
-
-cat <<EOF >>${otmp}
-/* GDB Notifications to Observers.
-
- Copyright (C) 2004-2016 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/>.
-
- --
-
- This file was generated using observer.sh and observer.texi. */
-
-EOF
-
-
-case $lang in
- h) cat <<EOF >>${otmp}
-#ifndef OBSERVER_H
-#define OBSERVER_H
-
-struct observer;
-struct bpstats;
-struct so_list;
-struct objfile;
-struct thread_info;
-struct inferior;
-struct trace_state_variable;
-EOF
- ;;
-esac
-
-# We are about to set IFS=:, so DOS-style file names with a drive
-# letter and a colon will be in trouble.
-
-if test -n "$DJGPP"
-then
- texi=`echo $texi | sed -e 's,^\([a-zA-Z]\):/,/dev/\1/,'`
-fi
-
-# generate a list of events that can be observed
-
-IFS=:
-sed -n '
-/@deftypefun void/{
-# Save original line for later processing into the actual parameter
- h
-# Convert from: @deftypefun void EVENT (TYPE @var{PARAM},...)
-# to event and formals: EVENT:TYPE PARAM, ...:
- s/^.* void \([a-z_][a-z_]*\) (\(.*\))$/\1:\2/
- s/@var{//g
- s/}//g
-# Switch to held
- x
-# Convert from: @deftypefun void FUNC (TYPE @var{PARAM},...)
-# to actuals: PARAM, ...
- s/^[^{]*[{]*//
- s/[}]*[^}]*$//
- s/}[^{]*{/, /g
-# Combine held (EVENT:TYPE PARAM, ...:) and pattern (PARAM, ...) into
-# FUNC:TYPE PARAM, ...:PARAM, ...
- H
- x
- s/\n/:/g
- p
-}
-' $texi | while read event formal actual
-do
- case $lang in
- h) cat <<EOF >>${otmp}
-
-/* ${event} notifications. */
-
-typedef void (observer_${event}_ftype) (${formal});
-
-extern struct observer *observer_attach_${event} (observer_${event}_ftype *f);
-extern void observer_detach_${event} (struct observer *observer);
-extern void observer_notify_${event} (${formal});
-EOF
- ;;
-
- inc)
- cat <<EOF >>${otmp}
-
-/* ${event} notifications. */
-
-static struct observer_list *${event}_subject = NULL;
-
-EOF
- if test "$formal" != "void"; then
- cat<<EOF >>${otmp}
-struct ${event}_args { `echo "${formal}" | sed -e 's/,/;/g'`; };
-
-EOF
- fi
- cat <<EOF >>${otmp}
-static void
-observer_${event}_notification_stub (const void *data, const void *args_data)
-{
- observer_${event}_ftype *notify = (observer_${event}_ftype *) data;
-EOF
-
- notify_args=`echo ${actual} | sed -e 's/\([a-z0-9_][a-z0-9_]*\)/args->\1/g'`
-
- if test ! -z "${notify_args}"; then
- cat<<EOF >>${otmp}
- const struct ${event}_args *args = (const struct ${event}_args *) args_data;
-EOF
- fi
- cat <<EOF >>${otmp}
- notify (${notify_args});
-}
-
-struct observer *
-observer_attach_${event} (observer_${event}_ftype *f)
-{
- return generic_observer_attach (&${event}_subject,
- &observer_${event}_notification_stub,
- (void *) f);
-}
-
-void
-observer_detach_${event} (struct observer *observer)
-{
- generic_observer_detach (&${event}_subject, observer);
-}
-
-void
-observer_notify_${event} (${formal})
-{
-EOF
- if test "$formal" != "void"; then
- cat<<EOF >>${otmp}
- struct ${event}_args args;
- `echo ${actual} | sed -e 's/\([a-z0-9_][a-z0-9_]*\)/args.\1 = \1/g'`;
-
-EOF
- else
- echo "char *args = NULL;" >> ${otmp}
- fi
- cat<<EOF >>${otmp}
- if (observer_debug)
- fprintf_unfiltered (gdb_stdlog, "observer_notify_${event}() called\n");
- generic_observer_notify (${event}_subject, &args);
-}
-EOF
- ;;
- esac
-done
-
-
-case $lang in
- h) cat <<EOF >>${otmp}
-
-#endif /* OBSERVER_H */
-EOF
-esac
-
-
-echo Moving ${otmp} to ${o}
-mv ${otmp} ${o}
--
2.7.4
^ permalink raw reply [flat|nested] 6+ messages in thread