Create and use a specialized bcache type for psymbols

2010-08-31  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.
	(psymbol_bcache_get_bcache): New function prototype.
	* psymtab.c (psymbol_bcache_init): New function.
	(psymbol_bcache_free): New function.
	(psymbol_bcache_full): New function.
	(psymbol_bcache_get_bcache): 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.
This commit is contained in:
Sami Wagiaalla 2010-08-31 20:10:42 +00:00
parent 6438229074
commit 710e1a31c4
7 changed files with 92 additions and 16 deletions

View file

@ -1,3 +1,23 @@
2010-08-31 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.
(psymbol_bcache_get_bcache): New function prototype.
* psymtab.c (psymbol_bcache_init): New function.
(psymbol_bcache_free): New function.
(psymbol_bcache_full): New function.
(psymbol_bcache_get_bcache): 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.
2010-08-31 Tom Tromey <tromey@redhat.com> 2010-08-31 Tom Tromey <tromey@redhat.com>
PR c++/11961: PR c++/11961:

View file

@ -199,7 +199,7 @@ allocate_objfile (bfd *abfd, int flags)
struct objfile *objfile; struct objfile *objfile;
objfile = (struct objfile *) xzalloc (sizeof (struct 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->macro_cache = bcache_xmalloc (NULL, NULL);
objfile->filename_cache = bcache_xmalloc (NULL, NULL); objfile->filename_cache = bcache_xmalloc (NULL, NULL);
/* We could use obstack_specify_allocation here instead, but /* We could use obstack_specify_allocation here instead, but
@ -658,7 +658,7 @@ free_objfile (struct objfile *objfile)
if (objfile->static_psymbols.list) if (objfile->static_psymbols.list)
xfree (objfile->static_psymbols.list); xfree (objfile->static_psymbols.list);
/* Free the obstacks for non-reusable objfiles */ /* 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->macro_cache);
bcache_xfree (objfile->filename_cache); bcache_xfree (objfile->filename_cache);
if (objfile->demangled_names_hash) if (objfile->demangled_names_hash)

View file

@ -249,7 +249,7 @@ struct objfile
/* A byte cache where we can stash arbitrary "chunks" of bytes that /* A byte cache where we can stash arbitrary "chunks" of bytes that
will not change. */ 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 *macro_cache; /* Byte cache for macros */
struct bcache *filename_cache; /* Byte cache for file names. */ struct bcache *filename_cache; /* Byte cache for file names. */

View file

@ -37,6 +37,11 @@
#define DEV_TTY "/dev/tty" #define DEV_TTY "/dev/tty"
#endif #endif
struct psymbol_bcache
{
struct bcache *bcache;
};
/* A fast way to get from a psymtab to its symtab (after the first time). */ /* A fast way to get from a psymtab to its symtab (after the first time). */
#define PSYMTAB_TO_SYMTAB(pst) \ #define PSYMTAB_TO_SYMTAB(pst) \
((pst) -> symtab != NULL ? (pst) -> symtab : psymtab_to_symtab (pst)) ((pst) -> symtab != NULL ? (pst) -> symtab : psymtab_to_symtab (pst))
@ -1275,7 +1280,7 @@ start_psymtab_common (struct objfile *objfile,
and name. These are the values which are set by and name. These are the values which are set by
add_psymbol_to_bcache. */ add_psymbol_to_bcache. */
unsigned long static unsigned long
psymbol_hash (const void *addr, int length) psymbol_hash (const void *addr, int length)
{ {
unsigned long h = 0; unsigned long h = 0;
@ -1297,7 +1302,7 @@ psymbol_hash (const void *addr, int length)
For the comparison this function uses a symbols value, For the comparison this function uses a symbols value,
language, domain, class and name. */ language, domain, class and name. */
int static int
psymbol_compare (const void *addr1, const void *addr2, int length) psymbol_compare (const void *addr1, const void *addr2, int length)
{ {
struct partial_symbol *sym1 = (struct partial_symbol *) addr1; struct partial_symbol *sym1 = (struct partial_symbol *) addr1;
@ -1311,6 +1316,51 @@ psymbol_compare (const void *addr1, const void *addr2, int length)
&& sym1->ginfo.name == sym2->ginfo.name); && sym1->ginfo.name == sym2->ginfo.name);
} }
/* Initialize a partial symbol bcache. */
struct psymbol_bcache *
psymbol_bcache_init (void)
{
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);
}
/* Return the internal bcache of the psymbol_bcache BCACHE*/
struct bcache *
psymbol_bcache_get_bcache (struct psymbol_bcache *bcache)
{
return bcache->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 /* Helper function, initialises partial symbol structure and stashes
it into objfile's bcache. Note that our caching mechanism will it into objfile's bcache. Note that our caching mechanism will
use all fields of struct partial_symbol to determine hash value of the use all fields of struct partial_symbol to determine hash value of the
@ -1345,8 +1395,9 @@ add_psymbol_to_bcache (char *name, int namelength, int copy_name,
SYMBOL_SET_NAMES (&psymbol, name, namelength, copy_name, objfile); SYMBOL_SET_NAMES (&psymbol, name, namelength, copy_name, objfile);
/* Stash the partial symbol away in the cache */ /* Stash the partial symbol away in the cache */
return bcache_full (&psymbol, sizeof (struct partial_symbol), return psymbol_bcache_full (&psymbol,
objfile->psymbol_cache, added); objfile->psymbol_cache,
added);
} }
/* Helper function, adds partial symbol to the given partial symbol /* Helper function, adds partial symbol to the given partial symbol

View file

@ -20,8 +20,13 @@
#ifndef PSYMTAB_H #ifndef PSYMTAB_H
#define PSYMTAB_H #define PSYMTAB_H
extern unsigned long psymbol_hash (const void *addr, int length); /* A bcache for partial symbols. */
extern int psymbol_compare (const void *addr1, const void *addr2, int length);
struct psymbol_bcache;
extern struct psymbol_bcache *psymbol_bcache_init (void);
extern void psymbol_bcache_free (struct psymbol_bcache *);
extern struct bcache *psymbol_bcache_get_bcache (struct psymbol_bcache *);
void map_partial_symbol_names (void (*) (const char *, void *), void *); void map_partial_symbol_names (void (*) (const char *, void *), void *);

View file

@ -2431,9 +2431,8 @@ reread_symbols (void)
sizeof (objfile->static_psymbols)); sizeof (objfile->static_psymbols));
/* Free the obstacks for non-reusable objfiles */ /* Free the obstacks for non-reusable objfiles */
bcache_xfree (objfile->psymbol_cache); psymbol_bcache_free (objfile->psymbol_cache);
objfile->psymbol_cache = bcache_xmalloc (psymbol_hash, objfile->psymbol_cache = psymbol_bcache_init ();
psymbol_compare);
bcache_xfree (objfile->macro_cache); bcache_xfree (objfile->macro_cache);
objfile->macro_cache = bcache_xmalloc (NULL, NULL); objfile->macro_cache = bcache_xmalloc (NULL, NULL);
bcache_xfree (objfile->filename_cache); bcache_xfree (objfile->filename_cache);
@ -2459,8 +2458,7 @@ reread_symbols (void)
memset (&objfile->msymbol_demangled_hash, 0, memset (&objfile->msymbol_demangled_hash, 0,
sizeof (objfile->msymbol_demangled_hash)); sizeof (objfile->msymbol_demangled_hash));
objfile->psymbol_cache = bcache_xmalloc (psymbol_hash, objfile->psymbol_cache = psymbol_bcache_init ();
psymbol_compare);
objfile->macro_cache = bcache_xmalloc (NULL, NULL); objfile->macro_cache = bcache_xmalloc (NULL, NULL);
objfile->filename_cache = bcache_xmalloc (NULL, NULL); objfile->filename_cache = bcache_xmalloc (NULL, NULL);
/* obstack_init also initializes the obstack so it is /* obstack_init also initializes the obstack so it is

View file

@ -130,7 +130,8 @@ print_symbol_bcache_statistics (void)
ALL_PSPACE_OBJFILES (pspace, objfile) ALL_PSPACE_OBJFILES (pspace, objfile)
{ {
printf_filtered (_("Byte cache statistics for '%s':\n"), objfile->name); printf_filtered (_("Byte cache statistics for '%s':\n"), objfile->name);
print_bcache_statistics (objfile->psymbol_cache, "partial symbol cache"); 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->macro_cache, "preprocessor macro cache");
print_bcache_statistics (objfile->filename_cache, "file name cache"); print_bcache_statistics (objfile->filename_cache, "file name cache");
} }
@ -188,7 +189,8 @@ print_objfile_statistics (void)
printf_filtered (_(" Total memory used for objfile obstack: %d\n"), printf_filtered (_(" Total memory used for objfile obstack: %d\n"),
obstack_memory_used (&objfile->objfile_obstack)); obstack_memory_used (&objfile->objfile_obstack));
printf_filtered (_(" Total memory used for psymbol cache: %d\n"), printf_filtered (_(" Total memory used for psymbol cache: %d\n"),
bcache_memory_used (objfile->psymbol_cache)); bcache_memory_used (psymbol_bcache_get_bcache
(objfile->psymbol_cache)));
printf_filtered (_(" Total memory used for macro cache: %d\n"), printf_filtered (_(" Total memory used for macro cache: %d\n"),
bcache_memory_used (objfile->macro_cache)); bcache_memory_used (objfile->macro_cache));
printf_filtered (_(" Total memory used for file name cache: %d\n"), printf_filtered (_(" Total memory used for file name cache: %d\n"),