Simplify the psymbol hash function
authorTom Tromey <tom@tromey.com>
Thu, 2 Nov 2017 18:48:44 +0000 (12:48 -0600)
committerTom Tromey <tom@tromey.com>
Thu, 9 Nov 2017 15:31:40 +0000 (08:31 -0700)
This patch simplifies the psymbol_hash function, by changing it not to
examine the contents of the symbol's name.  This change just mirrors
what psymbol_compare already does -- it is checking for name equality,
which is ok because symbol names are interned in symbol_set_names.

This change speeds up psymbol reading.  "gdb -nx -batch gdb"
previously took ~1.8 seconds on my machine, and with this patch it now
takes ~1.7 seconds.

gdb/ChangeLog
2017-11-09  Tom Tromey  <tom@tromey.com>

* psymtab.c (psymbol_hash): Do not hash string contents.
(psymbol_compare): Add comment.

gdb/ChangeLog
gdb/psymtab.c

index f3c77cd28d7bb6f379c2c84c58aba584b068d071..22434aa34340f7b77c38a37e1ca3e6182e00ce11 100644 (file)
@@ -1,3 +1,8 @@
+2017-11-09  Tom Tromey  <tom@tromey.com>
+
+       * psymtab.c (psymbol_hash): Do not hash string contents.
+       (psymbol_compare): Add comment.
+
 2017-11-09  Tom Tromey  <tom@tromey.com>
 
        * dictionary.c (dict_hash): Move "TKB" check into the "switch".
index 29d40dcc04c4f0904ad1994093f32dfe5ac84277..06a65bf26ea780a7107b0fd7ded32568218af1c1 100644 (file)
@@ -1548,7 +1548,9 @@ psymbol_hash (const void *addr, int length)
   h = hash_continue (&lang, sizeof (unsigned int), h);
   h = hash_continue (&domain, sizeof (unsigned int), h);
   h = hash_continue (&theclass, sizeof (unsigned int), h);
-  h = hash_continue (psymbol->ginfo.name, strlen (psymbol->ginfo.name), h);
+  /* Note that psymbol names are interned via symbol_set_names, so
+     there's no need to hash the contents of the name here.  */
+  h = hash_continue (&psymbol->ginfo.name, sizeof (psymbol->ginfo.name), h);
 
   return h;
 }
@@ -1568,6 +1570,9 @@ psymbol_compare (const void *addr1, const void *addr2, int length)
          && sym1->ginfo.language == sym2->ginfo.language
           && PSYMBOL_DOMAIN (sym1) == PSYMBOL_DOMAIN (sym2)
           && PSYMBOL_CLASS (sym1) == PSYMBOL_CLASS (sym2)
+         /* Note that psymbol names are interned via
+            symbol_set_names, so there's no need to compare the
+            contents of the name here.  */
           && sym1->ginfo.name == sym2->ginfo.name);
 }