X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gas%2Fhash.c;h=cfffede7e2e909648894c2aacafa28318b32b93b;hb=4bdb25fe6902963ca9cf91d6b2688cf888527bf8;hp=06fadcbf4d762487c9e5c6ca0fd12776c2fec380;hpb=78aff5a5271ab14960fec98805bd1c295cab6d8d;p=deliverable%2Fbinutils-gdb.git diff --git a/gas/hash.c b/gas/hash.c index 06fadcbf4d..cfffede7e2 100644 --- a/gas/hash.c +++ b/gas/hash.c @@ -1,7 +1,5 @@ /* hash.c -- gas hash table code - Copyright 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, - 2000, 2001, 2002, 2003, 2005, 2007, 2008 - Free Software Foundation, Inc. + Copyright (C) 1987-2019 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -78,45 +76,21 @@ static unsigned long gas_hash_table_size = 65537; void set_gas_hash_table_size (unsigned long size) { - gas_hash_table_size = size; -} - -/* FIXME: This function should be amalgmated with bfd/hash.c:bfd_hash_set_default_size(). */ -static unsigned long -get_gas_hash_table_size (void) -{ - /* Extend this prime list if you want more granularity of hash table size. */ - static const unsigned long hash_size_primes[] = - { - 1021, 4051, 8599, 16699, 65537 - }; - unsigned int index; - - /* Work out the best prime number near the hash_size. - FIXME: This could be a more sophisticated algorithm, - but is it really worth implementing it ? */ - for (index = 0; index < ARRAY_SIZE (hash_size_primes) - 1; ++index) - if (gas_hash_table_size <= hash_size_primes[index]) - break; - - return hash_size_primes[index]; + gas_hash_table_size = bfd_hash_set_default_size (size); } /* Create a hash table. This return a control block. */ struct hash_control * -hash_new (void) +hash_new_sized (unsigned long size) { - unsigned long size; unsigned long alloc; struct hash_control *ret; - size = get_gas_hash_table_size (); - - ret = xmalloc (sizeof *ret); + ret = XNEW (struct hash_control); obstack_begin (&ret->memory, chunksize); alloc = size * sizeof (struct hash_entry *); - ret->table = obstack_alloc (&ret->memory, alloc); + ret->table = (struct hash_entry **) obstack_alloc (&ret->memory, alloc); memset (ret->table, 0, alloc); ret->size = size; @@ -132,6 +106,12 @@ hash_new (void) return ret; } +struct hash_control * +hash_new (void) +{ + return hash_new_sized (gas_hash_table_size); +} + /* Delete a hash table, freeing all allocated memory. */ void @@ -157,7 +137,7 @@ hash_lookup (struct hash_control *table, const char *key, size_t len, unsigned long hash; size_t n; unsigned int c; - unsigned int index; + unsigned int hindex; struct hash_entry **list; struct hash_entry *p; struct hash_entry *prev; @@ -179,8 +159,8 @@ hash_lookup (struct hash_control *table, const char *key, size_t len, if (phash != NULL) *phash = hash; - index = hash % table->size; - list = table->table + index; + hindex = hash % table->size; + list = table->table + hindex; if (plist != NULL) *plist = list; @@ -223,7 +203,7 @@ hash_lookup (struct hash_control *table, const char *key, size_t len, hash table. */ const char * -hash_insert (struct hash_control *table, const char *key, void *value) +hash_insert (struct hash_control *table, const char *key, void *val) { struct hash_entry *p; struct hash_entry **list; @@ -237,10 +217,10 @@ hash_insert (struct hash_control *table, const char *key, void *value) ++table->insertions; #endif - p = obstack_alloc (&table->memory, sizeof (*p)); + p = (struct hash_entry *) obstack_alloc (&table->memory, sizeof (*p)); p->string = key; p->hash = hash; - p->data = value; + p->data = val; p->next = *list; *list = p; @@ -253,7 +233,7 @@ hash_insert (struct hash_control *table, const char *key, void *value) error. If an entry already exists, its value is replaced. */ const char * -hash_jam (struct hash_control *table, const char *key, void *value) +hash_jam (struct hash_control *table, const char *key, void *val) { struct hash_entry *p; struct hash_entry **list; @@ -266,7 +246,7 @@ hash_jam (struct hash_control *table, const char *key, void *value) ++table->replacements; #endif - p->data = value; + p->data = val; } else { @@ -274,10 +254,10 @@ hash_jam (struct hash_control *table, const char *key, void *value) ++table->insertions; #endif - p = obstack_alloc (&table->memory, sizeof (*p)); + p = (struct hash_entry *) obstack_alloc (&table->memory, sizeof (*p)); p->string = key; p->hash = hash; - p->data = value; + p->data = val; p->next = *list; *list = p;