aboutsummaryrefslogtreecommitdiff
path: root/gdb/gdb_bfd.c
diff options
context:
space:
mode:
authorTom Tromey <tromey@redhat.com>2012-08-15 14:33:40 +0000
committerTom Tromey <tromey@redhat.com>2012-08-15 14:33:40 +0000
commitb82d08cd05cc5895a2b454a88b33bafd463de83d (patch)
treef251c63c0c3d4015a3aa4acd9e693dffd664447e /gdb/gdb_bfd.c
parentdb6573d6646f950b5a758fd68d180de8ae1e8981 (diff)
downloadgdb-b82d08cd05cc5895a2b454a88b33bafd463de83d.zip
gdb-b82d08cd05cc5895a2b454a88b33bafd463de83d.tar.gz
gdb-b82d08cd05cc5895a2b454a88b33bafd463de83d.tar.bz2
* gdb_bfd.c (struct gdb_bfd_data) <archive_bfd>: New field.
(gdb_bfd_ref): Initialize new field. (gdb_bfd_unref): Unref the archive BFD. (gdb_bfd_openr_next_archived_file): Acquire a reference to the parent archive.
Diffstat (limited to 'gdb/gdb_bfd.c')
-rw-r--r--gdb/gdb_bfd.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/gdb/gdb_bfd.c b/gdb/gdb_bfd.c
index a8210db..5781d57 100644
--- a/gdb/gdb_bfd.c
+++ b/gdb/gdb_bfd.c
@@ -81,6 +81,10 @@ struct gdb_bfd_data
/* The mtime of the BFD at the point the cache entry was made. */
time_t mtime;
+
+ /* If the BFD comes from an archive, this points to the archive's
+ BFD. Otherwise, this is NULL. */
+ bfd *archive_bfd;
};
/* A hash table storing all the BFDs maintained in the cache. */
@@ -249,6 +253,7 @@ gdb_bfd_ref (struct bfd *abfd)
gdata = bfd_zalloc (abfd, sizeof (struct gdb_bfd_data));
gdata->refc = 1;
gdata->mtime = bfd_get_mtime (abfd);
+ gdata->archive_bfd = NULL;
bfd_usrdata (abfd) = gdata;
/* This is the first we've seen it, so add it to the hash table. */
@@ -264,6 +269,7 @@ gdb_bfd_unref (struct bfd *abfd)
{
struct gdb_bfd_data *gdata;
struct gdb_bfd_cache_search search;
+ bfd *archive_bfd;
if (abfd == NULL)
return;
@@ -275,6 +281,7 @@ gdb_bfd_unref (struct bfd *abfd)
if (gdata->refc > 0)
return;
+ archive_bfd = gdata->archive_bfd;
search.filename = bfd_get_filename (abfd);
if (gdb_bfd_cache && search.filename)
@@ -295,6 +302,8 @@ gdb_bfd_unref (struct bfd *abfd)
htab_remove_elt (all_bfds, abfd);
gdb_bfd_close_or_warn (abfd);
+
+ gdb_bfd_unref (archive_bfd);
}
/* A helper function that returns the section data descriptor
@@ -588,8 +597,16 @@ gdb_bfd_openr_next_archived_file (bfd *archive, bfd *previous)
if (result)
{
+ struct gdb_bfd_data *gdata;
+
gdb_bfd_ref (result);
- /* No need to stash the filename here. */
+ /* No need to stash the filename here, because we also keep a
+ reference on the parent archive. */
+
+ gdata = bfd_usrdata (result);
+ gdb_assert (gdata->archive_bfd == NULL || gdata->archive_bfd == archive);
+ gdata->archive_bfd = archive;
+ gdb_bfd_ref (archive);
}
return result;