This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

FYI: bcache symbol table file names


I am going to check this in.

My massif profiling revealed that we were allocating several megabytes
of memory for file names:

->02.97% (7,225,792B) 0x8231240: obsavestring (symfile.c:228)
| ->02.57% (6,270,752B) 0x8235819: allocate_psymtab (symfile.c:2763)

That line is:

  psymtab->filename = obsavestring (filename, strlen (filename),
				    &objfile->objfile_obstack);


It occurred to me that, probably, the identical file name will occur
frequently in a given objfile.  So, this patch adds a bcache for file
names.  I considered applying the "don't copy" treatment here, but
whether the name is safe to stash depends on whether it is absolute, and
I thought bcaching would thus yield a better result in general.

Peak space before: 221032144
Peak space after : 216348112
Savings          :   4684032

This is about 2% of the heap.


Built and regression tested on x86-64 (compile farm).

Tom

2009-11-05  Tom Tromey  <tromey@redhat.com>

	* symmisc.c (print_symbol_bcache_statistics): Print filename cache
	statistics.
	(print_objfile_statistics): Likewise.
	* symfile.c (reread_symbols): Initialize filename_cache.
	(allocate_symtab): Cache the file name.
	(allocate_psymtab): Likewise.
	* solib-sunos.c (allocate_rt_common_objfile): Initialize
	filename_cache.
	* objfiles.h (struct objfile) <filename_cache>: New field.
	* objfiles.c (allocate_objfile): Initialize filename_cache.
	(free_objfile): Free filename_cache.

diff --git a/gdb/objfiles.c b/gdb/objfiles.c
index 0425d7a..48f2613 100644
--- a/gdb/objfiles.c
+++ b/gdb/objfiles.c
@@ -199,6 +199,7 @@ allocate_objfile (bfd *abfd, int flags)
   objfile = (struct objfile *) xzalloc (sizeof (struct objfile));
   objfile->psymbol_cache = bcache_xmalloc ();
   objfile->macro_cache = bcache_xmalloc ();
+  objfile->filename_cache = bcache_xmalloc ();
   /* We could use obstack_specify_allocation here instead, but
      gdb_obstack.h specifies the alloc/dealloc functions.  */
   obstack_init (&objfile->objfile_obstack);
@@ -561,6 +562,7 @@ free_objfile (struct objfile *objfile)
   /* Free the obstacks for non-reusable objfiles */
   bcache_xfree (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);
diff --git a/gdb/objfiles.h b/gdb/objfiles.h
index 97e6b55..d662d12 100644
--- a/gdb/objfiles.h
+++ b/gdb/objfiles.h
@@ -251,6 +251,7 @@ struct objfile
 
     struct 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,
diff --git a/gdb/solib-sunos.c b/gdb/solib-sunos.c
index 9b2a470..02793f1 100644
--- a/gdb/solib-sunos.c
+++ b/gdb/solib-sunos.c
@@ -191,6 +191,7 @@ allocate_rt_common_objfile (void)
   memset (objfile, 0, sizeof (struct objfile));
   objfile->psymbol_cache = bcache_xmalloc ();
   objfile->macro_cache = bcache_xmalloc ();
+  objfile->filename_cache = bcache_xmalloc ();
   obstack_init (&objfile->objfile_obstack);
   objfile->name = xstrdup ("rt_common");
 
diff --git a/gdb/symfile.c b/gdb/symfile.c
index 1e57c69..0cd35ae 100644
--- a/gdb/symfile.c
+++ b/gdb/symfile.c
@@ -2402,6 +2402,8 @@ reread_symbols (void)
 	      objfile->psymbol_cache = bcache_xmalloc ();
 	      bcache_xfree (objfile->macro_cache);
 	      objfile->macro_cache = bcache_xmalloc ();
+	      bcache_xfree (objfile->filename_cache);
+	      objfile->filename_cache = bcache_xmalloc ();
 	      if (objfile->demangled_names_hash != NULL)
 		{
 		  htab_delete (objfile->demangled_names_hash);
@@ -2424,6 +2426,7 @@ reread_symbols (void)
 
 	      objfile->psymbol_cache = bcache_xmalloc ();
 	      objfile->macro_cache = bcache_xmalloc ();
+	      objfile->filename_cache = bcache_xmalloc ();
 	      /* obstack_init also initializes the obstack so it is
 	         empty.  We could use obstack_specify_allocation but
 	         gdb_obstack.h specifies the alloc/dealloc
@@ -2746,8 +2749,8 @@ allocate_symtab (char *filename, struct objfile *objfile)
   symtab = (struct symtab *)
     obstack_alloc (&objfile->objfile_obstack, sizeof (struct symtab));
   memset (symtab, 0, sizeof (*symtab));
-  symtab->filename = obsavestring (filename, strlen (filename),
-				   &objfile->objfile_obstack);
+  symtab->filename = (char *) bcache (filename, strlen (filename) + 1,
+				      objfile->filename_cache);
   symtab->fullname = NULL;
   symtab->language = deduce_language_from_filename (filename);
   symtab->debugformat = obsavestring ("unknown", 7,
@@ -2778,8 +2781,8 @@ allocate_psymtab (char *filename, struct objfile *objfile)
 		     sizeof (struct partial_symtab));
 
   memset (psymtab, 0, sizeof (struct partial_symtab));
-  psymtab->filename = obsavestring (filename, strlen (filename),
-				    &objfile->objfile_obstack);
+  psymtab->filename = (char *) bcache (filename, strlen (filename) + 1,
+				       objfile->filename_cache);
   psymtab->symtab = NULL;
 
   /* Prepend it to the psymtab list for the objfile it belongs to.
diff --git a/gdb/symmisc.c b/gdb/symmisc.c
index 4044981..c45135c 100644
--- a/gdb/symmisc.c
+++ b/gdb/symmisc.c
@@ -140,6 +140,7 @@ print_symbol_bcache_statistics (void)
     printf_filtered (_("Byte cache statistics for '%s':\n"), objfile->name);
     print_bcache_statistics (objfile->psymbol_cache, "partial symbol cache");
     print_bcache_statistics (objfile->macro_cache, "preprocessor macro cache");
+    print_bcache_statistics (objfile->filename_cache, "file name cache");
   }
   immediate_quit--;
 }
@@ -204,6 +205,8 @@ print_objfile_statistics (void)
 		     bcache_memory_used (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));
   }
   immediate_quit--;
 }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]