aboutsummaryrefslogtreecommitdiff
path: root/gcc/hashtable.c
diff options
context:
space:
mode:
authorRoger Sayle <roger@eyesopen.com>2003-08-08 20:23:06 +0000
committerRoger Sayle <sayle@gcc.gnu.org>2003-08-08 20:23:06 +0000
commit7bb3fbbb4dd015ad83f96871e15124f896761284 (patch)
treedc8f4bbb708356e7d8cc6e1931e9f1b46e3866b1 /gcc/hashtable.c
parent32247ce9e4968e0a7d48efd79b1853f77ad2e598 (diff)
downloadgcc-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.c53
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);