From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 28379 invoked by alias); 19 Aug 2010 16:33:40 -0000 Received: (qmail 27950 invoked by uid 22791); 19 Aug 2010 16:33:36 -0000 X-SWARE-Spam-Status: No, hits=-5.3 required=5.0 tests=AWL,BAYES_00,KAM_STOCKGEN,RCVD_IN_DNSWL_HI,SPF_HELO_PASS,TW_BJ,TW_XZ,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 19 Aug 2010 16:33:25 +0000 Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o7JGXNrC026220 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 19 Aug 2010 12:33:23 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o7JGXN6g025310 for ; Thu, 19 Aug 2010 12:33:23 -0400 Received: from [10.15.16.129] (dhcp-10-15-16-129.yyz.redhat.com [10.15.16.129]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id o7JGXM9f012518 for ; Thu, 19 Aug 2010 12:33:22 -0400 Message-ID: <4C6D5CC2.8060403@redhat.com> Date: Thu, 19 Aug 2010 16:33:00 -0000 From: sami wagiaalla User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.7) Gecko/20100720 Fedora/3.1.1-1.fc13 Thunderbird/3.1.1 MIME-Version: 1.0 To: gdb-patches@sourceware.org Subject: Re: [RFC] Use custom hash function with bcache References: <4C6946E1.6000709@redhat.com> <4C6BF870.7010203@redhat.com> In-Reply-To: Content-Type: multipart/mixed; boundary="------------010606030704070609080604" X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2010-08/txt/msg00342.txt.bz2 This is a multi-part message in MIME format. --------------010606030704070609080604 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-length: 298 On 08/18/2010 11:24 AM, Tom Tromey wrote: >>>>>> "Sami" == sami wagiaalla 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. --------------010606030704070609080604 Content-Type: text/x-patch; name="custom_hash_2.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="custom_hash_2.patch" Content-length: 7957 Create and use a specialized bcache type for psymbols 2010-08-19 Sami Wagiaalla * 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"), --------------010606030704070609080604--