aboutsummaryrefslogtreecommitdiff
path: root/gdb/dictionary.c
diff options
context:
space:
mode:
authorPaul N. Hilfinger <hilfinger@adacore.com>2010-10-07 08:32:41 +0000
committerPaul N. Hilfinger <hilfinger@adacore.com>2010-10-07 08:32:41 +0000
commit1d2a4540a591685f1d4a126ea54b5b62478de1b5 (patch)
tree194b55b9db0c69f828c86acfda9f97b52efb6eda /gdb/dictionary.c
parent40658b9446ce0507f120bdc69c51c3dfbfd35381 (diff)
downloadgdb-1d2a4540a591685f1d4a126ea54b5b62478de1b5.zip
gdb-1d2a4540a591685f1d4a126ea54b5b62478de1b5.tar.gz
gdb-1d2a4540a591685f1d4a126ea54b5b62478de1b5.tar.bz2
Correct dict_hash to our most recent version.
Several changes to dict_hash from Adacore's local version were inadvertantly left out of the last change to that function. These changes conservatively cause dict_hash to revert to msymbol_hash_iw in more cases where the symbol being hashed is known not to be Ada-encoded. This avoids a few cases where the function hashes large groups of names with similar prefixes to the same value. Changelog: gdb/ * dictionary.c (dict_hash): Revert to msymbol_hash_iw in more cases.
Diffstat (limited to 'gdb/dictionary.c')
-rw-r--r--gdb/dictionary.c25
1 files changed, 17 insertions, 8 deletions
diff --git a/gdb/dictionary.c b/gdb/dictionary.c
index f3ac306..4f18e8c 100644
--- a/gdb/dictionary.c
+++ b/gdb/dictionary.c
@@ -786,7 +786,7 @@ expand_hashtable (struct dictionary *dict)
comparison operators hash to the same value. */
static unsigned int
-dict_hash (const char *string)
+dict_hash (const char *string0)
{
/* The Ada-encoded version of a name P1.P2...Pn has either the form
P1__P2__...Pn<suffix> or _ada_P1__P2__...Pn<suffix> (where the Pi
@@ -796,11 +796,18 @@ dict_hash (const char *string)
does this for a superset of both valid Pi and of <suffix>, but
in other cases it simply returns msymbol_hash_iw(STRING0). */
+ const char *string;
unsigned int hash;
int c;
- if (*string == '_' && strncmp (string, "_ada_", 5) == 0)
- string += 5;
+ string = string0;
+ if (*string == '_')
+ {
+ if (strncmp (string, "_ada_", 5) == 0)
+ string += 5;
+ else
+ return msymbol_hash_iw (string0);
+ }
hash = 0;
while (*string)
@@ -810,13 +817,15 @@ dict_hash (const char *string)
case '$':
case '.':
case 'X':
- case '(':
- return hash;
+ if (string0 == string)
+ return msymbol_hash_iw (string0);
+ else
+ return hash;
case ' ':
- string += 1;
- break;
+ case '(':
+ return msymbol_hash_iw (string0);
case '_':
- if (string[1] == '_')
+ if (string[1] == '_' && string != string0)
{
if (((c = string[2]) < 'a' || c > 'z') && c != 'O')
return hash;