Move solib_ops into gdbarch
authorTom Tromey <tromey@adacore.com>
Mon, 8 Aug 2022 16:41:43 +0000 (10:41 -0600)
committerTom Tromey <tromey@adacore.com>
Tue, 20 Sep 2022 18:25:19 +0000 (12:25 -0600)
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.

17 files changed:
gdb/amd64-darwin-tdep.c
gdb/arch-utils.c
gdb/dicos-tdep.c
gdb/frv-tdep.c
gdb/gdbarch-components.py
gdb/gdbarch-gen.h
gdb/gdbarch.c
gdb/i386-darwin-tdep.c
gdb/i386-nto-tdep.c
gdb/mips-linux-tdep.c
gdb/ppc-linux-tdep.c
gdb/rs6000-aix-tdep.c
gdb/solib-svr4.c
gdb/solib.c
gdb/solib.h
gdb/tic6x-linux-tdep.c
gdb/windows-tdep.c

index 7fc35536bc6e46e37142168e885eeeab519aae2f..718bf4996e510137608327b3d16a95fd174f0bd3 100644 (file)
@@ -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 ();
index 9bd4f0ddae66e8bbbc30e70cdd35b7e901bb2780..5943965bd75a41d84a2276fae7b06fdef1c881fc 100644 (file)
@@ -36,6 +36,7 @@
 #include "reggroups.h"
 #include "auxv.h"
 #include "observable.h"
+#include "solib-target.h"
 
 #include "gdbsupport/version.h"
 
index caff2474719c11b771bf6827644b4f232d0111b3..d22dfd65c60347635854f67b7383c934a2e3308f 100644 (file)
@@ -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,
index 8029080c0435b12e665bec6974dcb7678e79c7a1..8bbc2fa57aed01aa10d2cb079fc46e67f374f840 100644 (file)
@@ -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);
index 71aa5991fbe0fd6daf21cd4f0c8b56e3188e4172..ad71bf754de9de2a61274800a95e11e9c21bbd44 100644 (file)
@@ -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
index 0504962e50d216273e81cc115faf161004224c99..c7a24704c7cf85774b75d6ffff73e9643500978d 100644 (file)
@@ -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. */
index 0edae7f6f0a2465d425bcd59a65e3be233ba40dd..18d46a39d7a5ba0bee6ed9ebc69673837078a8c6 100644 (file)
@@ -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 */
@@ -1012,6 +1015,9 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file)
   gdb_printf (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));
@@ -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)
 {
index 2a9198aceb38a913b52b721b20d9ec91935b59e7..5e7929b2c99d2a31427e2416745d48b63fcca812 100644 (file)
@@ -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
index 259867f262b8b11917cfbc7aadfad44ef9493f30..69d298c871ffaa02c80063633fe67c58f9617b4a 100644 (file)
@@ -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);
index ca313a2827970ab72a0df892346dfecfb7e43cd7..7dae1ca34de1c6e4a569b5b5bf51b5ff54219a35 100644 (file)
@@ -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);
 
index beef4bd393c9739c5293512c661d9b0557ba2162..ed154fd4a637e60250640a113f032ef1695ea05e 100644 (file)
@@ -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);
     }
index 41384993c26ab38acc59c7f222a0a46859d6a3f0..86270c81855b3ba355f1235dad2d0a3ffb26e8de 100644 (file)
@@ -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);
 }
 
index 95a1e1eb72238b7c389df9fe7ca4eea4efacfed0..893da86e27ea5309ce3f5b7c52a80a2e866d1c32 100644 (file)
@@ -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);
 }
index 859d345f39c7d8d8b4a12543ecc27345a619043c..7cfdd81114c4608486e87b1f63e9bd681e7273c0 100644 (file)
 
 /* 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);
-}
 \f
 
 /* 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
index 251028472c0251525fccbb92237e01b29948509b..a7e751ed9b31c982aaa40db615907b2e470c4595 100644 (file)
@@ -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
index b2422d1ccc0e9dc0c29216cd239a495f3621ea75..b99cfc0d5e30a7697694ef36ccd25a5b689874fa 100644 (file)
@@ -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;
 
index 702af65d4500011d30755350fdb8f70a299571c7..e5e37fcaa53336c4108a3e8914eb8889639de0d6 100644 (file)
@@ -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);
 }