aboutsummaryrefslogtreecommitdiff
path: root/gdb/machoread.c
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2016-11-21 11:12:23 -0700
committerTom Tromey <tom@tromey.com>2017-01-10 19:14:10 -0700
commit192b62ce0b4bb5c61188f570e127a26d2c32f716 (patch)
tree01958d715eef682e22197d91a593659282792e23 /gdb/machoread.c
parent50315b21779d71c172eb98a786a9b8281622e407 (diff)
downloadgdb-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/machoread.c')
-rw-r--r--gdb/machoread.c76
1 files changed, 28 insertions, 48 deletions
diff --git a/gdb/machoread.c b/gdb/machoread.c
index ec1b001..1c317ed 100644
--- a/gdb/machoread.c
+++ b/gdb/machoread.c
@@ -429,7 +429,8 @@ macho_resolve_oso_sym_with_minsym (struct objfile *main_objfile, asymbol *sym)
/* Add oso file OSO/ABFD as a symbol file. */
static void
-macho_add_oso_symfile (oso_el *oso, bfd *abfd, const char *name,
+macho_add_oso_symfile (oso_el *oso, const gdb_bfd_ref_ptr &abfd,
+ const char *name,
struct objfile *main_objfile,
symfile_add_flags symfile_flags)
{
@@ -439,7 +440,6 @@ macho_add_oso_symfile (oso_el *oso, bfd *abfd, const char *name,
asymbol **symp;
struct bfd_hash_table table;
int nbr_sections;
- struct cleanup *cleanup;
/* Per section flag to mark which section have been rebased. */
unsigned char *sections_rebased;
@@ -448,18 +448,16 @@ macho_add_oso_symfile (oso_el *oso, bfd *abfd, const char *name,
printf_unfiltered
(_("Loading debugging symbols from oso: %s\n"), oso->name);
- if (!bfd_check_format (abfd, bfd_object))
+ if (!bfd_check_format (abfd.get (), bfd_object))
{
warning (_("`%s': can't read symbols: %s."), oso->name,
bfd_errmsg (bfd_get_error ()));
- gdb_bfd_unref (abfd);
return;
}
- if (abfd->my_archive == NULL && oso->mtime != bfd_get_mtime (abfd))
+ if (abfd->my_archive == NULL && oso->mtime != bfd_get_mtime (abfd.get ()))
{
warning (_("`%s': file time stamp mismatch."), oso->name);
- gdb_bfd_unref (abfd);
return;
}
@@ -468,19 +466,18 @@ macho_add_oso_symfile (oso_el *oso, bfd *abfd, const char *name,
oso->nbr_syms))
{
warning (_("`%s': can't create hash table"), oso->name);
- gdb_bfd_unref (abfd);
return;
}
- bfd_set_cacheable (abfd, 1);
+ bfd_set_cacheable (abfd.get (), 1);
/* Read symbols table. */
- storage = bfd_get_symtab_upper_bound (abfd);
+ storage = bfd_get_symtab_upper_bound (abfd.get ());
symbol_table = (asymbol **) xmalloc (storage);
- bfd_canonicalize_symtab (abfd, symbol_table);
+ bfd_canonicalize_symtab (abfd.get (), symbol_table);
/* Init section flags. */
- nbr_sections = bfd_count_sections (abfd);
+ nbr_sections = bfd_count_sections (abfd.get ());
sections_rebased = (unsigned char *) alloca (nbr_sections);
for (i = 0; i < nbr_sections; i++)
sections_rebased[i] = 0;
@@ -601,7 +598,7 @@ macho_add_oso_symfile (oso_el *oso, bfd *abfd, const char *name,
sec->name, sym->name,
paddress (arch, res));
}
- bfd_set_section_vma (abfd, sec, res);
+ bfd_set_section_vma (abfd.get (), sec, res);
sections_rebased[sec->index] = 1;
}
}
@@ -617,13 +614,12 @@ macho_add_oso_symfile (oso_el *oso, bfd *abfd, const char *name,
/* We need to clear SYMFILE_MAINLINE to avoid interractive question
from symfile.c:symbol_file_add_with_addrs_or_offsets. */
- cleanup = make_cleanup_bfd_unref (abfd);
symbol_file_add_from_bfd
- (abfd, name, symfile_flags & ~(SYMFILE_MAINLINE | SYMFILE_VERBOSE), NULL,
+ (abfd.get (), name, symfile_flags & ~(SYMFILE_MAINLINE | SYMFILE_VERBOSE),
+ NULL,
main_objfile->flags & (OBJF_REORDERED | OBJF_SHARED
| OBJF_READNOW | OBJF_USERLOADED),
main_objfile);
- do_cleanups (cleanup);
}
/* Read symbols from the vector of oso files.
@@ -651,8 +647,6 @@ macho_symfile_read_all_oso (VEC (oso_el) **oso_vector_ptr,
pfx_len = get_archive_prefix_len (oso->name);
if (pfx_len > 0)
{
- bfd *archive_bfd;
- bfd *member_bfd;
int last_ix;
oso_el *oso2;
int ix2;
@@ -668,7 +662,8 @@ macho_symfile_read_all_oso (VEC (oso_el) **oso_vector_ptr,
}
/* Open the archive and check the format. */
- archive_bfd = gdb_bfd_open (archive_name.c_str (), gnutarget, -1);
+ gdb_bfd_ref_ptr archive_bfd (gdb_bfd_open (archive_name.c_str (),
+ gnutarget, -1));
if (archive_bfd == NULL)
{
warning (_("Could not open OSO archive file \"%s\""),
@@ -676,22 +671,21 @@ macho_symfile_read_all_oso (VEC (oso_el) **oso_vector_ptr,
ix = last_ix;
continue;
}
- if (!bfd_check_format (archive_bfd, bfd_archive))
+ if (!bfd_check_format (archive_bfd.get (), bfd_archive))
{
warning (_("OSO archive file \"%s\" not an archive."),
archive_name.c_str ());
- gdb_bfd_unref (archive_bfd);
ix = last_ix;
continue;
}
- member_bfd = gdb_bfd_openr_next_archived_file (archive_bfd, NULL);
+ gdb_bfd_ref_ptr member_bfd
+ (gdb_bfd_openr_next_archived_file (archive_bfd.get (), NULL));
if (member_bfd == NULL)
{
warning (_("Could not read archive members out of "
"OSO archive \"%s\""), archive_name.c_str ());
- gdb_bfd_unref (archive_bfd);
ix = last_ix;
continue;
}
@@ -699,7 +693,6 @@ macho_symfile_read_all_oso (VEC (oso_el) **oso_vector_ptr,
/* Load all oso in this library. */
while (member_bfd != NULL)
{
- bfd *prev;
const char *member_name = member_bfd->filename;
int member_len = strlen (member_name);
@@ -721,13 +714,8 @@ macho_symfile_read_all_oso (VEC (oso_el) **oso_vector_ptr,
}
}
- prev = member_bfd;
- member_bfd = gdb_bfd_openr_next_archived_file (archive_bfd,
- member_bfd);
-
- /* Free previous member if not referenced by an oso. */
- if (ix2 >= last_ix)
- gdb_bfd_unref (prev);
+ member_bfd = gdb_bfd_openr_next_archived_file (archive_bfd.get (),
+ member_bfd.get ());
}
for (ix2 = ix; ix2 < last_ix; ix2++)
{
@@ -741,10 +729,8 @@ macho_symfile_read_all_oso (VEC (oso_el) **oso_vector_ptr,
}
else
{
- bfd *abfd;
-
- abfd = gdb_bfd_open (oso->name, gnutarget, -1);
- if (!abfd)
+ gdb_bfd_ref_ptr abfd (gdb_bfd_open (oso->name, gnutarget, -1));
+ if (abfd == NULL)
warning (_("`%s': can't open to read symbols: %s."), oso->name,
bfd_errmsg (bfd_get_error ()));
else
@@ -768,7 +754,7 @@ macho_symfile_read_all_oso (VEC (oso_el) **oso_vector_ptr,
Return NULL if no valid dsym file is found (FILENAMEP is not used in
such case). */
-static bfd *
+static gdb_bfd_ref_ptr
macho_check_dsym (struct objfile *objfile, char **filenamep)
{
size_t name_len = strlen (objfile_name (objfile));
@@ -776,7 +762,6 @@ macho_check_dsym (struct objfile *objfile, char **filenamep)
const char *base_name = lbasename (objfile_name (objfile));
size_t base_len = strlen (base_name);
char *dsym_filename = (char *) alloca (name_len + dsym_len + base_len + 1);
- bfd *dsym_bfd;
bfd_mach_o_load_command *main_uuid;
bfd_mach_o_load_command *dsym_uuid;
@@ -793,25 +778,23 @@ macho_check_dsym (struct objfile *objfile, char **filenamep)
warning (_("can't find UUID in %s"), objfile_name (objfile));
return NULL;
}
- dsym_bfd = gdb_bfd_openr (dsym_filename, gnutarget);
+ gdb_bfd_ref_ptr dsym_bfd (gdb_bfd_openr (dsym_filename, gnutarget));
if (dsym_bfd == NULL)
{
warning (_("can't open dsym file %s"), dsym_filename);
return NULL;
}
- if (!bfd_check_format (dsym_bfd, bfd_object))
+ if (!bfd_check_format (dsym_bfd.get (), bfd_object))
{
- gdb_bfd_unref (dsym_bfd);
warning (_("bad dsym file format: %s"), bfd_errmsg (bfd_get_error ()));
return NULL;
}
- if (bfd_mach_o_lookup_command (dsym_bfd,
+ if (bfd_mach_o_lookup_command (dsym_bfd.get (),
BFD_MACH_O_LC_UUID, &dsym_uuid) == 0)
{
warning (_("can't find UUID in %s"), dsym_filename);
- gdb_bfd_unref (dsym_bfd);
return NULL;
}
if (memcmp (dsym_uuid->command.uuid.uuid, main_uuid->command.uuid.uuid,
@@ -819,7 +802,6 @@ macho_check_dsym (struct objfile *objfile, char **filenamep)
{
warning (_("dsym file UUID doesn't match the one in %s"),
objfile_name (objfile));
- gdb_bfd_unref (dsym_bfd);
return NULL;
}
*filenamep = xstrdup (dsym_filename);
@@ -831,7 +813,6 @@ macho_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags)
{
bfd *abfd = objfile->obfd;
long storage_needed;
- bfd *dsym_bfd;
VEC (oso_el) *oso_vector = NULL;
struct cleanup *old_chain = make_cleanup (VEC_cleanup (oso_el), &oso_vector);
@@ -879,7 +860,7 @@ macho_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags)
dwarf2_build_frame_info (objfile);
/* Check for DSYM file. */
- dsym_bfd = macho_check_dsym (objfile, &dsym_filename);
+ gdb_bfd_ref_ptr dsym_bfd (macho_check_dsym (objfile, &dsym_filename));
if (dsym_bfd != NULL)
{
struct bfd_section *asect, *dsect;
@@ -896,14 +877,13 @@ macho_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags)
{
if (strcmp (asect->name, dsect->name) != 0)
break;
- bfd_set_section_size (dsym_bfd, dsect,
+ bfd_set_section_size (dsym_bfd.get (), dsect,
bfd_get_section_size (asect));
}
/* Add the dsym file as a separate file. */
- make_cleanup_bfd_unref (dsym_bfd);
- symbol_file_add_separate (dsym_bfd, dsym_filename, symfile_flags,
- objfile);
+ symbol_file_add_separate (dsym_bfd.get (), dsym_filename,
+ symfile_flags, objfile);
/* Don't try to read dwarf2 from main file or shared libraries. */
do_cleanups (old_chain);