diff options
Diffstat (limited to 'gdb/machoread.c')
-rw-r--r-- | gdb/machoread.c | 76 |
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); |