* rs6000-nat.c (add_vmap): Rewrite archive loop. Fix reference
authorTom Tromey <tromey@redhat.com>
Mon, 23 Jul 2012 18:54:26 +0000 (18:54 +0000)
committerTom Tromey <tromey@redhat.com>
Mon, 23 Jul 2012 18:54:26 +0000 (18:54 +0000)
counting.
* exec.c (exec_close_1): Unconditionally release vmap's BFD.
(map_vmap): Acquire a reference to the BFD.

gdb/ChangeLog
gdb/exec.c
gdb/rs6000-nat.c

index 062eefdd9320efaf189fa329e448cb0c243322a0..bce298b13b4985e2e51b23bbb7799f5c6ac9b848 100644 (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>
 
        * p-valprint.c (pascal_object_print_value): Replace potentially
index 9b95e028ea4216ad688391480465cd9fc58b6d95..e0766093d172ac99c882ec7b7ace74541b74a5fd 100644 (file)
@@ -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) : "";
 
index 8c3f54606f2db5730a7865600b5479dd1ef6ce83..9b8efd3fdca9e66833a9e64b361cf9887bced5f3 100644 (file)
@@ -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;
 }
 \f