diff options
author | Tom Tromey <tom@tromey.com> | 2016-11-21 11:12:23 -0700 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2017-01-10 19:14:10 -0700 |
commit | 192b62ce0b4bb5c61188f570e127a26d2c32f716 (patch) | |
tree | 01958d715eef682e22197d91a593659282792e23 /gdb/solib.c | |
parent | 50315b21779d71c172eb98a786a9b8281622e407 (diff) | |
download | gdb-192b62ce0b4bb5c61188f570e127a26d2c32f716.zip gdb-192b62ce0b4bb5c61188f570e127a26d2c32f716.tar.gz gdb-192b62ce0b4bb5c61188f570e127a26d2c32f716.tar.bz2 |
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.
Diffstat (limited to 'gdb/solib.c')
-rw-r--r-- | gdb/solib.c | 48 |
1 files changed, 21 insertions, 27 deletions
diff --git a/gdb/solib.c b/gdb/solib.c index ed684a2..fc45133 100644 --- a/gdb/solib.c +++ b/gdb/solib.c @@ -474,15 +474,15 @@ solib_find (const char *in_pathname, int *fd) function. If unsuccessful, the FD will be closed (unless FD was -1). */ -bfd * +gdb_bfd_ref_ptr solib_bfd_fopen (char *pathname, int fd) { - bfd *abfd = gdb_bfd_open (pathname, gnutarget, fd); + gdb_bfd_ref_ptr abfd (gdb_bfd_open (pathname, gnutarget, fd)); - if (abfd != NULL && !gdb_bfd_has_target_filename (abfd)) - bfd_set_cacheable (abfd, 1); + if (abfd != NULL && !gdb_bfd_has_target_filename (abfd.get ())) + bfd_set_cacheable (abfd.get (), 1); - if (!abfd) + if (abfd == NULL) { make_cleanup (xfree, pathname); error (_("Could not open `%s' as an executable file: %s"), @@ -496,12 +496,11 @@ solib_bfd_fopen (char *pathname, int fd) /* Find shared library PATHNAME and open a BFD for it. */ -bfd * +gdb_bfd_ref_ptr solib_bfd_open (char *pathname) { char *found_pathname; int found_file; - bfd *abfd; const struct bfd_arch_info *b; /* Search for shared library file. */ @@ -517,22 +516,20 @@ solib_bfd_open (char *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)); /* Check bfd format. */ - if (!bfd_check_format (abfd, bfd_object)) - { - make_cleanup_bfd_unref (abfd); - error (_("`%s': not in executable format: %s"), - bfd_get_filename (abfd), bfd_errmsg (bfd_get_error ())); - } + if (!bfd_check_format (abfd.get (), bfd_object)) + error (_("`%s': not in executable format: %s"), + bfd_get_filename (abfd), bfd_errmsg (bfd_get_error ())); /* Check bfd arch. */ b = gdbarch_bfd_arch_info (target_gdbarch ()); - if (!b->compatible (b, bfd_get_arch_info (abfd))) + if (!b->compatible (b, bfd_get_arch_info (abfd.get ()))) warning (_("`%s': Shared library architecture %s is not compatible " "with target architecture %s."), bfd_get_filename (abfd), - bfd_get_arch_info (abfd)->printable_name, b->printable_name); + bfd_get_arch_info (abfd.get ())->printable_name, + b->printable_name); return abfd; } @@ -556,18 +553,17 @@ solib_map_sections (struct so_list *so) char *filename; struct target_section *p; struct cleanup *old_chain; - bfd *abfd; filename = tilde_expand (so->so_name); old_chain = make_cleanup (xfree, filename); - abfd = ops->bfd_open (filename); + gdb_bfd_ref_ptr abfd (ops->bfd_open (filename)); do_cleanups (old_chain); if (abfd == NULL) return 0; /* Leave bfd open, core_xfer_memory and "info files" need it. */ - so->abfd = abfd; + so->abfd = abfd.release (); /* Copy the full path name into so_name, allowing symbol_file_add to find it later. This also affects the =library-loaded GDB/MI @@ -575,14 +571,14 @@ solib_map_sections (struct so_list *so) the library's host-side path. If we let the target dictate that objfile's path, and the target is different from the host, GDB/MI will not provide the correct host-side path. */ - if (strlen (bfd_get_filename (abfd)) >= SO_NAME_MAX_PATH_SIZE) + if (strlen (bfd_get_filename (so->abfd)) >= SO_NAME_MAX_PATH_SIZE) error (_("Shared library file name is too long.")); - strcpy (so->so_name, bfd_get_filename (abfd)); + strcpy (so->so_name, bfd_get_filename (so->abfd)); - if (build_section_table (abfd, &so->sections, &so->sections_end)) + if (build_section_table (so->abfd, &so->sections, &so->sections_end)) { error (_("Can't find the file sections in `%s': %s"), - bfd_get_filename (abfd), bfd_errmsg (bfd_get_error ())); + bfd_get_filename (so->abfd), bfd_errmsg (bfd_get_error ())); } for (p = so->sections; p < so->sections_end; p++) @@ -1346,7 +1342,6 @@ reload_shared_libraries_1 (int from_tty) for (so = so_list_head; so != NULL; so = so->next) { char *filename, *found_pathname = NULL; - bfd *abfd; int was_loaded = so->symbols_loaded; symfile_add_flags add_flags = SYMFILE_DEFER_BP_RESET; @@ -1355,12 +1350,11 @@ reload_shared_libraries_1 (int from_tty) filename = tilde_expand (so->so_original_name); make_cleanup (xfree, filename); - abfd = solib_bfd_open (filename); + gdb_bfd_ref_ptr abfd (solib_bfd_open (filename)); if (abfd != NULL) { - found_pathname = xstrdup (bfd_get_filename (abfd)); + found_pathname = xstrdup (bfd_get_filename (abfd.get ())); make_cleanup (xfree, found_pathname); - gdb_bfd_unref (abfd); } /* If this shared library is no longer associated with its previous |