* 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.
This commit is contained in:
Tom Tromey 2012-07-23 18:54:26 +00:00
parent 6c18f3e0f4
commit da1cc82f30
3 changed files with 25 additions and 8 deletions

View File

@ -1,3 +1,10 @@
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.
2012-07-23 Siddhesh Poyarekar <siddhesh@redhat.com> 2012-07-23 Siddhesh Poyarekar <siddhesh@redhat.com>
* p-valprint.c (pascal_object_print_value): Replace potentially * p-valprint.c (pascal_object_print_value): Replace potentially

View File

@ -127,16 +127,13 @@ exec_close_1 (int quitting)
vp = nxt; vp = nxt;
nxt = 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) if (vp->objfile)
{ {
free_objfile (vp->objfile); free_objfile (vp->objfile);
need_symtab_cleanup = 1; need_symtab_cleanup = 1;
} }
else if (vp->bfd != exec_bfd)
gdb_bfd_unref (vp->bfd); gdb_bfd_unref (vp->bfd);
xfree (vp); xfree (vp);
} }
@ -548,6 +545,7 @@ map_vmap (bfd *abfd, bfd *arch)
memset ((char *) vp, '\0', sizeof (*vp)); memset ((char *) vp, '\0', sizeof (*vp));
vp->nxt = 0; vp->nxt = 0;
vp->bfd = abfd; vp->bfd = abfd;
gdb_bfd_ref (abfd);
vp->name = bfd_get_filename (arch ? arch : abfd); vp->name = bfd_get_filename (arch ? arch : abfd);
vp->member = arch ? bfd_get_filename (abfd) : ""; vp->member = arch ? bfd_get_filename (abfd) : "";

View File

@ -765,12 +765,16 @@ add_vmap (LdInfo *ldi)
else if (bfd_check_format (abfd, bfd_archive)) else if (bfd_check_format (abfd, bfd_archive))
{ {
last = 0; last = gdb_bfd_openr_next_archived_file (abfd, NULL);
/* FIXME??? am I tossing BFDs? bfd? */ while (last != NULL)
while ((last = gdb_bfd_openr_next_archived_file (abfd, last)))
{ {
bfd *next;
if (strcmp (mem, last->filename) == 0) if (strcmp (mem, last->filename) == 0)
break; break;
next = gdb_bfd_openr_next_archived_file (abfd, last);
gdb_bfd_unref (last);
} }
if (!last) if (!last)
@ -790,6 +794,9 @@ add_vmap (LdInfo *ldi)
} }
vp = map_vmap (last, abfd); vp = map_vmap (last, abfd);
/* map_vmap acquired a reference to LAST, so we can release
ours. */
gdb_bfd_unref (last);
} }
else else
{ {
@ -804,6 +811,11 @@ add_vmap (LdInfo *ldi)
/* Always add symbols for the main objfile. */ /* Always add symbols for the main objfile. */
if (vp == vmap || auto_solib_add) if (vp == vmap || auto_solib_add)
vmap_add_symbols (vp); 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; return vp;
} }