aboutsummaryrefslogtreecommitdiff
path: root/gdb/machoread.c
diff options
context:
space:
mode:
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);