This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [PATCH 01/10] change gdb to refcount bfd everywhere
Tom> This changes allocate_objfile to acquire a reference to the BFD,
Tom> rather than steal a reference. Then it changes all callers, direct or
Tom> indirect, to follow.
Jan> map_vmap still steals a reference.
Here's what I am checking in for this.
I think I have addressed all your comments now.
Thanks for the reviews.
Tom
2012-07-23 Tom Tromey <tromey@redhat.com>
* rs6000-nat.c (add_vmap): Rewrite archive loop. Fix reference
counting.
* exec.c (exec_close_1): Unconditionally release vmap's BFD.
(map_vmap): Acquire a reference to the BFD.
diff --git a/gdb/exec.c b/gdb/exec.c
index 9b95e02..e076609 100644
--- a/gdb/exec.c
+++ b/gdb/exec.c
@@ -127,16 +127,13 @@ exec_close_1 (int quitting)
vp = nxt;
nxt = vp->nxt;
- /* if there is an objfile associated with this bfd,
- free_objfile() will do proper cleanup of objfile *and* bfd. */
-
if (vp->objfile)
{
free_objfile (vp->objfile);
need_symtab_cleanup = 1;
}
- else if (vp->bfd != exec_bfd)
- gdb_bfd_unref (vp->bfd);
+
+ gdb_bfd_unref (vp->bfd);
xfree (vp);
}
@@ -548,6 +545,7 @@ map_vmap (bfd *abfd, bfd *arch)
memset ((char *) vp, '\0', sizeof (*vp));
vp->nxt = 0;
vp->bfd = abfd;
+ gdb_bfd_ref (abfd);
vp->name = bfd_get_filename (arch ? arch : abfd);
vp->member = arch ? bfd_get_filename (abfd) : "";
diff --git a/gdb/rs6000-nat.c b/gdb/rs6000-nat.c
index 8c3f546..9b8efd3 100644
--- a/gdb/rs6000-nat.c
+++ b/gdb/rs6000-nat.c
@@ -765,12 +765,16 @@ add_vmap (LdInfo *ldi)
else if (bfd_check_format (abfd, bfd_archive))
{
- last = 0;
- /* FIXME??? am I tossing BFDs? bfd? */
- while ((last = gdb_bfd_openr_next_archived_file (abfd, last)))
+ last = gdb_bfd_openr_next_archived_file (abfd, NULL);
+ while (last != NULL)
{
+ bfd *next;
+
if (strcmp (mem, last->filename) == 0)
break;
+
+ next = gdb_bfd_openr_next_archived_file (abfd, last);
+ gdb_bfd_unref (last);
}
if (!last)
@@ -790,6 +794,9 @@ add_vmap (LdInfo *ldi)
}
vp = map_vmap (last, abfd);
+ /* map_vmap acquired a reference to LAST, so we can release
+ ours. */
+ gdb_bfd_unref (last);
}
else
{
@@ -804,6 +811,11 @@ add_vmap (LdInfo *ldi)
/* Always add symbols for the main objfile. */
if (vp == vmap || auto_solib_add)
vmap_add_symbols (vp);
+
+ /* Anything needing a reference to ABFD has already acquired it, so
+ release our local reference. */
+ gdb_bfd_unref (abfd);
+
return vp;
}