diff options
author | Tom Tromey <tromey@adacore.com> | 2022-08-08 10:41:43 -0600 |
---|---|---|
committer | Tom Tromey <tromey@adacore.com> | 2022-09-20 12:25:19 -0600 |
commit | 9e468e953cd2f605a3f51d6ef6532e46b8fdd7b4 (patch) | |
tree | 2368c5b3ea5ed2f5aa78b92c384186f3290763b2 /gdb | |
parent | 5898c79ae692ed02dd9267888541b352423a9331 (diff) | |
download | gdb-9e468e953cd2f605a3f51d6ef6532e46b8fdd7b4.zip gdb-9e468e953cd2f605a3f51d6ef6532e46b8fdd7b4.tar.gz gdb-9e468e953cd2f605a3f51d6ef6532e46b8fdd7b4.tar.bz2 |
Move solib_ops into gdbarch
This changs solib_ops to be an ordinary gdbarch value and updates all
the uses. This removes a longstanding FIXME and makes the code
somewhat cleaner as well.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/amd64-darwin-tdep.c | 2 | ||||
-rw-r--r-- | gdb/arch-utils.c | 1 | ||||
-rw-r--r-- | gdb/dicos-tdep.c | 2 | ||||
-rw-r--r-- | gdb/frv-tdep.c | 2 | ||||
-rw-r--r-- | gdb/gdbarch-components.py | 8 | ||||
-rw-r--r-- | gdb/gdbarch-gen.h | 5 | ||||
-rw-r--r-- | gdb/gdbarch.c | 22 | ||||
-rw-r--r-- | gdb/i386-darwin-tdep.c | 2 | ||||
-rw-r--r-- | gdb/i386-nto-tdep.c | 2 | ||||
-rw-r--r-- | gdb/mips-linux-tdep.c | 2 | ||||
-rw-r--r-- | gdb/ppc-linux-tdep.c | 2 | ||||
-rw-r--r-- | gdb/rs6000-aix-tdep.c | 2 | ||||
-rw-r--r-- | gdb/solib-svr4.c | 2 | ||||
-rw-r--r-- | gdb/solib.c | 48 | ||||
-rw-r--r-- | gdb/solib.h | 5 | ||||
-rw-r--r-- | gdb/tic6x-linux-tdep.c | 2 | ||||
-rw-r--r-- | gdb/windows-tdep.c | 2 |
17 files changed, 59 insertions, 52 deletions
diff --git a/gdb/amd64-darwin-tdep.c b/gdb/amd64-darwin-tdep.c index 7fc3553..718bf49 100644 --- a/gdb/amd64-darwin-tdep.c +++ b/gdb/amd64-darwin-tdep.c @@ -113,7 +113,7 @@ x86_darwin_init_abi_64 (struct gdbarch_info info, struct gdbarch *gdbarch) tdep->jb_pc_offset = 56; - set_solib_ops (gdbarch, &darwin_so_ops); + set_gdbarch_so_ops (gdbarch, &darwin_so_ops); } void _initialize_amd64_darwin_tdep (); diff --git a/gdb/arch-utils.c b/gdb/arch-utils.c index 9bd4f0d..5943965 100644 --- a/gdb/arch-utils.c +++ b/gdb/arch-utils.c @@ -36,6 +36,7 @@ #include "reggroups.h" #include "auxv.h" #include "observable.h" +#include "solib-target.h" #include "gdbsupport/version.h" diff --git a/gdb/dicos-tdep.c b/gdb/dicos-tdep.c index caff247..d22dfd6 100644 --- a/gdb/dicos-tdep.c +++ b/gdb/dicos-tdep.c @@ -28,7 +28,7 @@ void dicos_init_abi (struct gdbarch *gdbarch) { - set_solib_ops (gdbarch, &solib_target_so_ops); + set_gdbarch_so_ops (gdbarch, &solib_target_so_ops); /* Every process, although has its own address space, sees the same list of shared libraries. There's no "main executable" in DICOS, diff --git a/gdb/frv-tdep.c b/gdb/frv-tdep.c index 8029080..8bbc2fa 100644 --- a/gdb/frv-tdep.c +++ b/gdb/frv-tdep.c @@ -1556,7 +1556,7 @@ frv_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_convert_from_func_ptr_addr (gdbarch, frv_convert_from_func_ptr_addr); - set_solib_ops (gdbarch, &frv_so_ops); + set_gdbarch_so_ops (gdbarch, &frv_so_ops); /* Hook in ABI-specific overrides, if they have been registered. */ gdbarch_init_osabi (info, gdbarch); diff --git a/gdb/gdbarch-components.py b/gdb/gdbarch-components.py index 71aa599..ad71bf7 100644 --- a/gdb/gdbarch-components.py +++ b/gdb/gdbarch-components.py @@ -1262,6 +1262,14 @@ Function( invalid=False, ) +Value( + comment="Vtable of solib operations functions.", + type="const struct target_so_ops *", + name="so_ops", + postdefault="&solib_target_so_ops", + printer="host_address_to_string (gdbarch->so_ops)", +) + Method( comment=""" If in_solib_dynsym_resolve_code() returns true, and SKIP_SOLIB_RESOLVER diff --git a/gdb/gdbarch-gen.h b/gdb/gdbarch-gen.h index 0504962..c7a2470 100644 --- a/gdb/gdbarch-gen.h +++ b/gdb/gdbarch-gen.h @@ -702,6 +702,11 @@ typedef CORE_ADDR (gdbarch_skip_trampoline_code_ftype) (struct frame_info *frame extern CORE_ADDR gdbarch_skip_trampoline_code (struct gdbarch *gdbarch, struct frame_info *frame, CORE_ADDR pc); extern void set_gdbarch_skip_trampoline_code (struct gdbarch *gdbarch, gdbarch_skip_trampoline_code_ftype *skip_trampoline_code); +/* Vtable of solib operations functions. */ + +extern const struct target_so_ops * gdbarch_so_ops (struct gdbarch *gdbarch); +extern void set_gdbarch_so_ops (struct gdbarch *gdbarch, const struct target_so_ops * so_ops); + /* If in_solib_dynsym_resolve_code() returns true, and SKIP_SOLIB_RESOLVER evaluates non-zero, this is the address where the debugger will place a step-resume breakpoint to get us past the dynamic linker. */ diff --git a/gdb/gdbarch.c b/gdb/gdbarch.c index 0edae7f..18d46a3 100644 --- a/gdb/gdbarch.c +++ b/gdb/gdbarch.c @@ -153,6 +153,7 @@ struct gdbarch gdbarch_single_step_through_delay_ftype *single_step_through_delay = nullptr; gdbarch_print_insn_ftype *print_insn = nullptr; gdbarch_skip_trampoline_code_ftype *skip_trampoline_code = nullptr; + const struct target_so_ops * so_ops = 0; gdbarch_skip_solib_resolver_ftype *skip_solib_resolver = nullptr; gdbarch_in_solib_return_trampoline_ftype *in_solib_return_trampoline = nullptr; gdbarch_in_indirect_branch_thunk_ftype *in_indirect_branch_thunk = nullptr; @@ -504,6 +505,8 @@ verify_gdbarch (struct gdbarch *gdbarch) /* Skip verify of single_step_through_delay, has predicate. */ /* Skip verify of print_insn, invalid_p == 0 */ /* Skip verify of skip_trampoline_code, invalid_p == 0 */ + if (gdbarch->so_ops == 0) + gdbarch->so_ops = &solib_target_so_ops; /* Skip verify of skip_solib_resolver, invalid_p == 0 */ /* Skip verify of in_solib_return_trampoline, invalid_p == 0 */ /* Skip verify of in_indirect_branch_thunk, invalid_p == 0 */ @@ -1013,6 +1016,9 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file) "gdbarch_dump: skip_trampoline_code = <%s>\n", host_address_to_string (gdbarch->skip_trampoline_code)); gdb_printf (file, + "gdbarch_dump: so_ops = %s\n", + host_address_to_string (gdbarch->so_ops)); + gdb_printf (file, "gdbarch_dump: skip_solib_resolver = <%s>\n", host_address_to_string (gdbarch->skip_solib_resolver)); gdb_printf (file, @@ -3366,6 +3372,22 @@ set_gdbarch_skip_trampoline_code (struct gdbarch *gdbarch, gdbarch->skip_trampoline_code = skip_trampoline_code; } +const struct target_so_ops * +gdbarch_so_ops (struct gdbarch *gdbarch) +{ + gdb_assert (gdbarch != NULL); + if (gdbarch_debug >= 2) + gdb_printf (gdb_stdlog, "gdbarch_so_ops called\n"); + return gdbarch->so_ops; +} + +void +set_gdbarch_so_ops (struct gdbarch *gdbarch, + const struct target_so_ops * so_ops) +{ + gdbarch->so_ops = so_ops; +} + CORE_ADDR gdbarch_skip_solib_resolver (struct gdbarch *gdbarch, CORE_ADDR pc) { diff --git a/gdb/i386-darwin-tdep.c b/gdb/i386-darwin-tdep.c index 2a9198a..5e7929b 100644 --- a/gdb/i386-darwin-tdep.c +++ b/gdb/i386-darwin-tdep.c @@ -271,7 +271,7 @@ i386_darwin_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) alignment. */ set_gdbarch_long_double_bit (gdbarch, 128); - set_solib_ops (gdbarch, &darwin_so_ops); + set_gdbarch_so_ops (gdbarch, &darwin_so_ops); } static enum gdb_osabi diff --git a/gdb/i386-nto-tdep.c b/gdb/i386-nto-tdep.c index 259867f..69d298c 100644 --- a/gdb/i386-nto-tdep.c +++ b/gdb/i386-nto-tdep.c @@ -361,7 +361,7 @@ i386nto_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) nto_svr4_so_ops.in_dynsym_resolve_code = nto_in_dynsym_resolve_code; } - set_solib_ops (gdbarch, &nto_svr4_so_ops); + set_gdbarch_so_ops (gdbarch, &nto_svr4_so_ops); set_gdbarch_wchar_bit (gdbarch, 32); set_gdbarch_wchar_signed (gdbarch, 0); diff --git a/gdb/mips-linux-tdep.c b/gdb/mips-linux-tdep.c index ca313a2..7dae1ca 100644 --- a/gdb/mips-linux-tdep.c +++ b/gdb/mips-linux-tdep.c @@ -1594,7 +1594,7 @@ mips_linux_init_abi (struct gdbarch_info info, mips_svr4_so_ops.in_dynsym_resolve_code = mips_linux_in_dynsym_resolve_code; } - set_solib_ops (gdbarch, &mips_svr4_so_ops); + set_gdbarch_so_ops (gdbarch, &mips_svr4_so_ops); set_gdbarch_write_pc (gdbarch, mips_linux_write_pc); diff --git a/gdb/ppc-linux-tdep.c b/gdb/ppc-linux-tdep.c index beef4bd..ed154fd 100644 --- a/gdb/ppc-linux-tdep.c +++ b/gdb/ppc-linux-tdep.c @@ -2126,7 +2126,7 @@ ppc_linux_init_abi (struct gdbarch_info info, powerpc_so_ops.in_dynsym_resolve_code = powerpc_linux_in_dynsym_resolve_code; } - set_solib_ops (gdbarch, &powerpc_so_ops); + set_gdbarch_so_ops (gdbarch, &powerpc_so_ops); set_gdbarch_skip_solib_resolver (gdbarch, glibc_skip_solib_resolver); } diff --git a/gdb/rs6000-aix-tdep.c b/gdb/rs6000-aix-tdep.c index 4138499..86270c8 100644 --- a/gdb/rs6000-aix-tdep.c +++ b/gdb/rs6000-aix-tdep.c @@ -1180,7 +1180,7 @@ rs6000_aix_init_osabi (struct gdbarch_info info, struct gdbarch *gdbarch) set_gdbarch_wchar_signed (gdbarch, 0); set_gdbarch_auto_wide_charset (gdbarch, rs6000_aix_auto_wide_charset); - set_solib_ops (gdbarch, &solib_aix_so_ops); + set_gdbarch_so_ops (gdbarch, &solib_aix_so_ops); frame_unwind_append_unwinder (gdbarch, &aix_sighandle_frame_unwind); } diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c index 95a1e1e..893da86 100644 --- a/gdb/solib-svr4.c +++ b/gdb/solib-svr4.c @@ -3026,7 +3026,7 @@ set_solib_svr4_fetch_link_map_offsets (struct gdbarch *gdbarch, ops->fetch_link_map_offsets = flmo; - set_solib_ops (gdbarch, &svr4_so_ops); + set_gdbarch_so_ops (gdbarch, &svr4_so_ops); set_gdbarch_iterate_over_objfiles_in_search_order (gdbarch, svr4_iterate_over_objfiles_in_search_order); } diff --git a/gdb/solib.c b/gdb/solib.c index 859d345..7cfdd81 100644 --- a/gdb/solib.c +++ b/gdb/solib.c @@ -57,30 +57,6 @@ /* Architecture-specific operations. */ -/* Per-architecture data key. */ -static const registry<gdbarch>::key<const struct target_so_ops, - gdb::noop_deleter<const struct target_so_ops>> - solib_data; - -static const struct target_so_ops * -solib_ops (struct gdbarch *gdbarch) -{ - const struct target_so_ops *result = solib_data.get (gdbarch); - if (result == nullptr) - { - result = &solib_target_so_ops; - set_solib_ops (gdbarch, &solib_target_so_ops); - } - return result; -} - -/* Set the solib operations for GDBARCH to NEW_OPS. */ - -void -set_solib_ops (struct gdbarch *gdbarch, const struct target_so_ops *new_ops) -{ - solib_data.set (gdbarch, new_ops); -} /* external data declarations */ @@ -145,7 +121,7 @@ show_solib_search_path (struct ui_file *file, int from_tty, static gdb::unique_xmalloc_ptr<char> solib_find_1 (const char *in_pathname, int *fd, bool is_solib) { - const struct target_so_ops *ops = solib_ops (target_gdbarch ()); + const struct target_so_ops *ops = gdbarch_so_ops (target_gdbarch ()); int found_file = -1; gdb::unique_xmalloc_ptr<char> temp_pathname; const char *fskind = effective_target_file_system_kind (); @@ -576,7 +552,7 @@ get_cbfd_soname_build_id (gdb_bfd_ref_ptr abfd, const char *soname) static int solib_map_sections (struct so_list *so) { - const struct target_so_ops *ops = solib_ops (target_gdbarch ()); + const struct target_so_ops *ops = gdbarch_so_ops (target_gdbarch ()); gdb::unique_xmalloc_ptr<char> filename (tilde_expand (so->so_name)); gdb_bfd_ref_ptr abfd (ops->bfd_open (filename.get ())); @@ -670,7 +646,7 @@ solib_map_sections (struct so_list *so) static void clear_so (struct so_list *so) { - const struct target_so_ops *ops = solib_ops (target_gdbarch ()); + const struct target_so_ops *ops = gdbarch_so_ops (target_gdbarch ()); delete so->sections; so->sections = NULL; @@ -707,7 +683,7 @@ clear_so (struct so_list *so) void free_so (struct so_list *so) { - const struct target_so_ops *ops = solib_ops (target_gdbarch ()); + const struct target_so_ops *ops = gdbarch_so_ops (target_gdbarch ()); clear_so (so); ops->free_so (so); @@ -793,7 +769,7 @@ solib_used (const struct so_list *const known) void update_solib_list (int from_tty) { - const struct target_so_ops *ops = solib_ops (target_gdbarch ()); + const struct target_so_ops *ops = gdbarch_so_ops (target_gdbarch ()); struct so_list *inferior = ops->current_sos(); struct so_list *gdb, **gdb_link; @@ -1234,7 +1210,7 @@ solib_name_from_address (struct program_space *pspace, CORE_ADDR address) bool solib_keep_data_in_core (CORE_ADDR vaddr, unsigned long size) { - const struct target_so_ops *ops = solib_ops (target_gdbarch ()); + const struct target_so_ops *ops = gdbarch_so_ops (target_gdbarch ()); if (ops->keep_data_in_core) return ops->keep_data_in_core (vaddr, size) != 0; @@ -1247,7 +1223,7 @@ solib_keep_data_in_core (CORE_ADDR vaddr, unsigned long size) void clear_solib (void) { - const struct target_so_ops *ops = solib_ops (target_gdbarch ()); + const struct target_so_ops *ops = gdbarch_so_ops (target_gdbarch ()); disable_breakpoints_in_shlibs (); @@ -1272,7 +1248,7 @@ clear_solib (void) void solib_create_inferior_hook (int from_tty) { - const struct target_so_ops *ops = solib_ops (target_gdbarch ()); + const struct target_so_ops *ops = gdbarch_so_ops (target_gdbarch ()); ops->solib_create_inferior_hook (from_tty); } @@ -1282,7 +1258,7 @@ solib_create_inferior_hook (int from_tty) bool in_solib_dynsym_resolve_code (CORE_ADDR pc) { - const struct target_so_ops *ops = solib_ops (target_gdbarch ()); + const struct target_so_ops *ops = gdbarch_so_ops (target_gdbarch ()); return ops->in_dynsym_resolve_code (pc) != 0; } @@ -1318,7 +1294,7 @@ no_shared_libraries (const char *ignored, int from_tty) void update_solib_breakpoints (void) { - const struct target_so_ops *ops = solib_ops (target_gdbarch ()); + const struct target_so_ops *ops = gdbarch_so_ops (target_gdbarch ()); if (ops->update_breakpoints != NULL) ops->update_breakpoints (); @@ -1329,7 +1305,7 @@ update_solib_breakpoints (void) void handle_solib_event (void) { - const struct target_so_ops *ops = solib_ops (target_gdbarch ()); + const struct target_so_ops *ops = gdbarch_so_ops (target_gdbarch ()); if (ops->handle_event != NULL) ops->handle_event (); @@ -1417,7 +1393,7 @@ reload_shared_libraries (const char *ignored, int from_tty, reload_shared_libraries_1 (from_tty); - ops = solib_ops (target_gdbarch ()); + ops = gdbarch_so_ops (target_gdbarch ()); /* Creating inferior hooks here has two purposes. First, if we reload shared libraries then the address of solib breakpoint we've computed diff --git a/gdb/solib.h b/gdb/solib.h index 2510284..a7e751e 100644 --- a/gdb/solib.h +++ b/gdb/solib.h @@ -71,11 +71,6 @@ extern bool in_solib_dynsym_resolve_code (CORE_ADDR); extern void no_shared_libraries (const char *ignored, int from_tty); -/* Set the solib operations for GDBARCH to NEW_OPS. */ - -extern void set_solib_ops (struct gdbarch *gdbarch, - const struct target_so_ops *new_ops); - /* Synchronize GDB's shared object list with inferior's. Extract the list of currently loaded shared objects from the diff --git a/gdb/tic6x-linux-tdep.c b/gdb/tic6x-linux-tdep.c index b2422d1..b99cfc0 100644 --- a/gdb/tic6x-linux-tdep.c +++ b/gdb/tic6x-linux-tdep.c @@ -170,7 +170,7 @@ tic6x_uclinux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) linux_init_abi (info, gdbarch, 0); /* Shared library handling. */ - set_solib_ops (gdbarch, &dsbt_so_ops); + set_gdbarch_so_ops (gdbarch, &dsbt_so_ops); tdep->syscall_next_pc = tic6x_linux_syscall_next_pc; diff --git a/gdb/windows-tdep.c b/gdb/windows-tdep.c index 702af65..e5e37fc 100644 --- a/gdb/windows-tdep.c +++ b/gdb/windows-tdep.c @@ -931,7 +931,7 @@ windows_init_abi_common (struct gdbarch_info info, struct gdbarch *gdbarch) windows_so_ops = solib_target_so_ops; windows_so_ops.solib_create_inferior_hook = windows_solib_create_inferior_hook; - set_solib_ops (gdbarch, &windows_so_ops); + set_gdbarch_so_ops (gdbarch, &windows_so_ops); set_gdbarch_get_siginfo_type (gdbarch, windows_get_siginfo_type); } |