From 6b3a2759052d1874a5952b7901e2b41890ae992f Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Sun, 19 Mar 2023 16:12:58 -0600 Subject: [PATCH] Use function_view in gdb_bfd_lookup_symbol This changes gdb_bfd_lookup_symbol to use a function_view. This simplifies the code a little bit. --- gdb/solib-dsbt.c | 17 +++++++---------- gdb/solib-frv.c | 15 ++++++--------- gdb/solib-svr4.c | 20 +++++++++----------- gdb/solib.c | 31 +++++++++++++------------------ gdb/solib.h | 14 +++++--------- 5 files changed, 40 insertions(+), 57 deletions(-) diff --git a/gdb/solib-dsbt.c b/gdb/solib-dsbt.c index 557df74eb00..866087ef3a5 100644 --- a/gdb/solib-dsbt.c +++ b/gdb/solib-dsbt.c @@ -662,14 +662,6 @@ enable_break_failure_warning (void) "and track explicitly loaded dynamic code.")); } -/* Helper function for gdb_bfd_lookup_symbol. */ - -static int -cmp_name (const asymbol *sym, const void *data) -{ - return (strcmp (sym->name, (const char *) data) == 0); -} - /* The dynamic linkers has, as part of its debugger interface, support for arranging for the inferior to hit a breakpoint after mapping in the shared libraries. This function enables that breakpoint. @@ -759,8 +751,13 @@ enable_break (void) = info->interp_plt_sect_low + bfd_section_size (interp_sect); } - addr = gdb_bfd_lookup_symbol (tmp_bfd.get (), cmp_name, - "_dl_debug_state"); + addr = (gdb_bfd_lookup_symbol + (tmp_bfd.get (), + [] (const asymbol *sym) + { + return strcmp (sym->name, "_dl_debug_state") == 0; + })); + if (addr != 0) { if (solib_dsbt_debug) diff --git a/gdb/solib-frv.c b/gdb/solib-frv.c index 38aed7a6ca4..240b4da5d9d 100644 --- a/gdb/solib-frv.c +++ b/gdb/solib-frv.c @@ -472,14 +472,6 @@ enable_break_failure_warning (void) "and track explicitly loaded dynamic code.")); } -/* Helper function for gdb_bfd_lookup_symbol. */ - -static int -cmp_name (const asymbol *sym, const void *data) -{ - return (strcmp (sym->name, (const char *) data) == 0); -} - /* Arrange for dynamic linker to hit breakpoint. The dynamic linkers has, as part of its debugger interface, support @@ -602,7 +594,12 @@ enable_break2 (void) interp_plt_sect_low + bfd_section_size (interp_sect); } - addr = gdb_bfd_lookup_symbol (tmp_bfd.get (), cmp_name, "_dl_debug_addr"); + addr = (gdb_bfd_lookup_symbol + (tmp_bfd.get (), + [] (const asymbol *sym) + { + return strcmp (sym->name, "_dl_debug_addr") == 0; + })); if (addr == 0) { diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c index b3f6b6adaf2..5a728939111 100644 --- a/gdb/solib-svr4.c +++ b/gdb/solib-svr4.c @@ -2301,14 +2301,6 @@ svr4_create_solib_event_breakpoints (svr4_info *info, struct gdbarch *gdbarch, } } -/* Helper function for gdb_bfd_lookup_symbol. */ - -static int -cmp_name_and_sec_flags (const asymbol *sym, const void *data) -{ - return (strcmp (sym->name, (const char *) data) == 0 - && (sym->section->flags & (SEC_CODE | SEC_DATA)) != 0); -} /* Arrange for dynamic linker to hit breakpoint. Both the SunOS and the SVR4 dynamic linkers have, as part of their @@ -2553,9 +2545,15 @@ enable_break (struct svr4_info *info, int from_tty) /* Now try to set a breakpoint in the dynamic linker. */ for (bkpt_namep = solib_break_names; *bkpt_namep != NULL; bkpt_namep++) { - sym_addr = gdb_bfd_lookup_symbol (tmp_bfd.get (), - cmp_name_and_sec_flags, - *bkpt_namep); + sym_addr + = (gdb_bfd_lookup_symbol + (tmp_bfd.get (), + [=] (const asymbol *sym) + { + return (strcmp (sym->name, *bkpt_namep) == 0 + && ((sym->section->flags & (SEC_CODE | SEC_DATA)) + != 0)); + })); if (sym_addr != 0) break; } diff --git a/gdb/solib.c b/gdb/solib.c index ce10fc5aaf2..54f1723debf 100644 --- a/gdb/solib.c +++ b/gdb/solib.c @@ -1475,13 +1475,11 @@ show_auto_solib_add (struct ui_file *file, int from_tty, /* Lookup the value for a specific symbol from dynamic symbol table. Look up symbol from ABFD. MATCH_SYM is a callback function to determine whether to pick up a symbol. DATA is the input of this callback - function. Return NULL if symbol is not found. */ + function. Return 0 if symbol is not found. */ CORE_ADDR -gdb_bfd_lookup_symbol_from_symtab (bfd *abfd, - int (*match_sym) (const asymbol *, - const void *), - const void *data) +gdb_bfd_lookup_symbol_from_symtab + (bfd *abfd, gdb::function_view match_sym) { long storage_needed = bfd_get_symtab_upper_bound (abfd); CORE_ADDR symaddr = 0; @@ -1499,7 +1497,7 @@ gdb_bfd_lookup_symbol_from_symtab (bfd *abfd, { asymbol *sym = *symbol_table++; - if (match_sym (sym, data)) + if (match_sym (sym)) { struct gdbarch *gdbarch = target_gdbarch (); symaddr = sym->value; @@ -1671,14 +1669,12 @@ gdb_bfd_read_elf_soname (const char *filename) /* Lookup the value for a specific symbol from symbol table. Look up symbol from ABFD. MATCH_SYM is a callback function to determine whether to pick - up a symbol. DATA is the input of this callback function. Return NULL + up a symbol. DATA is the input of this callback function. Return 0 if symbol is not found. */ static CORE_ADDR -bfd_lookup_symbol_from_dyn_symtab (bfd *abfd, - int (*match_sym) (const asymbol *, - const void *), - const void *data) +bfd_lookup_symbol_from_dyn_symtab + (bfd *abfd, gdb::function_view match_sym) { long storage_needed = bfd_get_dynamic_symtab_upper_bound (abfd); CORE_ADDR symaddr = 0; @@ -1695,7 +1691,7 @@ bfd_lookup_symbol_from_dyn_symtab (bfd *abfd, { asymbol *sym = *symbol_table++; - if (match_sym (sym, data)) + if (match_sym (sym)) { /* BFD symbols are section relative. */ symaddr = sym->value + sym->section->vma; @@ -1709,20 +1705,19 @@ bfd_lookup_symbol_from_dyn_symtab (bfd *abfd, /* Lookup the value for a specific symbol from symbol table and dynamic symbol table. Look up symbol from ABFD. MATCH_SYM is a callback function to determine whether to pick up a symbol. DATA is the - input of this callback function. Return NULL if symbol is not + input of this callback function. Return 0 if symbol is not found. */ CORE_ADDR -gdb_bfd_lookup_symbol (bfd *abfd, - int (*match_sym) (const asymbol *, const void *), - const void *data) +gdb_bfd_lookup_symbol + (bfd *abfd, gdb::function_view match_sym) { - CORE_ADDR symaddr = gdb_bfd_lookup_symbol_from_symtab (abfd, match_sym, data); + CORE_ADDR symaddr = gdb_bfd_lookup_symbol_from_symtab (abfd, match_sym); /* On FreeBSD, the dynamic linker is stripped by default. So we'll have to check the dynamic string table too. */ if (symaddr == 0) - symaddr = bfd_lookup_symbol_from_dyn_symtab (abfd, match_sym, data); + symaddr = bfd_lookup_symbol_from_dyn_symtab (abfd, match_sym); return symaddr; } diff --git a/gdb/solib.h b/gdb/solib.h index 24c365a0ae0..77e023002ed 100644 --- a/gdb/solib.h +++ b/gdb/solib.h @@ -28,6 +28,7 @@ struct program_space; #include "gdb_bfd.h" #include "symfile-add-flags.h" +#include "gdbsupport/function-view.h" /* Value of the 'set debug solib' configuration variable. */ @@ -107,18 +108,13 @@ extern bool libpthread_name_p (const char *name); /* Look up symbol from both symbol table and dynamic string table. */ -extern CORE_ADDR gdb_bfd_lookup_symbol (bfd *abfd, - int (*match_sym) (const asymbol *, - const void *), - const void *data); +extern CORE_ADDR gdb_bfd_lookup_symbol + (bfd *abfd, gdb::function_view match_sym); /* Look up symbol from symbol table. */ -extern CORE_ADDR gdb_bfd_lookup_symbol_from_symtab (bfd *abfd, - int (*match_sym) - (const asymbol *, - const void *), - const void *data); +extern CORE_ADDR gdb_bfd_lookup_symbol_from_symtab + (bfd *abfd, gdb::function_view match_sym); /* Scan for DESIRED_DYNTAG in .dynamic section of ABFD. If DESIRED_DYNTAG is found, 1 is returned and the corresponding PTR and PTR_ADDR are set. */ -- 2.30.2