From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-il1-x134.google.com (mail-il1-x134.google.com [IPv6:2607:f8b0:4864:20::134]) by sourceware.org (Postfix) with ESMTPS id 1CE6F385702B for ; Mon, 8 Aug 2022 19:28:07 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 1CE6F385702B Received: by mail-il1-x134.google.com with SMTP id o14so5413840ilt.2 for ; Mon, 08 Aug 2022 12:28:07 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc; bh=FrHp7Cd7RhkWYmMqR3Ulkgf9pqkZOZYJ/E+lPRNIi4M=; b=5G6d62fVzwB33gfetMAPFZjdLlkXmiG+NiI8i4GCNXdwva74K160x+v/mFxXmS/UmT 8rHmCAN2pmr9ei1A1MRtYreK4CowxP6VaLnsJQYwCoz/HIOCEpECjN0ZIfmn25y5HZ7m ZQcaUQsA9EEHnIEcirosSSgEyTqdz+dH5p1oE+p3gdrNHmNTnXBmlB086+8An3EGeT++ aoTsCXAOwMndWgbEBU/XFvnaqSlLQ6TgNZNIeQH8/9yfuf/6c+uG0Z7sHJh8AKuP8US6 q7n9BfgrRJxk0Fss6Z81c/KcACMWfVjU0415nY5nbMXyBCT7WGojCP0CNM36JEnP6PrT AVVQ== X-Gm-Message-State: ACgBeo3+ve592P/kRojBYQV0UEDk/cUkPlz3JeDDv4c5oLh6FmfK+CkY ulygRv5p6EhOLmlZLKQtI+xTknUFbYLcug== X-Google-Smtp-Source: AA6agR7/aQhhiINEbnyNqdP0QmsdjKcmEHJcFo7bIMBgrliKCLL1fJ/pEpjj8BM60f9zgxpzAwFf7Q== X-Received: by 2002:a05:6e02:12ea:b0:2de:d432:b719 with SMTP id l10-20020a056e0212ea00b002ded432b719mr8310537iln.2.1659986886221; Mon, 08 Aug 2022 12:28:06 -0700 (PDT) Received: from murgatroyd.Home (71-211-185-228.hlrn.qwest.net. [71.211.185.228]) by smtp.gmail.com with ESMTPSA id z11-20020a027a4b000000b003423f7b779csm5438380jad.41.2022.08.08.12.28.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 08 Aug 2022 12:28:05 -0700 (PDT) From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH 2/3] Move solib_ops into gdbarch Date: Mon, 8 Aug 2022 13:28:00 -0600 Message-Id: <20220808192801.260256-3-tromey@adacore.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220808192801.260256-1-tromey@adacore.com> References: <20220808192801.260256-1-tromey@adacore.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-11.2 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 08 Aug 2022 19:28:10 -0000 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. --- gdb/amd64-darwin-tdep.c | 2 +- gdb/arch-utils.c | 1 + gdb/dicos-tdep.c | 2 +- gdb/frv-tdep.c | 2 +- gdb/gdbarch-components.py | 8 +++++++ gdb/gdbarch-gen.h | 5 ++++ gdb/gdbarch.c | 22 ++++++++++++++++++ gdb/i386-darwin-tdep.c | 2 +- gdb/i386-nto-tdep.c | 2 +- gdb/mips-linux-tdep.c | 2 +- gdb/ppc-linux-tdep.c | 2 +- gdb/rs6000-aix-tdep.c | 2 +- gdb/solib-svr4.c | 2 +- gdb/solib.c | 48 ++++++++++----------------------------- gdb/solib.h | 5 ---- gdb/tic6x-linux-tdep.c | 2 +- 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 7fc35536bc6..718bf4996e5 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 9c6b9268a69..61ba0d26a07 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 caff2474719..d22dfd65c60 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 55a6cfd9618..1c9c13e1ea0 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 71aa5991fbe..ad71bf754de 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 0504962e50d..c7a24704c7c 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 0edae7f6f0a..18d46a39d7a 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 */ @@ -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) { diff --git a/gdb/i386-darwin-tdep.c b/gdb/i386-darwin-tdep.c index 2a9198aceb3..5e7929b2c99 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 259867f262b..69d298c871f 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 ca313a28279..7dae1ca34de 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 beef4bd393c..ed154fd4a63 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 41384993c26..86270c81855 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 95a1e1eb722..893da86e27e 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 859d345f39c..7cfdd81114c 100644 --- a/gdb/solib.c +++ b/gdb/solib.c @@ -57,30 +57,6 @@ /* Architecture-specific operations. */ -/* Per-architecture data key. */ -static const registry::key> - 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 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 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 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 251028472c0..a7e751ed9b3 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 b2422d1ccc0..b99cfc0d5e3 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 702af65d450..e5e37fcaa53 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); } -- 2.34.1