/* hash.c -- gas hash table code
- Copyright 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999,
- 2000, 2001, 2002, 2003, 2005, 2007
- Free Software Foundation, Inc.
+ Copyright (C) 1987-2019 Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler.
table. */
unsigned long hash;
/* Pointer being stored in the hash table. */
- PTR data;
+ void *data;
};
/* A hash table. */
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;
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
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;
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;
hash table. */
const char *
-hash_insert (struct hash_control *table, const char *key, PTR value)
+hash_insert (struct hash_control *table, const char *key, void *val)
{
struct hash_entry *p;
struct hash_entry **list;
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;
error. If an entry already exists, its value is replaced. */
const char *
-hash_jam (struct hash_control *table, const char *key, PTR value)
+hash_jam (struct hash_control *table, const char *key, void *val)
{
struct hash_entry *p;
struct hash_entry **list;
++table->replacements;
#endif
- p->data = value;
+ p->data = val;
}
else
{
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;
value stored for the entry. If the entry is not found in the hash
table, this does nothing and returns NULL. */
-PTR
-hash_replace (struct hash_control *table, const char *key, PTR value)
+void *
+hash_replace (struct hash_control *table, const char *key, void *value)
{
struct hash_entry *p;
- PTR ret;
+ void *ret;
p = hash_lookup (table, key, strlen (key), NULL, NULL);
if (p == NULL)
/* Find an entry in a hash table, returning its value. Returns NULL
if the entry is not found. */
-PTR
+void *
hash_find (struct hash_control *table, const char *key)
{
struct hash_entry *p;
/* As hash_find, but KEY is of length LEN and is not guaranteed to be
NUL-terminated. */
-PTR
+void *
hash_find_n (struct hash_control *table, const char *key, size_t len)
{
struct hash_entry *p;
/* Delete an entry from a hash table. This returns the value stored
for that entry, or NULL if there is no such entry. */
-PTR
-hash_delete (struct hash_control *table, const char *key)
+void *
+hash_delete (struct hash_control *table, const char *key, int freeme)
{
struct hash_entry *p;
struct hash_entry **list;
*list = p->next;
- /* Note that we never reclaim the memory for this entry. If gas
- ever starts deleting hash table entries in a big way, this will
- have to change. */
+ if (freeme)
+ obstack_free (&table->memory, p);
return p->data;
}
void
hash_traverse (struct hash_control *table,
- void (*pfn) (const char *key, PTR value))
+ void (*pfn) (const char *key, void *value))
{
unsigned int i;