diff options
author | Roger Sayle <roger@eyesopen.com> | 2003-08-08 20:23:06 +0000 |
---|---|---|
committer | Roger Sayle <sayle@gcc.gnu.org> | 2003-08-08 20:23:06 +0000 |
commit | 7bb3fbbb4dd015ad83f96871e15124f896761284 (patch) | |
tree | dc8f4bbb708356e7d8cc6e1931e9f1b46e3866b1 /gcc/hashtable.c | |
parent | 32247ce9e4968e0a7d48efd79b1853f77ad2e598 (diff) | |
download | gcc-7bb3fbbb4dd015ad83f96871e15124f896761284.zip gcc-7bb3fbbb4dd015ad83f96871e15124f896761284.tar.gz gcc-7bb3fbbb4dd015ad83f96871e15124f896761284.tar.bz2 |
* tree.h (get_identifier) Define a macro form of get_identifier
that calls get_identifier_with_length when the string is constant.
(get_identifier_with_length): Change type of second argument to
size_t in prototype.
* stringpool.c (get_identifier): Undefine the macro before giving
the function definition.
(get_identifier_with_length): Change type of second argument to
size_t in function definition.
* hashtable.c (calc_hash): Change type of second argument to size_t.
(ht_lookup): Change type of third argument to size_t. Reorganize
to speed-up the cases where the hash table slot is empty, or the
first probe matches (i.e. there isn't a collision).
* hashtable.h (ht_lookup): Adjust function prototype.
From-SVN: r70256
Diffstat (limited to 'gcc/hashtable.c')
-rw-r--r-- | gcc/hashtable.c | 53 |
1 files changed, 34 insertions, 19 deletions
diff --git a/gcc/hashtable.c b/gcc/hashtable.c index 5254882..ea7d2b0 100644 --- a/gcc/hashtable.c +++ b/gcc/hashtable.c @@ -30,16 +30,16 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. existing entry with a potential new one. Also, the ability to delete members from the table has been removed. */ -static unsigned int calc_hash (const unsigned char *, unsigned int); +static unsigned int calc_hash (const unsigned char *, size_t); static void ht_expand (hash_table *); static double approx_sqrt (double); /* Calculate the hash of the string STR of length LEN. */ static unsigned int -calc_hash (const unsigned char *str, unsigned int len) +calc_hash (const unsigned char *str, size_t len) { - unsigned int n = len; + size_t n = len; unsigned int r = 0; #define HASHSTEP(r, c) ((r) * 67 + ((c) - 113)); @@ -92,7 +92,7 @@ ht_destroy (hash_table *table) CPP_ALLOCED and the item is assumed to be at the top of the obstack. */ hashnode -ht_lookup (hash_table *table, const unsigned char *str, unsigned int len, +ht_lookup (hash_table *table, const unsigned char *str, size_t len, enum ht_lookup_option insert) { unsigned int hash = calc_hash (str, len); @@ -103,21 +103,15 @@ ht_lookup (hash_table *table, const unsigned char *str, unsigned int len, sizemask = table->nslots - 1; index = hash & sizemask; - - /* hash2 must be odd, so we're guaranteed to visit every possible - location in the table during rehashing. */ - hash2 = ((hash * 17) & sizemask) | 1; table->searches++; - for (;;) + node = table->entries[index]; + + if (node != NULL) { - node = table->entries[index]; - - if (node == NULL) - break; - - if (node->hash_value == hash && HT_LEN (node) == len - && !memcmp (HT_STR (node), str, len)) + if (node->hash_value == hash + && HT_LEN (node) == (unsigned int) len + && !memcmp (HT_STR (node), str, len)) { if (insert == HT_ALLOCED) /* The string we search for was placed at the end of the @@ -126,8 +120,29 @@ ht_lookup (hash_table *table, const unsigned char *str, unsigned int len, return node; } - index = (index + hash2) & sizemask; - table->collisions++; + /* hash2 must be odd, so we're guaranteed to visit every possible + location in the table during rehashing. */ + hash2 = ((hash * 17) & sizemask) | 1; + + for (;;) + { + table->collisions++; + index = (index + hash2) & sizemask; + node = table->entries[index]; + if (node == NULL) + break; + + if (node->hash_value == hash + && HT_LEN (node) == (unsigned int) len + && !memcmp (HT_STR (node), str, len)) + { + if (insert == HT_ALLOCED) + /* The string we search for was placed at the end of the + obstack. Release it. */ + obstack_free (&table->stack, (void *) str); + return node; + } + } } if (insert == HT_NO_INSERT) @@ -136,7 +151,7 @@ ht_lookup (hash_table *table, const unsigned char *str, unsigned int len, node = (*table->alloc_node) (table); table->entries[index] = node; - HT_LEN (node) = len; + HT_LEN (node) = (unsigned int) len; node->hash_value = hash; if (insert == HT_ALLOC) HT_STR (node) = obstack_copy0 (&table->stack, str, len); |