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]

Re: [RFC] Use custom hash function with bcache


On 08/18/2010 11:24 AM, Tom Tromey wrote:
"Sami" == sami wagiaalla<swagiaal@redhat.com> writes:

Sami> Although, you are right, there is no strict type checking. Are you Sami> suggesting we make psymbol_cache a new type ?

Yeah; at least, if it isn't too big.


Patch attached.


Create and use a specialized bcache type for psymbols

2010-08-19  Sami Wagiaalla  <swagiaal@redhat.com>

	* symfile.c (reread_symbols): Use psymbol_bcache_free, and
	psymbol_bcache_init.
	* psymtab.h (psymbol_bcache_init): New function prototype.
	(psymbol_bcache_free): New function prototype.
	* psymtab.c (psymbol_bcache_init): New function.
	(psymbol_bcache_free): New function.
	(psymbol_bcache_full): New function.
	(add_psymbol_to_bcache): use psymbol_bcache_full.
	* objfiles.h (psymbol_cache): Change type of psymbol_cache to
	psymbol_bcache.
	* symmisc.c (print_symbol_bcache_statistics): Updated.
	(print_objfile_statistics): Updated.
	* objfiles.c (allocate_objfile): Use psymbol_bcache_init to initialize
	psymbol_cache.
	(free_objfile): Use psymbol_bcache_free.

diff --git a/gdb/objfiles.c b/gdb/objfiles.c
index c479d22..6fc8a1f 100644
--- a/gdb/objfiles.c
+++ b/gdb/objfiles.c
@@ -199,7 +199,7 @@ allocate_objfile (bfd *abfd, int flags)
   struct objfile *objfile;
 
   objfile = (struct objfile *) xzalloc (sizeof (struct objfile));
-  objfile->psymbol_cache = bcache_xmalloc (psymbol_hash, psymbol_compare);
+  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
@@ -658,7 +658,7 @@ free_objfile (struct objfile *objfile)
   if (objfile->static_psymbols.list)
     xfree (objfile->static_psymbols.list);
   /* Free the obstacks for non-reusable objfiles */
-  bcache_xfree (objfile->psymbol_cache);
+  psymbol_bcache_free (objfile->psymbol_cache);
   bcache_xfree (objfile->macro_cache);
   bcache_xfree (objfile->filename_cache);
   if (objfile->demangled_names_hash)
diff --git a/gdb/objfiles.h b/gdb/objfiles.h
index 62fc1cb..ec4870b 100644
--- a/gdb/objfiles.h
+++ b/gdb/objfiles.h
@@ -249,7 +249,7 @@ struct objfile
     /* A byte cache where we can stash arbitrary "chunks" of bytes that
        will not change. */
 
-    struct bcache *psymbol_cache;	/* Byte cache for partial syms */
+    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.  */
 
diff --git a/gdb/psymtab.c b/gdb/psymtab.c
index 0d57b5e..ac013bb 100644
--- a/gdb/psymtab.c
+++ b/gdb/psymtab.c
@@ -1275,7 +1275,7 @@ start_psymtab_common (struct objfile *objfile,
    and name. These are the values which are set by
    add_psymbol_to_bcache.  */
 
-unsigned long
+static unsigned long
 psymbol_hash (const void *addr, int length)
 {
   unsigned long h = 0;
@@ -1297,7 +1297,7 @@ psymbol_hash (const void *addr, int length)
    For the comparison this function uses a symbols value,
    language, domain, class and name.  */
 
-int
+static int
 psymbol_compare (const void *addr1, const void *addr2, int length)
 {
   struct partial_symbol *sym1 = (struct partial_symbol *) addr1;
@@ -1311,6 +1311,44 @@ psymbol_compare (const void *addr1, const void *addr2, int length)
           && sym1->ginfo.name == sym2->ginfo.name);
 }
 
+/* Initialize a partial symbol bcache.  */
+
+struct psymbol_bcache *
+psymbol_bcache_init ()
+{
+    struct psymbol_bcache *bcache = XCALLOC (1, struct psymbol_bcache);
+    bcache->bcache = bcache_xmalloc (psymbol_hash, psymbol_compare);
+    return bcache;
+}
+
+/* Free a partial symbol bcache.  */
+void
+psymbol_bcache_free (struct psymbol_bcache *bcache)
+{
+
+  if (bcache == NULL)
+    return;
+
+  bcache_xfree(bcache->bcache);
+  xfree (bcache);
+}
+
+/* Find a copy of the SYM in BCACHE.  If BCACHE has never seen this
+   symbol before, add a copy to BCACHE.  In either case, return a pointer
+   to BCACHE's copy of the symbol.  If optional ADDED is not NULL, return
+   1 in case of new entry or 0 if returning an old entry.  */
+
+static const struct partial_symbol *
+psymbol_bcache_full (struct partial_symbol *sym,
+             struct psymbol_bcache *bcache,
+             int *added)
+{
+    return bcache_full (sym,
+                        sizeof (struct partial_symbol),
+                        bcache->bcache,
+                        added);
+}
+
 /* Helper function, initialises partial symbol structure and stashes 
    it into objfile's bcache.  Note that our caching mechanism will
    use all fields of struct partial_symbol to determine hash value of the
@@ -1352,8 +1390,9 @@ add_psymbol_to_bcache (char *name, int namelength, int copy_name,
   SYMBOL_SET_NAMES (&psymbol, name, namelength, copy_name, objfile);
 
   /* Stash the partial symbol away in the cache */
-  return bcache_full (&psymbol, sizeof (struct partial_symbol),
-		      objfile->psymbol_cache, added);
+  return psymbol_bcache_full (&psymbol,
+                              objfile->psymbol_cache,
+                              added);
 }
 
 /* Helper function, adds partial symbol to the given partial symbol
diff --git a/gdb/psymtab.h b/gdb/psymtab.h
index 0786944..f3ea677 100644
--- a/gdb/psymtab.h
+++ b/gdb/psymtab.h
@@ -20,8 +20,14 @@
 #ifndef PSYMTAB_H
 #define PSYMTAB_H
 
-extern unsigned long psymbol_hash (const void *addr, int length);
-extern int psymbol_compare (const void *addr1, const void *addr2, int length);
+/* A bcache for partial symbols.  */
+
+struct psymbol_bcache {
+    struct bcache *bcache;
+};
+
+extern struct psymbol_bcache *psymbol_bcache_init ();
+extern void psymbol_bcache_free (struct psymbol_bcache *);
 
 void map_partial_symbol_names (void (*) (const char *, void *), void *);
 
diff --git a/gdb/symfile.c b/gdb/symfile.c
index 048b8a8..087cd3a 100644
--- a/gdb/symfile.c
+++ b/gdb/symfile.c
@@ -2431,9 +2431,8 @@ reread_symbols (void)
 		  sizeof (objfile->static_psymbols));
 
 	  /* Free the obstacks for non-reusable objfiles */
-	  bcache_xfree (objfile->psymbol_cache);
-	  objfile->psymbol_cache = bcache_xmalloc (psymbol_hash,
-	                                           psymbol_compare);
+	  psymbol_bcache_free (objfile->psymbol_cache);
+	  objfile->psymbol_cache = psymbol_bcache_init ();
 	  bcache_xfree (objfile->macro_cache);
 	  objfile->macro_cache = bcache_xmalloc (NULL, NULL);
 	  bcache_xfree (objfile->filename_cache);
@@ -2459,8 +2458,7 @@ reread_symbols (void)
 	  memset (&objfile->msymbol_demangled_hash, 0,
 		  sizeof (objfile->msymbol_demangled_hash));
 
-	  objfile->psymbol_cache = bcache_xmalloc (psymbol_hash,
-	                                           psymbol_compare);
+	  objfile->psymbol_cache = psymbol_bcache_init ();
 	  objfile->macro_cache = bcache_xmalloc (NULL, NULL);
 	  objfile->filename_cache = bcache_xmalloc (NULL, NULL);
 	  /* obstack_init also initializes the obstack so it is
diff --git a/gdb/symmisc.c b/gdb/symmisc.c
index 62e6b97..399843b 100644
--- a/gdb/symmisc.c
+++ b/gdb/symmisc.c
@@ -130,7 +130,8 @@ print_symbol_bcache_statistics (void)
     ALL_PSPACE_OBJFILES (pspace, objfile)
   {
     printf_filtered (_("Byte cache statistics for '%s':\n"), objfile->name);
-    print_bcache_statistics (objfile->psymbol_cache, "partial symbol cache");
+    print_bcache_statistics (objfile->psymbol_cache->bcache,
+                             "partial symbol cache");
     print_bcache_statistics (objfile->macro_cache, "preprocessor macro cache");
     print_bcache_statistics (objfile->filename_cache, "file name cache");
   }
@@ -188,7 +189,7 @@ print_objfile_statistics (void)
     printf_filtered (_("  Total memory used for objfile obstack: %d\n"),
 		     obstack_memory_used (&objfile->objfile_obstack));
     printf_filtered (_("  Total memory used for psymbol cache: %d\n"),
-		     bcache_memory_used (objfile->psymbol_cache));
+		     bcache_memory_used (objfile->psymbol_cache->bcache));
     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"),

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