* elfread.c (elf_symtab_read): Update.
authorTom Tromey <tromey@redhat.com>
Wed, 22 Aug 2012 16:01:09 +0000 (16:01 +0000)
committerTom Tromey <tromey@redhat.com>
Wed, 22 Aug 2012 16:01:09 +0000 (16:01 +0000)
* objfiles.c (objfiles_bfd_data): New global.
(get_objfile_bfd_data, free_objfile_per_bfd_storage)
(objfile_bfd_data_free, set_objfile_per_bfd): New functions.
(allocate_objfile, free_objfile): Update.
(_initialize_objfiles): Initialize objfiles_bfd_data.
* objfiles.h (struct objfile_per_bfd_storage): New.
(struct objfile) <per_bfd>: New field.
<filename_cache>: Remove.
(set_objfile_per_bfd): Declare.
* symfile.c (reread_symbols): Update.  Call
set_objfile_per_bfd.
(allocate_symtab): Update.
* symmisc.c (print_symbol_bcache_statistics): Update.
(print_objfile_statistics): Print the size of the BFD obstack.
gdb/testsuite
* gdb.base/maint.exp: Update.

gdb/ChangeLog
gdb/elfread.c
gdb/objfiles.c
gdb/objfiles.h
gdb/symfile.c
gdb/symmisc.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/maint.exp

index 4cf150c268c860c8cc02926378f04a9839a6e0bc..3b2bc5b0c9b6f01a8a4faf93cb4dce389009cf98 100644 (file)
@@ -1,3 +1,21 @@
+2012-08-22  Tom Tromey  <tromey@redhat.com>
+
+       * elfread.c (elf_symtab_read): Update.
+       * objfiles.c (objfiles_bfd_data): New global.
+       (get_objfile_bfd_data, free_objfile_per_bfd_storage)
+       (objfile_bfd_data_free, set_objfile_per_bfd): New functions.
+       (allocate_objfile, free_objfile): Update.
+       (_initialize_objfiles): Initialize objfiles_bfd_data.
+       * objfiles.h (struct objfile_per_bfd_storage): New.
+       (struct objfile) <per_bfd>: New field.
+       <filename_cache>: Remove.
+       (set_objfile_per_bfd): Declare.
+       * symfile.c (reread_symbols): Update.  Call
+       set_objfile_per_bfd.
+       (allocate_symtab): Update.
+       * symmisc.c (print_symbol_bcache_statistics): Update.
+       (print_objfile_statistics): Print the size of the BFD obstack.
+
 2012-08-22  Tom Tromey  <tromey@redhat.com>
 
        * gdb_bfd.h: Include registry.h.  Use DECLARE_REGISTRY.
index 22ac158a593cc245da1fef304e154d4d4eaa24d8..f3967d72b48e5cf3b7e1a6334ae35807c8d63a38 100644 (file)
@@ -353,7 +353,7 @@ elf_symtab_read (struct objfile *objfile, int type,
            }
          filesym = sym;
          filesymname = bcache (filesym->name, strlen (filesym->name) + 1,
-                               objfile->filename_cache);
+                               objfile->per_bfd->filename_cache);
        }
       else if (sym->flags & BSF_SECTION_SYM)
        continue;
index 57dd59463501b62bc62f11a952d1fca91ad5ebc7..250cf3514caa3865af88a3333edb5ebec4775739 100644 (file)
@@ -106,6 +106,74 @@ get_objfile_pspace_data (struct program_space *pspace)
   return info;
 }
 
+\f
+
+/* Per-BFD data key.  */
+
+static const struct bfd_data *objfiles_bfd_data;
+
+/* Create the per-BFD storage object for OBJFILE.  If ABFD is not
+   NULL, and it already has a per-BFD storage object, use that.
+   Otherwise, allocate a new per-BFD storage object.  If ABFD is not
+   NULL, the object is allocated on the BFD; otherwise it is allocated
+   on OBJFILE's obstack.  Note that it is not safe to call this
+   multiple times for a given OBJFILE -- it can only be called when
+   allocating or re-initializing OBJFILE.  */
+
+static struct objfile_per_bfd_storage *
+get_objfile_bfd_data (struct objfile *objfile, struct bfd *abfd)
+{
+  struct objfile_per_bfd_storage *storage = NULL;
+
+  if (abfd != NULL)
+    storage = bfd_data (abfd, objfiles_bfd_data);
+
+  if (storage == NULL)
+    {
+      if (abfd != NULL)
+       {
+         storage = bfd_zalloc (abfd, sizeof (struct objfile_per_bfd_storage));
+         set_bfd_data (abfd, objfiles_bfd_data, storage);
+       }
+      else
+       storage = OBSTACK_ZALLOC (&objfile->objfile_obstack,
+                                 struct objfile_per_bfd_storage);
+
+      obstack_init (&storage->storage_obstack);
+      storage->filename_cache = bcache_xmalloc (NULL, NULL);
+    }
+
+  return storage;
+}
+
+/* Free STORAGE.  */
+
+static void
+free_objfile_per_bfd_storage (struct objfile_per_bfd_storage *storage)
+{
+  bcache_xfree (storage->filename_cache);
+  obstack_free (&storage->storage_obstack, 0);
+}
+
+/* A wrapper for free_objfile_per_bfd_storage that can be passed as a
+   cleanup function to the BFD registry.  */
+
+static void
+objfile_bfd_data_free (struct bfd *unused, void *d)
+{
+  free_objfile_per_bfd_storage (d);
+}
+
+/* See objfiles.h.  */
+
+void
+set_objfile_per_bfd (struct objfile *objfile)
+{
+  objfile->per_bfd = get_objfile_bfd_data (objfile, objfile->obfd);
+}
+
+\f
+
 /* Called via bfd_map_over_sections to build up the section table that
    the objfile references.  The objfile contains pointers to the start
    of the table (objfile->sections) and to the first location after
@@ -184,7 +252,6 @@ allocate_objfile (bfd *abfd, int flags)
   objfile = (struct objfile *) xzalloc (sizeof (struct objfile));
   objfile->psymbol_cache = psymbol_bcache_init ();
   objfile->macro_cache = bcache_xmalloc (NULL, NULL);
-  objfile->filename_cache = bcache_xmalloc (NULL, NULL);
   /* We could use obstack_specify_allocation here instead, but
      gdb_obstack.h specifies the alloc/dealloc functions.  */
   obstack_init (&objfile->objfile_obstack);
@@ -214,6 +281,7 @@ allocate_objfile (bfd *abfd, int flags)
       objfile->name = xstrdup ("<<anonymous objfile>>");
     }
 
+  objfile->per_bfd = get_objfile_bfd_data (objfile, abfd);
   objfile->pspace = current_program_space;
 
   /* Initialize the section indexes for this objfile, so that we can
@@ -557,7 +625,10 @@ free_objfile (struct objfile *objfile)
      still may reference objfile->obfd.  */
   objfile_free_data (objfile);
 
-  gdb_bfd_unref (objfile->obfd);
+  if (objfile->obfd)
+    gdb_bfd_unref (objfile->obfd);
+  else
+    free_objfile_per_bfd_storage (objfile->per_bfd);
 
   /* Remove it from the chain of all objfiles.  */
 
@@ -606,7 +677,6 @@ free_objfile (struct objfile *objfile)
   /* Free the obstacks for non-reusable objfiles.  */
   psymbol_bcache_free (objfile->psymbol_cache);
   bcache_xfree (objfile->macro_cache);
-  bcache_xfree (objfile->filename_cache);
   if (objfile->demangled_names_hash)
     htab_delete (objfile->demangled_names_hash);
   obstack_free (&objfile->objfile_obstack, 0);
@@ -1383,4 +1453,7 @@ _initialize_objfiles (void)
   objfiles_pspace_data
     = register_program_space_data_with_cleanup (NULL,
                                                objfiles_pspace_data_cleanup);
+
+  objfiles_bfd_data = register_bfd_data_with_cleanup (NULL,
+                                                     objfile_bfd_data_free);
 }
index 097f4dbbd59d09ad8b3f427bbdf554be737afdef..2b95ce47fc15cdb5158b82a1e0ee9ccb34e69ca8 100644 (file)
@@ -160,6 +160,22 @@ extern void print_symbol_bcache_statistics (void);
 /* Number of entries in the minimal symbol hash table.  */
 #define MINIMAL_SYMBOL_HASH_SIZE 2039
 
+/* Some objfile data is hung off the BFD.  This enables sharing of the
+   data across all objfiles using the BFD.  The data is stored in an
+   instance of this structure, and associated with the BFD using the
+   registry system.  */
+
+struct objfile_per_bfd_storage
+{
+  /* The storage has an obstack of its own.  */
+
+  struct obstack storage_obstack;
+  
+  /* Byte cache for file names.  */
+
+  struct bcache *filename_cache;
+};
+
 /* Master structure for keeping track of each file from which
    gdb reads symbols.  There are several ways these get allocated: 1.
    The main symbol file, symfile_objfile, set by the symbol-file command,
@@ -222,6 +238,11 @@ struct objfile
 
     bfd *obfd;
 
+    /* The per-BFD data.  Note that this is treated specially if OBFD
+       is NULL.  */
+
+    struct objfile_per_bfd_storage *per_bfd;
+
     /* The gdbarch associated with the BFD.  Note that this gdbarch is
        determined solely from BFD information, without looking at target
        information.  The gdbarch determined from a running target may
@@ -249,7 +270,6 @@ struct objfile
 
     struct psymbol_bcache *psymbol_cache; /* Byte cache for partial syms.  */
     struct bcache *macro_cache;           /* Byte cache for macros.  */
-    struct bcache *filename_cache;       /* Byte cache for file names.  */
 
     /* Hash table for mapping symbol names to demangled names.  Each
        entry in the hash table is actually two consecutive strings,
@@ -649,4 +669,8 @@ extern void default_iterate_over_objfiles_in_search_order
 
 #define MULTI_OBJFILE_P() (object_files && object_files->next)
 
+/* Reset the per-BFD storage area on OBJ.  */
+
+void set_objfile_per_bfd (struct objfile *obj);
+
 #endif /* !defined (OBJFILES_H) */
index d070e48d42bc54b80356e09cd854bab96754e6ea..6ef1ac111ea4579e599d72cf7e123fb7bbb31fa3 100644 (file)
@@ -2550,8 +2550,6 @@ reread_symbols (void)
          objfile->psymbol_cache = psymbol_bcache_init ();
          bcache_xfree (objfile->macro_cache);
          objfile->macro_cache = bcache_xmalloc (NULL, NULL);
-         bcache_xfree (objfile->filename_cache);
-         objfile->filename_cache = bcache_xmalloc (NULL,NULL);
          if (objfile->demangled_names_hash != NULL)
            {
              htab_delete (objfile->demangled_names_hash);
@@ -2572,6 +2570,8 @@ reread_symbols (void)
          memset (&objfile->msymbol_demangled_hash, 0,
                  sizeof (objfile->msymbol_demangled_hash));
 
+         set_objfile_per_bfd (objfile);
+
          /* obstack_init also initializes the obstack so it is
             empty.  We could use obstack_specify_allocation but
             gdb_obstack.h specifies the alloc/dealloc functions.  */
@@ -2856,7 +2856,7 @@ allocate_symtab (const char *filename, struct objfile *objfile)
     obstack_alloc (&objfile->objfile_obstack, sizeof (struct symtab));
   memset (symtab, 0, sizeof (*symtab));
   symtab->filename = (char *) bcache (filename, strlen (filename) + 1,
-                                     objfile->filename_cache);
+                                     objfile->per_bfd->filename_cache);
   symtab->fullname = NULL;
   symtab->language = deduce_language_from_filename (filename);
   symtab->debugformat = "unknown";
index d3028e66ba82742ffafdd35897cb58ac5e5ce75a..3e9ca82d7e33a634cd57fd18162e3466ce8ae002 100644 (file)
@@ -93,7 +93,8 @@ print_symbol_bcache_statistics (void)
     print_bcache_statistics (psymbol_bcache_get_bcache (objfile->psymbol_cache),
                              "partial symbol cache");
     print_bcache_statistics (objfile->macro_cache, "preprocessor macro cache");
-    print_bcache_statistics (objfile->filename_cache, "file name cache");
+    print_bcache_statistics (objfile->per_bfd->filename_cache,
+                            "file name cache");
   }
 }
 
@@ -147,13 +148,15 @@ print_objfile_statistics (void)
                       OBJSTAT (objfile, sz_strtab));
     printf_filtered (_("  Total memory used for objfile obstack: %d\n"),
                     obstack_memory_used (&objfile->objfile_obstack));
+    printf_filtered (_("  Total memory used for BFD obstack: %d\n"),
+                    obstack_memory_used (&objfile->per_bfd->storage_obstack));
     printf_filtered (_("  Total memory used for psymbol cache: %d\n"),
                     bcache_memory_used (psymbol_bcache_get_bcache
                                          (objfile->psymbol_cache)));
     printf_filtered (_("  Total memory used for macro cache: %d\n"),
                     bcache_memory_used (objfile->macro_cache));
     printf_filtered (_("  Total memory used for file name cache: %d\n"),
-                    bcache_memory_used (objfile->filename_cache));
+                    bcache_memory_used (objfile->per_bfd->filename_cache));
   }
 }
 
index dbc2744ffd0af6a9632ed18fec9fc9718162e3f8..58744043891e364f63a5d21dc9d63096dba0d251 100644 (file)
@@ -1,3 +1,7 @@
+2012-08-22  Tom Tromey  <tromey@redhat.com>
+
+       * gdb.base/maint.exp: Update.
+
 2012-08-22  Tom Tromey  <tromey@redhat.com>
 
        * lib/gdb.exp (skip_unwinder_tests): New proc.
index 1c99150f56f5f231130453a2f19c3b34890b7dfb..2dc25f44b98888c7605ab1dedadb0cdb4480fd15 100644 (file)
@@ -150,7 +150,7 @@ if [istarget "*-*-cygwin*"] {
 
 send_gdb "maint print statistics\n"
 gdb_expect  {
-    -re "Statistics for\[^\n\r\]*break\[^\n\r\]*:\r\n  Number of \"minimal\" symbols read: $decimal\r\n  Number of \"partial\" symbols read: $decimal\r\n  Number of \"full\" symbols read: $decimal\r\n  Number of \"types\" defined: $decimal\r\n  Number of psym tables \\(not yet expanded\\): $decimal\r\n  Number of symbol tables: $decimal\r\n  Number of symbol tables with line tables: $decimal\r\n  Number of symbol tables with blockvectors: $decimal\r\n  Total memory used for objfile obstack: $decimal\r\n  Total memory used for psymbol cache: $decimal\r\n  Total memory used for macro cache: $decimal\r\n  Total memory used for file name cache: $decimal\r\n" {
+    -re "Statistics for\[^\n\r\]*break\[^\n\r\]*:\r\n  Number of \"minimal\" symbols read: $decimal\r\n  Number of \"partial\" symbols read: $decimal\r\n  Number of \"full\" symbols read: $decimal\r\n  Number of \"types\" defined: $decimal\r\n  Number of psym tables \\(not yet expanded\\): $decimal\r\n  Number of symbol tables: $decimal\r\n  Number of symbol tables with line tables: $decimal\r\n  Number of symbol tables with blockvectors: $decimal\r\n  Total memory used for objfile obstack: $decimal\r\n  Total memory used for BFD obstack: $decimal\r\n  Total memory used for psymbol cache: $decimal\r\n  Total memory used for macro cache: $decimal\r\n  Total memory used for file name cache: $decimal\r\n" {
        gdb_expect {
            -re "$gdb_prompt $" {
                pass "maint print statistics"