From da1cc82f30edcf2d49dd89911fc471a5e07d3d94 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Mon, 23 Jul 2012 18:54:26 +0000 Subject: [PATCH] * 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. --- gdb/ChangeLog | 7 +++++++ gdb/exec.c | 8 +++----- gdb/rs6000-nat.c | 18 +++++++++++++++--- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 062eefdd93..bce298b13b 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2012-07-23 Tom Tromey + + * 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 * p-valprint.c (pascal_object_print_value): Replace potentially diff --git a/gdb/exec.c b/gdb/exec.c index 9b95e028ea..e0766093d1 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 8c3f54606f..9b8efd3fdc 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; } -- 2.34.1