diff options
-rw-r--r-- | gcc/ChangeLog | 16 | ||||
-rw-r--r-- | gcc/hashtable.c | 53 | ||||
-rw-r--r-- | gcc/hashtable.h | 2 | ||||
-rw-r--r-- | gcc/stringpool.c | 4 | ||||
-rw-r--r-- | gcc/tree.h | 10 |
5 files changed, 63 insertions, 22 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9f093e2b86f..6a85d4d3036 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,19 @@ +2003-08-08 Roger Sayle <roger@eyesopen.com> + + * 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. + 2003-08-08 Bernardo Innocenti <bernie@develer.com> PR target/9697 diff --git a/gcc/hashtable.c b/gcc/hashtable.c index 5254882379d..ea7d2b07577 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); diff --git a/gcc/hashtable.h b/gcc/hashtable.h index dd7c0b142d7..8efbf5c50e2 100644 --- a/gcc/hashtable.h +++ b/gcc/hashtable.h @@ -67,7 +67,7 @@ extern hash_table *ht_create (unsigned int order); extern void ht_destroy (hash_table *); extern hashnode ht_lookup (hash_table *, const unsigned char *, - unsigned int, enum ht_lookup_option); + size_t, enum ht_lookup_option); /* For all nodes in TABLE, make a callback. The callback takes TABLE->PFILE, the node, and a PTR, and the callback sequence stops diff --git a/gcc/stringpool.c b/gcc/stringpool.c index 01e54ac8270..0cf3be14f88 100644 --- a/gcc/stringpool.c +++ b/gcc/stringpool.c @@ -95,6 +95,8 @@ ggc_alloc_string (const char *contents, int length) If an identifier with that name has previously been referred to, the same node is returned this time. */ +#undef get_identifier + tree get_identifier (const char *text) { @@ -110,7 +112,7 @@ get_identifier (const char *text) known. */ tree -get_identifier_with_length (const char *text, unsigned int length) +get_identifier_with_length (const char *text, size_t length) { hashnode ht_node = ht_lookup (ident_hash, (const unsigned char *) text, diff --git a/gcc/tree.h b/gcc/tree.h index cac3efc1e9b..69e75e1af36 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -2050,10 +2050,18 @@ extern tree make_tree_vec (int); extern tree get_identifier (const char *); +#if GCC_VERSION >= 3000 +#define get_identifier(str) \ + (__builtin_constant_p (str) \ + ? get_identifier_with_length ((str), strlen (str)) \ + : get_identifier (str)) +#endif + + /* Identical to get_identifier, except that the length is assumed known. */ -extern tree get_identifier_with_length (const char *, unsigned int); +extern tree get_identifier_with_length (const char *, size_t); /* If an identifier with the name TEXT (a null-terminated string) has previously been referred to, return that node; otherwise return |