Index: gas/Makefile.am =================================================================== RCS file: /cvs/src/src/gas/Makefile.am,v retrieving revision 1.104 diff -c -3 -p -r1.104 Makefile.am *** gas/Makefile.am 21 Mar 2005 15:35:30 -0000 1.104 --- gas/Makefile.am 6 Apr 2005 11:06:00 -0000 *************** BMKDEP = #DO NOT PUT ANYTHING BETWEEN TH *** 2436,2442 **** #MKDEP DO NOT PUT ANYTHING BETWEEN THIS LINE AND THE MATCHING WARNING BELOW. app.o: app.c $(INCDIR)/symcat.h as.o: as.c $(INCDIR)/symcat.h subsegs.h $(INCDIR)/obstack.h \ ! output-file.h sb.h macro.h dwarf2dbg.h dw2gencfi.h \ $(INCDIR)/elf/dwarf2.h $(BFDVER_H) atof-generic.o: atof-generic.c $(INCDIR)/symcat.h $(INCDIR)/safe-ctype.h bignum-copy.o: bignum-copy.c $(INCDIR)/symcat.h --- 2436,2442 ---- #MKDEP DO NOT PUT ANYTHING BETWEEN THIS LINE AND THE MATCHING WARNING BELOW. app.o: app.c $(INCDIR)/symcat.h as.o: as.c $(INCDIR)/symcat.h subsegs.h $(INCDIR)/obstack.h \ ! output-file.h sb.h macro.h dwarf2dbg.h dw2gencfi.h hash.h \ $(INCDIR)/elf/dwarf2.h $(BFDVER_H) atof-generic.o: atof-generic.c $(INCDIR)/symcat.h $(INCDIR)/safe-ctype.h bignum-copy.o: bignum-copy.c $(INCDIR)/symcat.h Index: gas/NEWS =================================================================== RCS file: /cvs/src/src/gas/NEWS,v retrieving revision 1.74 diff -c -3 -p -r1.74 NEWS *** gas/NEWS 1 Apr 2005 14:17:16 -0000 1.74 --- gas/NEWS 6 Apr 2005 11:06:01 -0000 *************** *** 1,5 **** --- 1,9 ---- -*- text -*- + * Added --reduce-memory-overheads switch to reduce the size of the hash + tables used, at the expense of longer assembly times, and + --hash-size= to set the size of the hash tables used by gas. + * Support the .f_floating, .d_floating, .g_floating and .h_floating directives for the VAX target in order to be more compatible with the VAX MACRO assembler. Index: gas/as.c =================================================================== RCS file: /cvs/src/src/gas/as.c,v retrieving revision 1.58 diff -c -3 -p -r1.58 as.c *** gas/as.c 3 Mar 2005 01:29:52 -0000 1.58 --- gas/as.c 6 Apr 2005 11:06:02 -0000 *************** *** 42,47 **** --- 42,48 ---- #include "macro.h" #include "dwarf2dbg.h" #include "dw2gencfi.h" + #include "hash.h" #ifdef BFD_ASSEMBLER #include "bfdver.h" *************** Options:\n\ *** 292,297 **** --- 293,300 ---- fprintf (stream, _("\ --gdwarf-2 generate DWARF2 debugging information\n")); fprintf (stream, _("\ + --hash-size= set the hash table size close to \n")); + fprintf (stream, _("\ --help show this message and exit\n")); fprintf (stream, _("\ --target-help show target specific options\n")); *************** Options:\n\ *** 314,319 **** --- 317,326 ---- fprintf (stream, _("\ -R fold data section into text section\n")); fprintf (stream, _("\ + --reduce-memory-overheads \n\ + prefer smaller memory use at the cost of longer\n\ + assembly times\n")); + fprintf (stream, _("\ --statistics print various measured statistics from execution\n")); fprintf (stream, _("\ --strip-local-absolute strip local absolute symbols\n")); *************** parse_args (int * pargc, char *** pargv) *** 426,431 **** --- 433,440 ---- OPTION_EXECSTACK, OPTION_NOEXECSTACK, OPTION_ALTERNATE, + OPTION_HASH_TABLE_SIZE, + OPTION_REDUCE_MEMORY_OVERHEADS, OPTION_WARN_FATAL /* When you add options here, check that they do not collide with OPTION_MD_BASE. See as.h. */ *************** parse_args (int * pargc, char *** pargv) *** 457,462 **** --- 466,472 ---- ,{"gen-debug", no_argument, NULL, 'g'} ,{"gstabs", no_argument, NULL, OPTION_GSTABS} ,{"gstabs+", no_argument, NULL, OPTION_GSTABS_PLUS} + ,{"hash-size", required_argument, NULL, OPTION_HASH_TABLE_SIZE} ,{"help", no_argument, NULL, OPTION_HELP} /* New option for extending instruction set (see also -t above). The "-t file" or "--itbl file" option extends the basic set of *************** parse_args (int * pargc, char *** pargv) *** 478,483 **** --- 488,494 ---- ,{"mri", no_argument, NULL, 'M'} ,{"nocpp", no_argument, NULL, OPTION_NOCPP} ,{"no-warn", no_argument, NULL, 'W'} + ,{"reduce-memory-overheads", no_argument, NULL, OPTION_REDUCE_MEMORY_OVERHEADS} ,{"statistics", no_argument, NULL, OPTION_STATISTICS} ,{"strip-local-absolute", no_argument, NULL, OPTION_STRIP_LOCAL_ABSOLUTE} ,{"version", no_argument, NULL, OPTION_VERSION} *************** the GNU General Public License. This pr *** 865,870 **** --- 876,899 ---- case 'X': /* -X means treat warnings as errors. */ break; + + case OPTION_REDUCE_MEMORY_OVERHEADS: + /* The only change we make at the moment is to reduce + the size of the hash tables that we use. */ + set_gas_hash_table_size (4051); + break; + + case OPTION_HASH_TABLE_SIZE: + { + bfd_size_type new_size; + + new_size = strtoul (optarg, NULL, 0); + if (new_size) + set_gas_hash_table_size (new_size); + else + as_fatal (_("--hash-size needs a numeric argument")); + break; + } } } Index: gas/hash.c =================================================================== RCS file: /cvs/src/src/gas/hash.c,v retrieving revision 1.13 diff -c -3 -p -r1.13 hash.c *** gas/hash.c 3 Mar 2005 01:29:53 -0000 1.13 --- gas/hash.c 6 Apr 2005 11:06:02 -0000 *************** *************** *** 33,42 **** #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 { --- 33,38 ---- *************** struct hash_control { *** 72,77 **** --- 68,107 ---- #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= 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 * *************** hash_new (void) *** 81,92 **** struct hash_control *ret; unsigned int alloc; ! size = DEFAULT_SIZE; ! ret = (struct hash_control *) xmalloc (sizeof *ret); obstack_begin (&ret->memory, chunksize); alloc = size * sizeof (struct hash_entry *); ! ret->table = (struct hash_entry **) obstack_alloc (&ret->memory, alloc); memset (ret->table, 0, alloc); ret->size = size; --- 111,122 ---- struct hash_control *ret; unsigned int alloc; ! size = get_gas_hash_table_size (); ! ret = xmalloc (sizeof *ret); obstack_begin (&ret->memory, chunksize); alloc = size * sizeof (struct hash_entry *); ! ret->table = obstack_alloc (&ret->memory, alloc); memset (ret->table, 0, alloc); ret->size = size; Index: gas/hash.h =================================================================== RCS file: /cvs/src/src/gas/hash.h,v retrieving revision 1.6 diff -c -3 -p -r1.6 hash.h *** gas/hash.h 3 Mar 2005 01:29:53 -0000 1.6 --- gas/hash.h 6 Apr 2005 11:06:02 -0000 *************** *** 24,29 **** --- 24,33 ---- struct hash_control; + /* Set the size of the hash table used. */ + + void set_gas_hash_table_size (unsigned int); + /* Create a hash table. This return a control block. */ extern struct hash_control *hash_new (void); Index: gas/doc/as.texinfo =================================================================== RCS file: /cvs/src/src/gas/doc/as.texinfo,v retrieving revision 1.118 diff -c -3 -p -r1.118 as.texinfo *** gas/doc/as.texinfo 28 Mar 2005 22:34:17 -0000 1.118 --- gas/doc/as.texinfo 6 Apr 2005 11:06:04 -0000 *************** gcc(1), ld(1), and the Info entries for *** 227,240 **** @smallexample @c man begin SYNOPSIS @value{AS} [@b{-a}[@b{cdhlns}][=@var{file}]] [@b{--alternate}] [@b{-D}] ! [@b{--defsym} @var{sym}=@var{val}] [@b{-f}] [@b{-g}] [@b{--gstabs}] [@b{--gstabs+}] ! [@b{--gdwarf-2}] [@b{--help}] [@b{-I} @var{dir}] [@b{-J}] [@b{-K}] [@b{-L}] ! [@b{--listing-lhs-width}=@var{NUM}] [@b{--listing-lhs-width2}=@var{NUM}] ! [@b{--listing-rhs-width}=@var{NUM}] [@b{--listing-cont-lines}=@var{NUM}] ! [@b{--keep-locals}] [@b{-o} @var{objfile}] [@b{-R}] [@b{--statistics}] [@b{-v}] ! [@b{-version}] [@b{--version}] [@b{-W}] [@b{--warn}] [@b{--fatal-warnings}] ! [@b{-w}] [@b{-x}] [@b{-Z}] [@b{--target-help}] [@var{target-options}] ! [@b{--}|@var{files} @dots{}] @c @c Target dependent options are listed below. Keep the list sorted. @c Add an empty line for separation. --- 227,241 ---- @smallexample @c man begin SYNOPSIS @value{AS} [@b{-a}[@b{cdhlns}][=@var{file}]] [@b{--alternate}] [@b{-D}] ! [@b{--defsym} @var{sym}=@var{val}] [@b{-f}] [@b{-g}] [@b{--gstabs}] ! [@b{--gstabs+}] [@b{--gdwarf-2}] [@b{--help}] [@b{-I} @var{dir}] [@b{-J}] ! [@b{-K}] [@b{-L}] [@b{--listing-lhs-width}=@var{NUM}] ! [@b{--listing-lhs-width2}=@var{NUM}] [@b{--listing-rhs-width}=@var{NUM}] ! [@b{--listing-cont-lines}=@var{NUM}] [@b{--keep-locals}] [@b{-o} ! @var{objfile}] [@b{-R}] [@b{--reduce-memory-overheads}] [@b{--statistics}] ! [@b{-v}] [@b{-version}] [@b{--version}] [@b{-W}] [@b{--warn}] ! [@b{--fatal-warnings}] [@b{-w}] [@b{-x}] [@b{-Z}] [@b{--target-help}] ! [@var{target-options}] [@b{--}|@var{files} @dots{}] @c @c Target dependent options are listed below. Keep the list sorted. @c Add an empty line for separation. *************** Name the object-file output from @comman *** 554,559 **** --- 555,572 ---- @item -R Fold the data section into the text section. + @kindex --hash-size=@var{number} + Set the default size of GAS's hash tables to a prime number close to + @var{number}. Increasing this value can reduce the length of time it takes the + assembler to perform its tasks, at the expense of increasing the assembler's + memory requirements. Similarly reducing this value can reduce the memory + requirements at the expense of speed. + + @item --reduce-memory-overheads + This option reduces GAS's memory requirements, at the expense of making the + assembly processes slower. Currently this switch is a synonym for + @samp{--hash-size=4051}, but in the future it may have other effects as well. + @item --statistics Print the maximum space (in bytes) and total time (in seconds) used by assembly.