summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Tromey <tromey@redhat.com>2012-07-23 14:58:44 +0000
committerTom Tromey <tromey@redhat.com>2012-07-23 14:58:44 +0000
commit612c29ac072387bbddc9b0f4321353b929d5737b (patch)
tree9284147da7e4c4b2374077bc9023717e9acc3502
parent8b3d8cbf611383b5759061e49521fb3cd83d4a71 (diff)
downloadgdb-612c29ac072387bbddc9b0f4321353b929d5737b.tar.gz
* coffread.c (coff_symfile_read): Make a cleanup for 'debugfile'
and 'abfd'. * elfread.c (elf_symfile_read): Make a cleanup for 'debugfile' and 'abfd'. * jit.c (jit_bfd_try_read_symtab): Make a cleanup for 'nbfd'. * machoread.c (macho_add_oso_symfile): Make a cleanup for 'abfd'. (macho_symfile_read): Make a cleanup for 'dsym_bfd'. * objfiles.c (allocate_objfile): Acquire a new reference. * rs6000-nat.c (add_vmap): Don't acquire a BFD reference. * solib.c (solib_read_symbols): Don't acquire a BFD reference. * spu-linux-nat.c (spu_symbol_file_add_from_memory): Make a cleanup for 'nbfd'. * symfile-mem.c (symbol_file_add_from_memory): Make a cleanup for 'nbfd'. * symfile.c (symbol_file_add_with_addrs_or_offsets): Don't make a cleanup for 'abfd'. (symbol_file_add): Make a BFD cleanup.
-rw-r--r--gdb/ChangeLog21
-rw-r--r--gdb/coffread.c3
-rw-r--r--gdb/elfread.c4
-rw-r--r--gdb/jit.c3
-rw-r--r--gdb/machoread.c6
-rw-r--r--gdb/objfiles.c3
-rw-r--r--gdb/rs6000-nat.c1
-rw-r--r--gdb/solib.c1
-rw-r--r--gdb/spu-linux-nat.c9
-rw-r--r--gdb/symfile-mem.c11
-rw-r--r--gdb/symfile.c14
11 files changed, 56 insertions, 20 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 9b96acf65a0..a8cd9360b98 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,26 @@
2012-07-23 Tom Tromey <tromey@redhat.com>
+ * coffread.c (coff_symfile_read): Make a cleanup for 'debugfile'
+ and 'abfd'.
+ * elfread.c (elf_symfile_read): Make a cleanup for 'debugfile'
+ and 'abfd'.
+ * jit.c (jit_bfd_try_read_symtab): Make a cleanup for 'nbfd'.
+ * machoread.c (macho_add_oso_symfile): Make a cleanup for
+ 'abfd'.
+ (macho_symfile_read): Make a cleanup for 'dsym_bfd'.
+ * objfiles.c (allocate_objfile): Acquire a new reference.
+ * rs6000-nat.c (add_vmap): Don't acquire a BFD reference.
+ * solib.c (solib_read_symbols): Don't acquire a BFD reference.
+ * spu-linux-nat.c (spu_symbol_file_add_from_memory): Make
+ a cleanup for 'nbfd'.
+ * symfile-mem.c (symbol_file_add_from_memory): Make a cleanup
+ for 'nbfd'.
+ * symfile.c (symbol_file_add_with_addrs_or_offsets): Don't
+ make a cleanup for 'abfd'.
+ (symbol_file_add): Make a BFD cleanup.
+
+2012-07-23 Tom Tromey <tromey@redhat.com>
+
* cli/cli-dump.c (bfd_openr_with_cleanup): Use gdb_bfd_openr.
(bfd_openw_with_cleanup): Use gdb_bfd_openw.
* corelow.c (core_open): Use gdb_bfd_fopen.
diff --git a/gdb/coffread.c b/gdb/coffread.c
index b0a8b820299..0c7e6d90abe 100644
--- a/gdb/coffread.c
+++ b/gdb/coffread.c
@@ -653,13 +653,14 @@ coff_symfile_read (struct objfile *objfile, int symfile_flags)
char *debugfile;
debugfile = find_separate_debug_file_by_debuglink (objfile);
+ make_cleanup (xfree, debugfile);
if (debugfile)
{
bfd *abfd = symfile_bfd_open (debugfile);
+ make_cleanup_bfd_unref (abfd);
symbol_file_add_separate (abfd, symfile_flags, objfile);
- xfree (debugfile);
}
}
diff --git a/gdb/elfread.c b/gdb/elfread.c
index de61a9aa586..608a8682d83 100644
--- a/gdb/elfread.c
+++ b/gdb/elfread.c
@@ -1445,10 +1445,12 @@ elf_symfile_read (struct objfile *objfile, int symfile_flags)
if (debugfile)
{
+ struct cleanup *cleanup = make_cleanup (xfree, debugfile);
bfd *abfd = symfile_bfd_open (debugfile);
+ make_cleanup_bfd_unref (abfd);
symbol_file_add_separate (abfd, symfile_flags, objfile);
- xfree (debugfile);
+ do_cleanups (cleanup);
}
}
diff --git a/gdb/jit.c b/gdb/jit.c
index 410b94d8610..cdd9f49e071 100644
--- a/gdb/jit.c
+++ b/gdb/jit.c
@@ -896,7 +896,8 @@ JITed symbol file is not an object file, ignoring it.\n"));
++i;
}
- /* This call takes ownership of NBFD. It does not take ownership of SAI. */
+ /* This call does not take ownership of SAI. */
+ make_cleanup_bfd_unref (nbfd);
objfile = symbol_file_add_from_bfd (nbfd, 0, sai, OBJF_SHARED, NULL);
do_cleanups (old_cleanups);
diff --git a/gdb/machoread.c b/gdb/machoread.c
index 5b9e2ba4f64..0d7578a9142 100644
--- a/gdb/machoread.c
+++ b/gdb/machoread.c
@@ -454,6 +454,7 @@ macho_add_oso_symfile (oso_el *oso, bfd *abfd,
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;
@@ -631,11 +632,13 @@ macho_add_oso_symfile (oso_el *oso, bfd *abfd,
/* 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, 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. */
@@ -897,6 +900,7 @@ macho_symfile_read (struct objfile *objfile, int symfile_flags)
int ix;
oso_el *oso;
struct bfd_section *asect, *dsect;
+ struct cleanup *cleanup;
if (mach_o_debug_level > 0)
printf_unfiltered (_("dsym file found\n"));
@@ -917,7 +921,9 @@ macho_symfile_read (struct objfile *objfile, int symfile_flags)
}
/* Add the dsym file as a separate file. */
+ cleanup = make_cleanup_bfd_unref (dsym_bfd);
symbol_file_add_separate (dsym_bfd, symfile_flags, objfile);
+ do_cleanups (cleanup);
/* Don't try to read dwarf2 from main file or shared libraries. */
return;
diff --git a/gdb/objfiles.c b/gdb/objfiles.c
index 5ff0eb2536b..411618f9085 100644
--- a/gdb/objfiles.c
+++ b/gdb/objfiles.c
@@ -194,9 +194,10 @@ allocate_objfile (bfd *abfd, int flags)
/* Update the per-objfile information that comes from the bfd, ensuring
that any data that is reference is saved in the per-objfile data
- region. Note that we steal a reference to ABFD. */
+ region. */
objfile->obfd = abfd;
+ gdb_bfd_ref (abfd);
if (abfd != NULL)
{
/* Look up the gdbarch associated with the BFD. */
diff --git a/gdb/rs6000-nat.c b/gdb/rs6000-nat.c
index 140012bbebc..8c3f54606f2 100644
--- a/gdb/rs6000-nat.c
+++ b/gdb/rs6000-nat.c
@@ -798,7 +798,6 @@ add_vmap (LdInfo *ldi)
gdb_bfd_unref (abfd);
return NULL;
}
- gdb_bfd_ref (vp->bfd);
obj = allocate_objfile (vp->bfd, 0);
vp->objfile = obj;
diff --git a/gdb/solib.c b/gdb/solib.c
index 9779e100a01..73773f10989 100644
--- a/gdb/solib.c
+++ b/gdb/solib.c
@@ -610,7 +610,6 @@ solib_read_symbols (struct so_list *so, int flags)
sap = build_section_addr_info_from_section_table (so->sections,
so->sections_end);
- gdb_bfd_ref (so->abfd);
so->objfile = symbol_file_add_from_bfd (so->abfd,
flags, sap, OBJF_SHARED,
NULL);
diff --git a/gdb/spu-linux-nat.c b/gdb/spu-linux-nat.c
index a17ff3f831f..999f1abd978 100644
--- a/gdb/spu-linux-nat.c
+++ b/gdb/spu-linux-nat.c
@@ -374,8 +374,13 @@ spu_symbol_file_add_from_memory (int inferior_fd)
/* Open BFD representing SPE executable and read its symbols. */
nbfd = spu_bfd_open (addr);
if (nbfd)
- symbol_file_add_from_bfd (nbfd, SYMFILE_VERBOSE | SYMFILE_MAINLINE,
- NULL, 0, NULL);
+ {
+ struct cleanup *cleanup = make_cleanup_bfd_unref (nbfd);
+
+ symbol_file_add_from_bfd (nbfd, SYMFILE_VERBOSE | SYMFILE_MAINLINE,
+ NULL, 0, NULL);
+ do_cleanups (cleanup);
+ }
}
diff --git a/gdb/symfile-mem.c b/gdb/symfile-mem.c
index ad87abdf75d..2e53be05de4 100644
--- a/gdb/symfile-mem.c
+++ b/gdb/symfile-mem.c
@@ -111,15 +111,14 @@ symbol_file_add_from_memory (struct bfd *templ, CORE_ADDR addr, char *name,
xfree (name);
}
+ cleanup = make_cleanup_bfd_unref (nbfd);
+
if (!bfd_check_format (nbfd, bfd_object))
- {
- make_cleanup_bfd_unref (nbfd);
- error (_("Got object file from memory but can't read symbols: %s."),
- bfd_errmsg (bfd_get_error ()));
- }
+ error (_("Got object file from memory but can't read symbols: %s."),
+ bfd_errmsg (bfd_get_error ()));
sai = alloc_section_addr_info (bfd_count_sections (nbfd));
- cleanup = make_cleanup (xfree, sai);
+ make_cleanup (xfree, sai);
i = 0;
for (sec = nbfd->sections; sec != NULL; sec = sec->next)
if ((bfd_get_section_flags (nbfd, sec) & (SEC_ALLOC|SEC_LOAD)) != 0)
diff --git a/gdb/symfile.c b/gdb/symfile.c
index 64c4a3b23d3..e1d5c15d412 100644
--- a/gdb/symfile.c
+++ b/gdb/symfile.c
@@ -1037,7 +1037,7 @@ new_symfile_objfile (struct objfile *objfile, int add_flags)
loaded file.
ABFD is a BFD already open on the file, as from symfile_bfd_open.
- This BFD will be closed on error, and is always consumed by this function.
+ A new reference is acquired by this function.
ADD_FLAGS encodes verbosity, whether this is main symbol file or
extra, such as dynamically loaded code, and what to do with breakpoins.
@@ -1061,7 +1061,6 @@ symbol_file_add_with_addrs_or_offsets (bfd *abfd,
int flags, struct objfile *parent)
{
struct objfile *objfile;
- struct cleanup *my_cleanups;
const char *name = bfd_get_filename (abfd);
const int from_tty = add_flags & SYMFILE_VERBOSE;
const int mainline = add_flags & SYMFILE_MAINLINE;
@@ -1075,8 +1074,6 @@ symbol_file_add_with_addrs_or_offsets (bfd *abfd,
add_flags &= ~SYMFILE_NO_READ;
}
- my_cleanups = make_cleanup_bfd_unref (abfd);
-
/* Give user a chance to burp if we'd be
interactively wiping out any existing symbols. */
@@ -1087,7 +1084,6 @@ symbol_file_add_with_addrs_or_offsets (bfd *abfd,
error (_("Not confirmed."));
objfile = allocate_objfile (abfd, flags | (mainline ? OBJF_MAINLINE : 0));
- discard_cleanups (my_cleanups);
if (parent)
add_separate_debug_objfile (objfile, parent);
@@ -1208,8 +1204,14 @@ struct objfile *
symbol_file_add (char *name, int add_flags, struct section_addr_info *addrs,
int flags)
{
- return symbol_file_add_from_bfd (symfile_bfd_open (name), add_flags, addrs,
+ bfd *bfd = symfile_bfd_open (name);
+ struct cleanup *cleanup = make_cleanup_bfd_unref (bfd);
+ struct objfile *objf;
+
+ objf = symbol_file_add_from_bfd (symfile_bfd_open (name), add_flags, addrs,
flags, NULL);
+ do_cleanups (cleanup);
+ return objf;
}