diff options
-rw-r--r-- | gdb/ChangeLog | 8 | ||||
-rw-r--r-- | gdb/gdb_bfd.c | 19 |
2 files changed, 26 insertions, 1 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 8886b8c..3999aa7 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,13 @@ 2012-08-15 Tom Tromey <tromey@redhat.com> + * 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. + +2012-08-15 Tom Tromey <tromey@redhat.com> + PR python/14387: * python/py-bpevent.c (create_breakpoint_event_object): Update comment. 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; |