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:
parent
6438229074
commit
710e1a31c4
7 changed files with 92 additions and 16 deletions
|
@ -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:
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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. */
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 *);
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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"),
|
||||||
|
|
Loading…
Reference in a new issue