diff options
author | Sami Wagiaalla <swagiaal@redhat.com> | 2010-08-31 20:10:42 +0000 |
---|---|---|
committer | Sami Wagiaalla <swagiaal@redhat.com> | 2010-08-31 20:10:42 +0000 |
commit | 710e1a31c41cfebe0c425d54efa309bb7054cbc2 (patch) | |
tree | 3f8172cd66cd3b0d4183083db745b74a727d1f1f | |
parent | 6438229074032cc548209c05c42bd57873a72651 (diff) | |
download | gdb-710e1a31c41cfebe0c425d54efa309bb7054cbc2.zip gdb-710e1a31c41cfebe0c425d54efa309bb7054cbc2.tar.gz gdb-710e1a31c41cfebe0c425d54efa309bb7054cbc2.tar.bz2 |
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.
-rw-r--r-- | gdb/ChangeLog | 20 | ||||
-rw-r--r-- | gdb/objfiles.c | 4 | ||||
-rw-r--r-- | gdb/objfiles.h | 2 | ||||
-rw-r--r-- | gdb/psymtab.c | 59 | ||||
-rw-r--r-- | gdb/psymtab.h | 9 | ||||
-rw-r--r-- | gdb/symfile.c | 8 | ||||
-rw-r--r-- | gdb/symmisc.c | 6 |
7 files changed, 92 insertions, 16 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 89d6156..a64c8ce 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -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> PR c++/11961: diff --git a/gdb/objfiles.c b/gdb/objfiles.c index c55992e..7d5186f 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 2520046..a5d2f98 100644 --- a/gdb/psymtab.c +++ b/gdb/psymtab.c @@ -37,6 +37,11 @@ #define DEV_TTY "/dev/tty" #endif +struct psymbol_bcache +{ + struct bcache *bcache; +}; + /* A fast way to get from a psymtab to its symtab (after the first time). */ #define 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 add_psymbol_to_bcache. */ -unsigned long +static unsigned long psymbol_hash (const void *addr, int length) { unsigned long h = 0; @@ -1297,7 +1302,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 +1316,51 @@ 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 (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 it into objfile's bcache. Note that our caching mechanism will 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); /* 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..b104672 100644 --- a/gdb/psymtab.h +++ b/gdb/psymtab.h @@ -20,8 +20,13 @@ #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; + +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 *); 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..ef63216 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 (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"); } @@ -188,7 +189,8 @@ 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 (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"), |