diff options
author | Nick Clifton <nickc@redhat.com> | 2005-04-12 08:42:41 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2005-04-12 08:42:41 +0000 |
commit | 4bdd3565f140b0555071cea0d917a6e1e1e16d23 (patch) | |
tree | 3a11fa3961a9b46622ee2e5ad1dd2ddec7cc0427 /gas/hash.c | |
parent | f394e3dd2e2f699104a24e7ba2a486d2f2b79807 (diff) | |
download | gdb-4bdd3565f140b0555071cea0d917a6e1e1e16d23.zip gdb-4bdd3565f140b0555071cea0d917a6e1e1e16d23.tar.gz gdb-4bdd3565f140b0555071cea0d917a6e1e1e16d23.tar.bz2 |
* hash.c (DEFAULT_SIZE): Delete. Replace with:
(gas_hash_table_size): New static variable.
(set_gas_hash_table_size): New function: Records a requested size for the hash tables.
(get_gas_hash_table_size): New function: Return a prime number near the requested size of the hash table.
(hash_new): Use get_gas_hash_table_size.
* hash.h: Add a prototype for set_gas_hash_table_size.
* as.c (show_usage): Add description of new switches: --hash-size and --reduce-memory-overheads.
(option_values): Add OPTION_HASH_TABLE_SIZE and OPTION_REDUCE_MEMORY_OVERHEADS.
(std_longpopts): Add entries for the new options.
(parse_args): Handle the new options.
* Makefile.am: Add a dependency of as.c on hash.h.
* Makefile.in: Regenerate.
* doc/as.texinfo: Document the new switches.
* NEWS: Mention the new switches.
Diffstat (limited to 'gas/hash.c')
-rw-r--r-- | gas/hash.c | 46 |
1 files changed, 38 insertions, 8 deletions
@@ -1,6 +1,6 @@ /* hash.c -- gas hash table code Copyright 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, - 2000, 2001, 2002, 2003 + 2000, 2001, 2002, 2003, 2005 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -33,10 +33,6 @@ #include "safe-ctype.h" #include "obstack.h" -/* The default number of entries to use when creating a hash table. */ - -#define DEFAULT_SIZE (4051) - /* An entry in a hash table. */ struct hash_entry { @@ -72,6 +68,40 @@ struct hash_control { #endif /* HASH_STATISTICS */ }; +/* The default number of entries to use when creating a hash table. + Note this value can be reduced to 4051 by using the command line + switch --reduce-memory-overheads, or set to other values by using + the --hash-size=<NUMBER> switch. */ + +static unsigned int gas_hash_table_size = 65537; + +void +set_gas_hash_table_size (unsigned int size) +{ + gas_hash_table_size = size; +} + +/* FIXME: This function should be amalgmated with bfd/hash.c:bfd_hash_set_default_size(). */ +static unsigned int +get_gas_hash_table_size (void) +{ + /* Extend this prime list if you want more granularity of hash table size. */ + static const unsigned int 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]; +} + /* Create a hash table. This return a control block. */ struct hash_control * @@ -81,12 +111,12 @@ hash_new (void) struct hash_control *ret; unsigned int alloc; - size = DEFAULT_SIZE; + size = get_gas_hash_table_size (); - ret = (struct hash_control *) xmalloc (sizeof *ret); + ret = xmalloc (sizeof *ret); obstack_begin (&ret->memory, chunksize); alloc = size * sizeof (struct hash_entry *); - ret->table = (struct hash_entry **) obstack_alloc (&ret->memory, alloc); + ret->table = obstack_alloc (&ret->memory, alloc); memset (ret->table, 0, alloc); ret->size = size; |