* jit.c (jit_object_close_impl): Don't malloc the objfile
authorTom Tromey <tromey@redhat.com>
Wed, 22 Aug 2012 16:44:45 +0000 (16:44 +0000)
committerTom Tromey <tromey@redhat.com>
Wed, 22 Aug 2012 16:44:45 +0000 (16:44 +0000)
name.
* objfiles.c (allocate_objfile): Don't malloc the objfile
name.
(free_objfile): Don't free the objfile name.
* objfiles.h (struct objfile) <name>: Update comment.
* symfile.c (reread_symbols): Fix reference counting.  Don't
malloc objfile name.

gdb/ChangeLog
gdb/jit.c
gdb/objfiles.c
gdb/objfiles.h
gdb/symfile.c

index 2f54efc..b0520e1 100644 (file)
@@ -1,5 +1,16 @@
 2012-08-22  Tom Tromey  <tromey@redhat.com>
 
+       * jit.c (jit_object_close_impl): Don't malloc the objfile
+       name.
+       * objfiles.c (allocate_objfile): Don't malloc the objfile
+       name.
+       (free_objfile): Don't free the objfile name.
+       * objfiles.h (struct objfile) <name>: Update comment.
+       * symfile.c (reread_symbols): Fix reference counting.  Don't
+       malloc objfile name.
+
+2012-08-22  Tom Tromey  <tromey@redhat.com>
+
        * windows-nat.c (windows_make_so): Use gdb_bfd_open.
        * symfile.c (bfd_open_maybe_remote): Use gdb_bfd_open.
        (symfile_bfd_open): Likewise.
index 26de189..9e8f295 100644 (file)
--- a/gdb/jit.c
+++ b/gdb/jit.c
@@ -761,8 +761,7 @@ jit_object_close_impl (struct gdb_symbol_callbacks *cb,
 
   terminate_minimal_symbol_table (objfile);
 
-  xfree (objfile->name);
-  objfile->name = xstrdup ("<< JIT compiled code >>");
+  objfile->name = "<< JIT compiled code >>";
 
   j = NULL;
   for (i = obj->symtabs; i; i = j)
index d5317a8..a1db8c6 100644 (file)
@@ -271,7 +271,7 @@ allocate_objfile (bfd *abfd, int flags)
       /* Look up the gdbarch associated with the BFD.  */
       objfile->gdbarch = gdbarch_from_bfd (abfd);
 
-      objfile->name = xstrdup (bfd_get_filename (abfd));
+      objfile->name = bfd_get_filename (abfd);
       objfile->mtime = bfd_get_mtime (abfd);
 
       /* Build section table.  */
@@ -279,7 +279,7 @@ allocate_objfile (bfd *abfd, int flags)
     }
   else
     {
-      objfile->name = xstrdup ("<<anonymous objfile>>");
+      objfile->name = "<<anonymous objfile>>";
     }
 
   objfile->per_bfd = get_objfile_bfd_data (objfile, abfd);
@@ -670,7 +670,6 @@ free_objfile (struct objfile *objfile)
 
   /* The last thing we do is free the objfile struct itself.  */
 
-  xfree (objfile->name);
   if (objfile->global_psymbols.list)
     xfree (objfile->global_psymbols.list);
   if (objfile->static_psymbols.list)
index 24124fe..304f935 100644 (file)
@@ -197,8 +197,9 @@ struct objfile
 
     struct objfile *next;
 
-    /* The object file's name, tilde-expanded and absolute.  Malloc'd; free it
-       if you free this struct.  This pointer is never NULL.  */
+    /* The object file's name, tilde-expanded and absolute.  This
+       pointer is never NULL.  This does not have to be freed; it is
+       guaranteed to have a lifetime at least as long as the objfile.  */
 
     char *name;
 
index 7c202b5..a07f84c 100644 (file)
@@ -2506,9 +2506,7 @@ reread_symbols (void)
 
          clear_objfile_data (objfile);
 
-         /* Clean up any state BFD has sitting around.  We don't need
-            to close the descriptor but BFD lacks a way of closing the
-            BFD without closing the descriptor.  */
+         /* Clean up any state BFD has sitting around.  */
          {
            struct bfd *obfd = objfile->obfd;
 
@@ -2516,11 +2514,18 @@ reread_symbols (void)
            /* Open the new BFD before freeing the old one, so that
               the filename remains live.  */
            objfile->obfd = gdb_bfd_open_maybe_remote (obfd_filename);
+           if (objfile->obfd == NULL)
+             {
+               /* We have to make a cleanup and error here, rather
+                  than erroring later, because once we unref OBFD,
+                  OBFD_FILENAME will be freed.  */
+               make_cleanup_bfd_unref (obfd);
+               error (_("Can't open %s to read symbols."), obfd_filename);
+             }
            gdb_bfd_unref (obfd);
          }
 
-         if (objfile->obfd == NULL)
-           error (_("Can't open %s to read symbols."), objfile->name);
+         objfile->name = bfd_get_filename (objfile->obfd);
          /* bfd_openr sets cacheable to true, which is what we want.  */
          if (!bfd_check_format (objfile->obfd, bfd_object))
            error (_("Can't read symbols from %s: %s."), objfile->name,