mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-26 09:08:59 +00:00
Use class to manage BFD reference counts
This introduces a new specialization of gdb::ref_ptr that can be used to manage BFD reference counts. Then it changes most places in gdb to use this new class, rather than explicit reference-counting or cleanups. This patch removes make_cleanup_bfd_unref. If you look you will see a couple of spots using "release" where a use of gdb_bfd_ref_ptr would be cleaner. These will be fixed in the next patch. I think this patch fixes some latent bugs. For example, it seems to me that previously objfpy_add_separate_debug_file leaked a BFD. I'm not 100% certain that the macho_symfile_read_all_oso change is correct. The existing code here is hard for me to follow. One goal of this sort of automated reference counting, though, is to make it more difficult to make logic errors; so hopefully the code is clear now. 2017-01-10 Tom Tromey <tom@tromey.com> * windows-tdep.c (windows_xfer_shared_library): Update. * windows-nat.c (windows_make_so): Update. * utils.h (make_cleanup_bfd_unref): Remove. * utils.c (do_bfd_close_cleanup, make_cleanup_bfd_unref): Remove. * symfile.h (symfile_bfd_open) (find_separate_debug_file_in_section): Return gdb_bfd_ref_ptr. * symfile.c (read_symbols, symbol_file_add) (separate_debug_file_exists): Update. (symfile_bfd_open): Return gdb_bfd_ref_ptr. (generic_load, reread_symbols): Update. * symfile-mem.c (symbol_file_add_from_memory): Update. * spu-linux-nat.c (spu_bfd_open): Return gdb_bfd_ref_ptr. (spu_symbol_file_add_from_memory): Update. * solist.h (struct target_so_ops) <bfd_open>: Return gdb_bfd_ref_ptr. (solib_bfd_fopen, solib_bfd_open): Return gdb_bfd_ref_ptr. * solib.c (solib_bfd_fopen, solib_bfd_open): Return gdb_bfd_ref_ptr. (solib_map_sections, reload_shared_libraries_1): Update. * solib-svr4.c (enable_break): Update. * solib-spu.c (spu_bfd_fopen): Return gdb_bfd_ref_ptr. * solib-frv.c (enable_break2): Update. * solib-dsbt.c (enable_break): Update. * solib-darwin.c (gdb_bfd_mach_o_fat_extract): Return gdb_bfd_ref_ptr. (darwin_solib_get_all_image_info_addr_at_init): Update. (darwin_bfd_open): Return gdb_bfd_ref_ptr. * solib-aix.c (solib_aix_bfd_open): Return gdb_bfd_ref_ptr. * record-full.c (record_full_save): Update. * python/py-objfile.c (objfpy_add_separate_debug_file): Update. * procfs.c (insert_dbx_link_bpt_in_file): Update. * minidebug.c (find_separate_debug_file_in_section): Return gdb_bfd_ref_ptr. * machoread.c (macho_add_oso_symfile): Change abfd to gdb_bfd_ref_ptr. (macho_symfile_read_all_oso): Update. (macho_check_dsym): Return gdb_bfd_ref_ptr. (macho_symfile_read): Update. * jit.c (bfd_open_from_target_memory): Return gdb_bfd_ref_ptr. (jit_bfd_try_read_symtab): Update. * gdb_bfd.h (gdb_bfd_open, gdb_bfd_fopen, gdb_bfd_openr) (gdb_bfd_openw, gdb_bfd_openr_iovec) (gdb_bfd_openr_next_archived_file, gdb_bfd_fdopenr): Return gdb_bfd_ref_ptr. (gdb_bfd_ref_policy): New struct. (gdb_bfd_ref_ptr): New typedef. * gdb_bfd.c (gdb_bfd_open, gdb_bfd_fopen, gdb_bfd_openr) (gdb_bfd_openw, gdb_bfd_openr_iovec) (gdb_bfd_openr_next_archived_file, gdb_bfd_fdopenr): Return gdb_bfd_ref_ptr. * gcore.h (create_gcore_bfd): Return gdb_bfd_ref_ptr. * gcore.c (create_gcore_bfd): Return gdb_bfd_ref_ptr. (gcore_command): Update. * exec.c (exec_file_attach): Update. * elfread.c (elf_symfile_read): Update. * dwarf2read.c (dwarf2_get_dwz_file): Update. (try_open_dwop_file, open_dwo_file): Return gdb_bfd_ref_ptr. (open_and_init_dwo_file): Update. (open_dwp_file): Return gdb_bfd_ref_ptr. (open_and_init_dwp_file): Update. * corelow.c (core_open): Update. * compile/compile-object-load.c (compile_object_load): Update. * common/gdb_ref_ptr.h (ref_ptr::operator->): New operator. * coffread.c (coff_symfile_read): Update. * cli/cli-dump.c (bfd_openr_or_error, bfd_openw_or_error): Return gdb_bfd_ref_ptr. Rename. (dump_bfd_file, restore_command): Update. * build-id.h (build_id_to_debug_bfd): Return gdb_bfd_ref_ptr. * build-id.c (build_id_to_debug_bfd): Return gdb_bfd_ref_ptr. (find_separate_debug_file_by_buildid): Update.
This commit is contained in:
@@ -427,7 +427,7 @@ darwin_in_dynsym_resolve_code (CORE_ADDR pc)
|
||||
counting properly. This will either return NULL, or return a new
|
||||
reference to a BFD. */
|
||||
|
||||
static bfd *
|
||||
static gdb_bfd_ref_ptr
|
||||
gdb_bfd_mach_o_fat_extract (bfd *abfd, bfd_format format,
|
||||
const bfd_arch_info_type *arch)
|
||||
{
|
||||
@@ -441,7 +441,7 @@ gdb_bfd_mach_o_fat_extract (bfd *abfd, bfd_format format,
|
||||
else
|
||||
gdb_bfd_mark_parent (result, abfd);
|
||||
|
||||
return result;
|
||||
return gdb_bfd_ref_ptr (result);
|
||||
}
|
||||
|
||||
/* Extract dyld_all_image_addr when the process was just created, assuming the
|
||||
@@ -452,8 +452,6 @@ darwin_solib_get_all_image_info_addr_at_init (struct darwin_info *info)
|
||||
{
|
||||
char *interp_name;
|
||||
CORE_ADDR load_addr = 0;
|
||||
bfd *dyld_bfd = NULL;
|
||||
struct cleanup *cleanup;
|
||||
|
||||
/* This method doesn't work with an attached process. */
|
||||
if (current_inferior ()->attach_flag)
|
||||
@@ -464,42 +462,30 @@ darwin_solib_get_all_image_info_addr_at_init (struct darwin_info *info)
|
||||
if (!interp_name)
|
||||
return;
|
||||
|
||||
cleanup = make_cleanup (null_cleanup, NULL);
|
||||
|
||||
/* Create a bfd for the interpreter. */
|
||||
dyld_bfd = gdb_bfd_open (interp_name, gnutarget, -1);
|
||||
if (dyld_bfd)
|
||||
gdb_bfd_ref_ptr dyld_bfd (gdb_bfd_open (interp_name, gnutarget, -1));
|
||||
if (dyld_bfd != NULL)
|
||||
{
|
||||
bfd *sub;
|
||||
|
||||
make_cleanup_bfd_unref (dyld_bfd);
|
||||
sub = gdb_bfd_mach_o_fat_extract
|
||||
(dyld_bfd, bfd_object, gdbarch_bfd_arch_info (target_gdbarch ()));
|
||||
if (sub)
|
||||
{
|
||||
dyld_bfd = sub;
|
||||
make_cleanup_bfd_unref (sub);
|
||||
}
|
||||
gdb_bfd_ref_ptr sub
|
||||
(gdb_bfd_mach_o_fat_extract (dyld_bfd.get (), bfd_object,
|
||||
gdbarch_bfd_arch_info (target_gdbarch ())));
|
||||
if (sub != NULL)
|
||||
dyld_bfd = sub;
|
||||
else
|
||||
dyld_bfd = NULL;
|
||||
}
|
||||
if (!dyld_bfd)
|
||||
{
|
||||
do_cleanups (cleanup);
|
||||
return;
|
||||
dyld_bfd.release ();
|
||||
}
|
||||
if (dyld_bfd == NULL)
|
||||
return;
|
||||
|
||||
/* We find the dynamic linker's base address by examining
|
||||
the current pc (which should point at the entry point for the
|
||||
dynamic linker) and subtracting the offset of the entry point. */
|
||||
load_addr = (regcache_read_pc (get_current_regcache ())
|
||||
- bfd_get_start_address (dyld_bfd));
|
||||
- bfd_get_start_address (dyld_bfd.get ()));
|
||||
|
||||
/* Now try to set a breakpoint in the dynamic linker. */
|
||||
info->all_image_addr =
|
||||
lookup_symbol_from_bfd (dyld_bfd, "_dyld_all_image_infos");
|
||||
|
||||
do_cleanups (cleanup);
|
||||
lookup_symbol_from_bfd (dyld_bfd.get (), "_dyld_all_image_infos");
|
||||
|
||||
if (info->all_image_addr == 0)
|
||||
return;
|
||||
@@ -634,13 +620,11 @@ darwin_lookup_lib_symbol (struct objfile *objfile,
|
||||
return (struct block_symbol) {NULL, NULL};
|
||||
}
|
||||
|
||||
static bfd *
|
||||
static gdb_bfd_ref_ptr
|
||||
darwin_bfd_open (char *pathname)
|
||||
{
|
||||
char *found_pathname;
|
||||
int found_file;
|
||||
bfd *abfd;
|
||||
bfd *res;
|
||||
|
||||
/* Search for shared library file. */
|
||||
found_pathname = solib_find (pathname, &found_file);
|
||||
@@ -648,24 +632,21 @@ darwin_bfd_open (char *pathname)
|
||||
perror_with_name (pathname);
|
||||
|
||||
/* Open bfd for shared library. */
|
||||
abfd = solib_bfd_fopen (found_pathname, found_file);
|
||||
gdb_bfd_ref_ptr abfd (solib_bfd_fopen (found_pathname, found_file));
|
||||
|
||||
res = gdb_bfd_mach_o_fat_extract (abfd, bfd_object,
|
||||
gdbarch_bfd_arch_info (target_gdbarch ()));
|
||||
if (!res)
|
||||
{
|
||||
make_cleanup_bfd_unref (abfd);
|
||||
error (_("`%s': not a shared-library: %s"),
|
||||
bfd_get_filename (abfd), bfd_errmsg (bfd_get_error ()));
|
||||
}
|
||||
gdb_bfd_ref_ptr res
|
||||
(gdb_bfd_mach_o_fat_extract (abfd.get (), bfd_object,
|
||||
gdbarch_bfd_arch_info (target_gdbarch ())));
|
||||
if (res == NULL)
|
||||
error (_("`%s': not a shared-library: %s"),
|
||||
bfd_get_filename (abfd.get ()), bfd_errmsg (bfd_get_error ()));
|
||||
|
||||
/* The current filename for fat-binary BFDs is a name generated
|
||||
by BFD, usually a string containing the name of the architecture.
|
||||
Reset its value to the actual filename. */
|
||||
xfree (bfd_get_filename (res));
|
||||
xfree (bfd_get_filename (res.get ()));
|
||||
res->filename = xstrdup (pathname);
|
||||
|
||||
gdb_bfd_unref (abfd);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user