doc/ChangeLog:

* observer.texi (GDB Observers): New observer "new_objfile".

ChangeLog:

	* observer.sh: Add "struct objfile" forward declaration.
	* target.h (deprecated_target_new_objfile_hook): Remove.
	* symfile.c (deprecated_target_new_objfile_hook): Remove.
	(clear_symtab_users): Call observer_notify_new_objfile.
	(symbol_file_add_with_addrs_or_offsets): Likewise.
	* rs6000-nat.c: Include "observer.h".
	(vmap_ldinfo): Call observer_notify_new_objfile.
	(xcoff_relocate_core): Likewise.
	* remote.c (remote_new_objfile_chain): Remove.
	(remote_new_objfile): Do not call remote_new_objfile_chain.
	(_initialize_remote): Use observer_attach_new_objfile.
	* tui/tui-hooks.c (tui_target_new_objfile_chain): Remove.
	(tui_new_objfile_hook): Do not call tui_target_new_objfile_chain.
	(_initialize_tui_hooks): Use observer_attach_new_objfile.
	* aix-thread.c: Include "observer.h".
	(target_new_objfile_chain): Remove.
	(new_objfile): Do not call target_new_objfile_chain.
	(_initialize_aix_thread): Use observer_attach_new_objfile.
	* hpux-thread.c: Include "observer.h"
	(target_new_objfile_chain): Remove.
	(hpux_thread_new_objfile): Make static.  Do not call
	target_new_objfile_chain.
	(_initialize_hpux_thread): Use observer_attach_new_objfile.
	* linux-thread-db.c: Include "observer.h".
	(target_new_objfile_chain): Remove.
	(thread_db_new_objfile): Do not call target_new_objfile_chain.
	(_initialize_thread_db): Use observer_attach_new_objfile.
	* sol-thread.c: Include "observer.h".
	(target_new_objfile_chain): Remove.
	(sol_thread_new_objfile): Make static.  Do not call
	target_new_objfile_chain.
	(_initialize_sol_thread): Use observer_attach_new_objfile.
	* Makefile.in (aix-thread.o, hpux-thread.o, linux-thread-db.o,
	rs6000-nat.o, sol-thread.o, tui-hooks.o): Add dependency on
	$(observer_h).
This commit is contained in:
Ulrich Weigand 2007-05-11 19:55:20 +00:00
parent 93ce768456
commit 06d3b283b1
14 changed files with 88 additions and 116 deletions

View File

@ -1,3 +1,41 @@
2007-05-11 Ulrich Weigand <uweigand@de.ibm.com>
* observer.sh: Add "struct objfile" forward declaration.
* target.h (deprecated_target_new_objfile_hook): Remove.
* symfile.c (deprecated_target_new_objfile_hook): Remove.
(clear_symtab_users): Call observer_notify_new_objfile.
(symbol_file_add_with_addrs_or_offsets): Likewise.
* rs6000-nat.c: Include "observer.h".
(vmap_ldinfo): Call observer_notify_new_objfile.
(xcoff_relocate_core): Likewise.
* remote.c (remote_new_objfile_chain): Remove.
(remote_new_objfile): Do not call remote_new_objfile_chain.
(_initialize_remote): Use observer_attach_new_objfile.
* tui/tui-hooks.c (tui_target_new_objfile_chain): Remove.
(tui_new_objfile_hook): Do not call tui_target_new_objfile_chain.
(_initialize_tui_hooks): Use observer_attach_new_objfile.
* aix-thread.c: Include "observer.h".
(target_new_objfile_chain): Remove.
(new_objfile): Do not call target_new_objfile_chain.
(_initialize_aix_thread): Use observer_attach_new_objfile.
* hpux-thread.c: Include "observer.h"
(target_new_objfile_chain): Remove.
(hpux_thread_new_objfile): Make static. Do not call
target_new_objfile_chain.
(_initialize_hpux_thread): Use observer_attach_new_objfile.
* linux-thread-db.c: Include "observer.h".
(target_new_objfile_chain): Remove.
(thread_db_new_objfile): Do not call target_new_objfile_chain.
(_initialize_thread_db): Use observer_attach_new_objfile.
* sol-thread.c: Include "observer.h".
(target_new_objfile_chain): Remove.
(sol_thread_new_objfile): Make static. Do not call
target_new_objfile_chain.
(_initialize_sol_thread): Use observer_attach_new_objfile.
* Makefile.in (aix-thread.o, hpux-thread.o, linux-thread-db.o,
rs6000-nat.o, sol-thread.o, tui-hooks.o): Add dependency on
$(observer_h).
2007-05-11 Ulrich Weigand <uweigand@de.ibm.com>
* gdbarch.sh (remote_translate_xfer_address): Remove.

View File

@ -1708,7 +1708,7 @@ ada-valprint.o: ada-valprint.c $(defs_h) $(gdb_string_h) $(symtab_h) \
$(exceptions_h)
aix-thread.o: aix-thread.c $(defs_h) $(gdb_assert_h) $(gdbthread_h) \
$(target_h) $(inferior_h) $(regcache_h) $(gdbcmd_h) $(ppc_tdep_h) \
$(gdb_string_h)
$(gdb_string_h) $(observer_h)
alphabsd-nat.o: alphabsd-nat.c $(defs_h) $(inferior_h) $(regcache_h) \
$(alpha_tdep_h) $(alphabsd_tdep_h) $(inf_ptrace_h) $(gregset_h) \
$(bsd_kvm_h)
@ -2080,7 +2080,7 @@ hppa-tdep.o: hppa-tdep.c $(defs_h) $(bfd_h) $(inferior_h) $(regcache_h) \
$(hppa_tdep_h) $(gdbtypes_h)
hpux-thread.o: hpux-thread.c $(defs_h) $(gdbthread_h) $(target_h) \
$(inferior_h) $(regcache_h) $(gdb_stat_h) $(gdbcore_h) \
$(hppa_tdep_h)
$(hppa_tdep_h) $(observer_h)
i386bsd-nat.o: i386bsd-nat.c $(defs_h) $(inferior_h) $(regcache_h) \
$(gdb_assert_h) $(i386_tdep_h) $(i387_tdep_h) $(i386bsd_nat_h) \
$(inf_ptrace_h)
@ -2226,7 +2226,7 @@ linux-nat.o: linux-nat.c $(defs_h) $(inferior_h) $(target_h) $(gdb_string_h) \
linux-thread-db.o: linux-thread-db.c $(defs_h) $(gdb_assert_h) \
$(gdb_proc_service_h) $(gdb_thread_db_h) $(bfd_h) $(exceptions_h) \
$(gdbthread_h) $(inferior_h) $(symfile_h) $(objfiles_h) $(target_h) \
$(regcache_h) $(solib_svr4_h) $(gdbcore_h) $(linux_nat_h)
$(regcache_h) $(solib_svr4_h) $(gdbcore_h) $(observer_h) $(linux_nat_h)
m2-exp.o: m2-exp.c $(defs_h) $(gdb_string_h) $(expression_h) $(language_h) \
$(value_h) $(parser_defs_h) $(m2_lang_h) $(bfd_h) $(symfile_h) \
$(objfiles_h) $(block_h)
@ -2505,7 +2505,7 @@ rs6000-nat.o: rs6000-nat.c $(defs_h) $(inferior_h) $(target_h) $(gdbcore_h) \
$(xcoffsolib_h) $(symfile_h) $(objfiles_h) $(libbfd_h) $(bfd_h) \
$(exceptions_h) $(gdb_stabs_h) $(regcache_h) $(arch_utils_h) \
$(inf_ptrace_h) $(ppc_tdep_h) $(rs6000_tdep_h) $(exec_h) \
$(gdb_stdint_h) $(gdb_stat_h)
$(gdb_stdint_h) $(observer_h) $(gdb_stat_h)
rs6000-tdep.o: rs6000-tdep.c $(defs_h) $(frame_h) $(inferior_h) $(symtab_h) \
$(target_h) $(gdbcore_h) $(gdbcmd_h) $(objfiles_h) $(arch_utils_h) \
$(regcache_h) $(regset_h) $(doublest_h) $(value_h) $(parser_defs_h) \
@ -2596,7 +2596,7 @@ solib-svr4.o: solib-svr4.c $(defs_h) $(elf_external_h) $(elf_common_h) \
$(exec_h)
sol-thread.o: sol-thread.c $(defs_h) $(gdbthread_h) $(target_h) \
$(inferior_h) $(gdb_stat_h) $(gdbcmd_h) $(gdbcore_h) $(regcache_h) \
$(solib_h) $(symfile_h) $(gdb_string_h) $(gregset_h)
$(solib_h) $(symfile_h) $(observer_h) $(gdb_string_h) $(gregset_h)
somread.o: somread.c $(defs_h) $(bfd_h) $(symtab_h) $(symfile_h) \
$(objfiles_h) $(buildsym_h) $(stabsread_h) $(gdb_stabs_h) \
$(complaints_h) $(gdb_string_h) $(demangle_h) $(som_h) $(libhppa_h) \
@ -3126,8 +3126,8 @@ tui-file.o: $(srcdir)/tui/tui-file.c $(defs_h) $(ui_file_h) $(tui_file_h) \
tui-hooks.o: $(srcdir)/tui/tui-hooks.c $(defs_h) $(symtab_h) $(inferior_h) \
$(command_h) $(bfd_h) $(symfile_h) $(objfiles_h) $(target_h) \
$(gdbcore_h) $(event_loop_h) $(event_top_h) $(frame_h) \
$(breakpoint_h) $(gdb_events_h) $(ui_out_h) $(top_h) $(tui_h) \
$(tui_hooks_h) $(tui_data_h) $(tui_layout_h) $(tui_io_h) \
$(breakpoint_h) $(gdb_events_h) $(ui_out_h) $(top_h) $(observer_h) \
$(tui_h) $(tui_hooks_h) $(tui_data_h) $(tui_layout_h) $(tui_io_h) \
$(tui_regs_h) $(tui_win_h) $(tui_stack_h) $(tui_windata_h) \
$(tui_winsource_h) $(gdb_curses_h) $(readline_h)
$(CC) -c $(INTERNAL_CFLAGS) $(srcdir)/tui/tui-hooks.c

View File

@ -50,6 +50,7 @@
#include "gdbcmd.h"
#include "ppc-tdep.h"
#include "gdb_string.h"
#include "observer.h"
#include <procinfo.h>
#include <sys/types.h>
@ -129,11 +130,6 @@ static int pd_active = 0;
static int arch64;
/* Saved pointer to previous owner of
deprecated_target_new_objfile_hook. */
static void (*target_new_objfile_chain)(struct objfile *);
/* Forward declarations for pthdb callbacks. */
static int pdc_symbol_addrs (pthdb_user_t, pthdb_symbol_t *, int);
@ -925,7 +921,7 @@ pd_disable (void)
unpush_target (&aix_thread_ops);
}
/* deprecated_target_new_objfile_hook callback.
/* new_objfile observer callback.
If OBJFILE is non-null, check whether a threaded application is
being debugged, and if so, prepare for thread debugging.
@ -939,9 +935,6 @@ new_objfile (struct objfile *objfile)
pd_enable ();
else
pd_disable ();
if (target_new_objfile_chain)
target_new_objfile_chain (objfile);
}
/* Attach to process specified by ARGS. */
@ -1792,8 +1785,7 @@ _initialize_aix_thread (void)
add_target (&aix_thread_ops);
/* Notice when object files get loaded and unloaded. */
target_new_objfile_chain = deprecated_target_new_objfile_hook;
deprecated_target_new_objfile_hook = new_objfile;
observer_attach_new_objfile (new_objfile);
add_setshow_boolean_cmd ("aix-thread", class_maintenance, &debug_aix_thread,
_("Set debugging of AIX thread module."),

View File

@ -1,3 +1,7 @@
2007-05-11 Ulrich Weigand <uweigand@de.ibm.com>
* observer.texi (GDB Observers): New observer "new_objfile".
2007-05-08 Ulrich Weigand <uweigand@de.ibm.com>
* gdbint.texinfo (Native Conditionals): Remove USE_PROC_FS.

View File

@ -122,3 +122,10 @@ haven't been loaded yet.
@deftypefun void solib_unloaded (struct so_list *@var{solib})
The shared library specified by @var{solib} has been unloaded.
@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

View File

@ -48,6 +48,7 @@
#include "gdb_stat.h"
#include "gdbcore.h"
#include "hppa-tdep.h"
#include "observer.h"
extern int child_suppress_run;
@ -461,14 +462,7 @@ hpux_thread_create_inferior (char *exec_file, char *allargs, char **env,
those variables don't show up until the library gets mapped and the symbol
table is read in. */
/* This new_objfile event is now managed by a chained function pointer.
* It is the callee's responsability to call the next client on the chain.
*/
/* Saved pointer to previous owner of the new_objfile event. */
static void (*target_new_objfile_chain) (struct objfile *);
void
static void
hpux_thread_new_objfile (struct objfile *objfile)
{
struct minimal_symbol *ms;
@ -476,28 +470,24 @@ hpux_thread_new_objfile (struct objfile *objfile)
if (!objfile)
{
hpux_thread_active = 0;
goto quit;
return;
}
ms = lookup_minimal_symbol ("cma__g_known_threads", NULL, objfile);
if (!ms)
goto quit;
return;
P_cma__g_known_threads = SYMBOL_VALUE_ADDRESS (ms);
ms = lookup_minimal_symbol ("cma__g_current_thread", NULL, objfile);
if (!ms)
goto quit;
return;
P_cma__g_current_thread = SYMBOL_VALUE_ADDRESS (ms);
hpux_thread_active = 1;
quit:
/* Call predecessor on chain, if any. */
if (target_new_objfile_chain)
target_new_objfile_chain (objfile);
}
/* Clean up after the inferior dies. */
@ -589,6 +579,5 @@ _initialize_hpux_thread (void)
child_suppress_run = 1;
/* Hook into new_objfile notification. */
target_new_objfile_chain = deprecated_target_new_objfile_hook;
deprecated_target_new_objfile_hook = hpux_thread_new_objfile;
observer_attach_new_objfile (hpux_thread_new_objfile);
}

View File

@ -37,6 +37,7 @@
#include "regcache.h"
#include "solib-svr4.h"
#include "gdbcore.h"
#include "observer.h"
#include "linux-nat.h"
#include <signal.h>
@ -58,9 +59,6 @@ static struct target_ops thread_db_ops;
/* The target vector that we call for things this module can't handle. */
static struct target_ops *target_beneath;
/* Pointer to the next function on the objfile event chain. */
static void (*target_new_objfile_chain) (struct objfile * objfile);
/* Non-zero if we're using this module's target vector. */
static int using_thread_db;
@ -650,9 +648,6 @@ thread_db_new_objfile (struct objfile *objfile)
{
if (objfile != NULL)
check_for_thread_db ();
if (target_new_objfile_chain)
target_new_objfile_chain (objfile);
}
/* Attach to a new thread. This function is called when we receive a
@ -1140,7 +1135,6 @@ _initialize_thread_db (void)
add_target (&thread_db_ops);
/* Add ourselves to objfile event chain. */
target_new_objfile_chain = deprecated_target_new_objfile_hook;
deprecated_target_new_objfile_hook = thread_db_new_objfile;
observer_attach_new_objfile (thread_db_new_objfile);
}
}

View File

@ -63,6 +63,7 @@ case $lang in
struct observer;
struct bpstats;
struct so_list;
struct objfile;
EOF
;;
esac

View File

@ -6350,20 +6350,12 @@ build_remote_gdbarch_data (void)
remote_address_size = TARGET_ADDR_BIT;
}
/* Saved pointer to previous owner of the new_objfile event. */
static void (*remote_new_objfile_chain) (struct objfile *);
/* Function to be called whenever a new objfile (shlib) is detected. */
static void
remote_new_objfile (struct objfile *objfile)
{
if (remote_desc != 0) /* Have a remote connection. */
{
remote_check_symbols (objfile);
}
/* Call predecessor on chain, if any. */
if (remote_new_objfile_chain)
remote_new_objfile_chain (objfile);
remote_check_symbols (objfile);
}
void
@ -6403,8 +6395,7 @@ _initialize_remote (void)
add_target (&extended_async_remote_ops);
/* Hook into new objfile notification. */
remote_new_objfile_chain = deprecated_target_new_objfile_hook;
deprecated_target_new_objfile_hook = remote_new_objfile;
observer_attach_new_objfile (remote_new_objfile);
#if 0
init_remote_threadtests ();

View File

@ -39,6 +39,7 @@
#include "rs6000-tdep.h"
#include "exec.h"
#include "gdb_stdint.h"
#include "observer.h"
#include <sys/ptrace.h>
#include <sys/reg.h>
@ -880,8 +881,8 @@ vmap_ldinfo (LdInfo *ldi)
/* Announce new object files. Doing this after symbol relocation
makes aix-thread.c's job easier. */
if (deprecated_target_new_objfile_hook && vp->objfile)
deprecated_target_new_objfile_hook (vp->objfile);
if (vp->objfile)
observer_notify_new_objfile (vp->objfile);
/* There may be more, so we don't break out of the loop. */
}
@ -1164,8 +1165,8 @@ xcoff_relocate_core (struct target_ops *target)
vmap_symtab (vp);
if (deprecated_target_new_objfile_hook && vp != vmap && vp->objfile)
deprecated_target_new_objfile_hook (vp->objfile);
if (vp != vmap && vp->objfile)
observer_notify_new_objfile (vp->objfile);
}
while (LDI_NEXT (ldi, arch64) != 0);
vmap_exec ();

View File

@ -66,6 +66,7 @@
#include "regcache.h"
#include "solib.h"
#include "symfile.h"
#include "observer.h"
#include "gdb_string.h"
@ -777,16 +778,9 @@ sol_thread_create_inferior (char *exec_file, char *allargs, char **env,
when all symbol tables are removed. libthread_db can only be
initialized when it finds the right variables in libthread.so.
Since it's a shared library, those variables don't show up until
the library gets mapped and the symbol table is read in.
the library gets mapped and the symbol table is read in. */
This new_objfile event is managed by a chained function pointer.
It is the callee's responsability to call the next client on the
chain. */
/* Saved pointer to previous owner of the new_objfile event. */
static void (*target_new_objfile_chain) (struct objfile *);
void
static void
sol_thread_new_objfile (struct objfile *objfile)
{
td_err_e val;
@ -794,13 +788,13 @@ sol_thread_new_objfile (struct objfile *objfile)
if (!objfile)
{
sol_thread_active = 0;
goto quit;
return;
}
/* Don't do anything if init failed to resolve the libthread_db
library. */
if (!procfs_suppress_run)
goto quit;
return;
/* Now, initialize libthread_db. This needs to be done after the
shared libraries are located because it needs information from
@ -810,24 +804,19 @@ sol_thread_new_objfile (struct objfile *objfile)
if (val != TD_OK)
{
warning (_("sol_thread_new_objfile: td_init: %s"), td_err_string (val));
goto quit;
return;
}
val = p_td_ta_new (&main_ph, &main_ta);
if (val == TD_NOLIBTHREAD)
goto quit;
return;
else if (val != TD_OK)
{
warning (_("sol_thread_new_objfile: td_ta_new: %s"), td_err_string (val));
goto quit;
return;
}
sol_thread_active = 1;
quit:
/* Call predecessor on chain, if any. */
if (target_new_objfile_chain)
target_new_objfile_chain (objfile);
}
/* Clean up after the inferior dies. */
@ -1667,8 +1656,7 @@ _initialize_sol_thread (void)
add_target (&core_ops);
/* Hook into new_objfile notification. */
target_new_objfile_chain = deprecated_target_new_objfile_hook;
deprecated_target_new_objfile_hook = sol_thread_new_objfile;
observer_attach_new_objfile (sol_thread_new_objfile);
return;
die:

View File

@ -71,7 +71,6 @@ void (*deprecated_show_load_progress) (const char *section,
unsigned long total_size);
void (*deprecated_pre_add_symbol_hook) (const char *);
void (*deprecated_post_add_symbol_hook) (void);
void (*deprecated_target_new_objfile_hook) (struct objfile *);
static void clear_symtab_users_cleanup (void *ignore);
@ -1067,8 +1066,7 @@ symbol_file_add_with_addrs_or_offsets (bfd *abfd, int from_tty,
new_symfile_objfile (objfile, mainline, from_tty);
if (deprecated_target_new_objfile_hook)
deprecated_target_new_objfile_hook (objfile);
observer_notify_new_objfile (objfile);
bfd_cache_close_all ();
return (objfile);
@ -2643,8 +2641,7 @@ clear_symtab_users (void)
breakpoint_re_set ();
set_default_breakpoint (0, 0, 0, 0);
clear_pc_function_cache ();
if (deprecated_target_new_objfile_hook)
deprecated_target_new_objfile_hook (NULL);
observer_notify_new_objfile (NULL);
/* Clear globals which might have pointed into a removed objfile.
FIXME: It's not clear which of these are supposed to persist

View File

@ -1007,31 +1007,6 @@ extern char *normal_pid_to_str (ptid_t ptid);
#define target_extra_thread_info(TP) \
(current_target.to_extra_thread_info (TP))
/*
* New Objfile Event Hook:
*
* Sometimes a GDB component wants to get notified whenever a new
* objfile is loaded. Mainly this is used by thread-debugging
* implementations that need to know when symbols for the target
* thread implemenation are available.
*
* The old way of doing this is to define a macro 'target_new_objfile'
* that points to the function that you want to be called on every
* objfile/shlib load.
The new way is to grab the function pointer,
'deprecated_target_new_objfile_hook', and point it to the function
that you want to be called on every objfile/shlib load.
If multiple clients are willing to be cooperative, they can each
save a pointer to the previous value of
deprecated_target_new_objfile_hook before modifying it, and arrange
for their function to call the previous function in the chain. In
that way, multiple clients can receive this notification (something
like with signal handlers). */
extern void (*deprecated_target_new_objfile_hook) (struct objfile *);
#ifndef target_pid_or_tid_to_str
#define target_pid_or_tid_to_str(ID) \
target_pid_to_str (ID)

View File

@ -36,6 +36,7 @@
#include "gdb-events.h"
#include "ui-out.h"
#include "top.h"
#include "observer.h"
#include <unistd.h>
#include <fcntl.h>
@ -59,16 +60,11 @@
int tui_target_has_run = 0;
static void (* tui_target_new_objfile_chain) (struct objfile*);
static void
tui_new_objfile_hook (struct objfile* objfile)
{
if (tui_active)
tui_display_main ();
if (tui_target_new_objfile_chain)
tui_target_new_objfile_chain (objfile);
}
static int ATTR_FORMAT (printf, 1, 0)
@ -302,6 +298,5 @@ void
_initialize_tui_hooks (void)
{
/* Install the permanent hooks. */
tui_target_new_objfile_chain = deprecated_target_new_objfile_hook;
deprecated_target_new_objfile_hook = tui_new_objfile_hook;
observer_attach_new_objfile (tui_new_objfile_hook);
}