merge from gcc

This commit is contained in:
DJ Delorie 2004-04-22 18:39:03 +00:00
parent fcf29e5f0e
commit bb6a587dd3
7 changed files with 437 additions and 132 deletions

View file

@ -1,3 +1,7 @@
2004-04-22 Richard Henderson <rth@redhat.com>
* hashtab.h (struct htab): Add size_prime_index.
2004-04-13 Jeff Law <law@redhat.com> 2004-04-13 Jeff Law <law@redhat.com>
* hashtab.h (htab_remove_elt_with_hash): Prototype new function. * hashtab.h (htab_remove_elt_with_hash): Prototype new function.

View file

@ -1,5 +1,5 @@
/* An expandable hash tables datatype. /* An expandable hash tables datatype.
Copyright (C) 1999, 2000, 2002, 2003 Free Software Foundation, Inc. Copyright (C) 1999, 2000, 2002, 2003, 2004 Free Software Foundation, Inc.
Contributed by Vladimir Makarov (vmakarov@cygnus.com). Contributed by Vladimir Makarov (vmakarov@cygnus.com).
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
@ -101,13 +101,13 @@ struct htab GTY(())
/* Table itself. */ /* Table itself. */
PTR * GTY ((use_param, length ("%h.size"))) entries; PTR * GTY ((use_param, length ("%h.size"))) entries;
/* Current size (in entries) of the hash table */ /* Current size (in entries) of the hash table. */
size_t size; size_t size;
/* Current number of elements including also deleted elements */ /* Current number of elements including also deleted elements. */
size_t n_elements; size_t n_elements;
/* Current number of deleted elements in the table */ /* Current number of deleted elements in the table. */
size_t n_deleted; size_t n_deleted;
/* The following member is used for debugging. Its value is number /* The following member is used for debugging. Its value is number
@ -126,6 +126,10 @@ struct htab GTY(())
PTR GTY((skip)) alloc_arg; PTR GTY((skip)) alloc_arg;
htab_alloc_with_arg alloc_with_arg_f; htab_alloc_with_arg alloc_with_arg_f;
htab_free_with_arg free_with_arg_f; htab_free_with_arg free_with_arg_f;
/* Current size (in entries) of the hash table, as an index into the
table of primes. */
unsigned int size_prime_index;
}; };
typedef struct htab *htab_t; typedef struct htab *htab_t;

View file

@ -1,3 +1,17 @@
2004-04-22 Richard Henderson <rth@redhat.com>
* hashtab.c: Include limits.h, stdint.h, ansidecl.h.
(CHAR_BIT): Provide default.
(struct prime_ent, prime_tab): New.
(higher_prime_index): Rename from higher_prime_number, return index.
(htab_mod_1): New.
(htab_mod, htab_mod_m2): Use it.
(htab_create_alloc, htab_create_alloc_ex): Store prime index.
(htab_expand): Likewise.
* configure.ac: Check for stdint.h.
(UNSIGNED_64BIT_TYPE): New define and checks to fill it in.
* config.in, configure: Rebuild.
2004-04-13 Ian Lance Taylor <ian@wasabisystems.com> 2004-04-13 Ian Lance Taylor <ian@wasabisystems.com>
* strerror.c: Include config.h, and redefine sys_nerr and * strerror.c: Include config.h, and redefine sys_nerr and

View file

@ -353,6 +353,9 @@
/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */ /* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
#undef TIME_WITH_SYS_TIME #undef TIME_WITH_SYS_TIME
/* Define to an unsigned 64-bit type available in the compiler. */
#undef UNSIGNED_64BIT_TYPE
/* whether byteorder is bigendian */ /* whether byteorder is bigendian */
#undef WORDS_BIGENDIAN #undef WORDS_BIGENDIAN

267
libiberty/configure vendored
View file

@ -957,7 +957,7 @@ esac
else else
echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
fi fi
cd $ac_popdir cd "$ac_popdir"
done done
fi fi
@ -1304,6 +1304,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
# This works around the fact that libtool configuration may change LD # This works around the fact that libtool configuration may change LD
# for this particular configuration, but some shells, instead of # for this particular configuration, but some shells, instead of
@ -2329,8 +2330,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5 cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && (exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag" { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5 (eval $ac_try) 2>&5
ac_status=$? ac_status=$?
@ -2388,8 +2388,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5 cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && (exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag" { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5 (eval $ac_try) 2>&5
ac_status=$? ac_status=$?
@ -2505,8 +2504,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5 cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && (exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag" { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5 (eval $ac_try) 2>&5
ac_status=$? ac_status=$?
@ -2560,8 +2558,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5 cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && (exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag" { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5 (eval $ac_try) 2>&5
ac_status=$? ac_status=$?
@ -2606,8 +2603,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5 cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && (exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag" { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5 (eval $ac_try) 2>&5
ac_status=$? ac_status=$?
@ -2651,8 +2647,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5 cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && (exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag" { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5 (eval $ac_try) 2>&5
ac_status=$? ac_status=$?
@ -3108,8 +3103,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5 cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && (exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag" { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5 (eval $ac_try) 2>&5
ac_status=$? ac_status=$?
@ -3169,8 +3163,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5 cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && (exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag" { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5 (eval $ac_try) 2>&5
ac_status=$? ac_status=$?
@ -3246,8 +3239,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5 cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && (exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag" { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5 (eval $ac_try) 2>&5
ac_status=$? ac_status=$?
@ -3288,8 +3280,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5 cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && (exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag" { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5 (eval $ac_try) 2>&5
ac_status=$? ac_status=$?
@ -3538,7 +3529,8 @@ host_makefile_frag=${frag}
for ac_header in sys/file.h sys/param.h limits.h stdlib.h malloc.h string.h unistd.h strings.h sys/time.h time.h sys/resource.h sys/stat.h sys/mman.h fcntl.h alloca.h sys/pstat.h sys/sysmp.h sys/sysinfo.h machine/hal_sysinfo.h sys/table.h sys/sysctl.h sys/systemcfg.h
for ac_header in sys/file.h sys/param.h limits.h stdlib.h malloc.h string.h unistd.h strings.h sys/time.h time.h sys/resource.h sys/stat.h sys/mman.h fcntl.h alloca.h sys/pstat.h sys/sysmp.h sys/sysinfo.h machine/hal_sysinfo.h sys/table.h sys/sysctl.h sys/systemcfg.h stdint.h
do do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
echo "$as_me:$LINENO: checking for $ac_header" >&5 echo "$as_me:$LINENO: checking for $ac_header" >&5
@ -3630,8 +3622,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5 cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && (exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag" { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5 (eval $ac_try) 2>&5
ac_status=$? ac_status=$?
@ -3695,8 +3686,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5 cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && (exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag" { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5 (eval $ac_try) 2>&5
ac_status=$? ac_status=$?
@ -3757,8 +3747,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5 cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && (exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag" { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5 (eval $ac_try) 2>&5
ac_status=$? ac_status=$?
@ -3838,8 +3827,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5 cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && (exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag" { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5 (eval $ac_try) 2>&5
ac_status=$? ac_status=$?
@ -4068,8 +4056,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5 cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && (exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag" { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5 (eval $ac_try) 2>&5
ac_status=$? ac_status=$?
@ -4102,6 +4089,167 @@ _ACEOF
fi fi
# Look for a 64-bit type.
echo "$as_me:$LINENO: checking for a 64-bit type" >&5
echo $ECHO_N "checking for a 64-bit type... $ECHO_C" >&6
if test "${liberty_cv_uint64+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#ifdef HAVE_STDINT_H
#include <stdint.h>
#endif
int
main ()
{
extern uint64_t foo;
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest.$ac_objext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
liberty_cv_uint64=uint64_t
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#ifdef HAVE_LIMITS_H
#include <limits.h>
#endif
#ifndef CHAR_BIT
#define CHAR_BIT 8
#endif
int
main ()
{
extern char foo[sizeof(long) * CHAR_BIT >= 64 ? 1 : -1];
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest.$ac_objext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
liberty_cv_uint64="unsigned long"
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#ifdef HAVE_LIMITS_H
#include <limits.h>
#endif
#ifndef CHAR_BIT
#define CHAR_BIT 8
#endif
int
main ()
{
extern char foo[sizeof(long long) * CHAR_BIT >= 64 ? 1 : -1];
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; } &&
{ ac_try='test -s conftest.$ac_objext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
liberty_cv_uint64="unsigned long long"
else
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
liberty_cv_uint64=none
fi
rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
fi
echo "$as_me:$LINENO: result: $liberty_cv_uint64" >&5
echo "${ECHO_T}$liberty_cv_uint64" >&6
if test "$liberty_cv_uint64" != none; then
cat >>confdefs.h <<\_ACEOF
#define HAVE_64BIT_TYPE $liberty_cv_uint64
_ACEOF
fi
# Given the above check, we always have uintptr_t or a fallback # Given the above check, we always have uintptr_t or a fallback
# definition. So define HAVE_UINTPTR_T in case any imported code # definition. So define HAVE_UINTPTR_T in case any imported code
# relies on it. # relies on it.
@ -4143,8 +4291,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5 cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && (exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag" { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5 (eval $ac_try) 2>&5
ac_status=$? ac_status=$?
@ -4377,8 +4524,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
cat conftest.err >&5 cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && (exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag" { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5 (eval $ac_try) 2>&5
ac_status=$? ac_status=$?
@ -4792,8 +4938,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
cat conftest.err >&5 cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && (exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag" { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5 (eval $ac_try) 2>&5
ac_status=$? ac_status=$?
@ -4852,8 +4997,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
cat conftest.err >&5 cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && (exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag" { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5 (eval $ac_try) 2>&5
ac_status=$? ac_status=$?
@ -4953,8 +5097,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
cat conftest.err >&5 cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && (exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag" { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5 (eval $ac_try) 2>&5
ac_status=$? ac_status=$?
@ -5092,8 +5235,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
cat conftest.err >&5 cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && (exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag" { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5 (eval $ac_try) 2>&5
ac_status=$? ac_status=$?
@ -5314,8 +5456,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
cat conftest.err >&5 cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && (exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag" { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5 (eval $ac_try) 2>&5
ac_status=$? ac_status=$?
@ -5660,8 +5801,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
cat conftest.err >&5 cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && (exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag" { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5 (eval $ac_try) 2>&5
ac_status=$? ac_status=$?
@ -5772,8 +5912,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
cat conftest.err >&5 cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && (exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag" { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5 (eval $ac_try) 2>&5
ac_status=$? ac_status=$?
@ -5842,8 +5981,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
cat conftest.err >&5 cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && (exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag" { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5 (eval $ac_try) 2>&5
ac_status=$? ac_status=$?
@ -5908,8 +6046,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5 cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && (exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag" { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5 (eval $ac_try) 2>&5
ac_status=$? ac_status=$?
@ -6005,8 +6142,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
cat conftest.err >&5 cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && (exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag" { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5 (eval $ac_try) 2>&5
ac_status=$? ac_status=$?
@ -6082,8 +6218,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5 cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && (exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag" { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5 (eval $ac_try) 2>&5
ac_status=$? ac_status=$?
@ -6256,8 +6391,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
cat conftest.err >&5 cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && (exit $ac_status); } &&
{ ac_try='test -z "$ac_c_werror_flag" { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
|| test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5 (eval $ac_try) 2>&5
ac_status=$? ac_status=$?
@ -6601,7 +6735,9 @@ LIBOBJS="$L"
# We need multilib support, but only if configuring for the target. # We need multilib support, but only if configuring for the target.
ac_config_files="$ac_config_files Makefile testsuite/Makefile" ac_config_files="$ac_config_files Makefile testsuite/Makefile"
ac_config_commands="$ac_config_commands default" ac_config_commands="$ac_config_commands default"
cat >confcache <<\_ACEOF cat >confcache <<\_ACEOF
# This file is a shell script that caches the results of configure # This file is a shell script that caches the results of configure
# tests run on this system so they can be shared between configure # tests run on this system so they can be shared between configure
@ -7444,11 +7580,6 @@ esac
*) ac_INSTALL=$ac_top_builddir$INSTALL ;; *) ac_INSTALL=$ac_top_builddir$INSTALL ;;
esac esac
if test x"$ac_file" != x-; then
{ echo "$as_me:$LINENO: creating $ac_file" >&5
echo "$as_me: creating $ac_file" >&6;}
rm -f "$ac_file"
fi
# Let's still pretend it is `configure' which instantiates (i.e., don't # Let's still pretend it is `configure' which instantiates (i.e., don't
# use $as_me), people would be surprised to read: # use $as_me), people would be surprised to read:
# /* config.h. Generated by config.status. */ # /* config.h. Generated by config.status. */
@ -7487,6 +7618,12 @@ echo "$as_me: error: cannot find input file: $f" >&2;}
fi;; fi;;
esac esac
done` || { (exit 1); exit 1; } done` || { (exit 1); exit 1; }
if test x"$ac_file" != x-; then
{ echo "$as_me:$LINENO: creating $ac_file" >&5
echo "$as_me: creating $ac_file" >&6;}
rm -f "$ac_file"
fi
_ACEOF _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF cat >>$CONFIG_STATUS <<_ACEOF
sed "$ac_vpsub sed "$ac_vpsub

View file

@ -159,13 +159,47 @@ AC_SUBST_FILE(host_makefile_frag)
# It's OK to check for header files. Although the compiler may not be # It's OK to check for header files. Although the compiler may not be
# able to link anything, it had better be able to at least compile # able to link anything, it had better be able to at least compile
# something. # something.
AC_CHECK_HEADERS(sys/file.h sys/param.h limits.h stdlib.h malloc.h string.h unistd.h strings.h sys/time.h time.h sys/resource.h sys/stat.h sys/mman.h fcntl.h alloca.h sys/pstat.h sys/sysmp.h sys/sysinfo.h machine/hal_sysinfo.h sys/table.h sys/sysctl.h sys/systemcfg.h) AC_CHECK_HEADERS(sys/file.h sys/param.h limits.h stdlib.h malloc.h string.h unistd.h strings.h sys/time.h time.h sys/resource.h sys/stat.h sys/mman.h fcntl.h alloca.h sys/pstat.h sys/sysmp.h sys/sysinfo.h machine/hal_sysinfo.h sys/table.h sys/sysctl.h sys/systemcfg.h stdint.h)
AC_HEADER_SYS_WAIT AC_HEADER_SYS_WAIT
AC_HEADER_TIME AC_HEADER_TIME
libiberty_AC_DECLARE_ERRNO libiberty_AC_DECLARE_ERRNO
AC_CHECK_TYPE(uintptr_t, unsigned long) AC_CHECK_TYPE(uintptr_t, unsigned long)
# Look for a 64-bit type.
AC_MSG_CHECKING([for a 64-bit type])
AC_CACHE_VAL(liberty_cv_uint64,
[AC_TRY_COMPILE(
[#ifdef HAVE_STDINT_H
#include <stdint.h>
#endif],
[extern uint64_t foo;],
liberty_cv_uint64=uint64_t,
[AC_TRY_COMPILE(
[#ifdef HAVE_LIMITS_H
#include <limits.h>
#endif
#ifndef CHAR_BIT
#define CHAR_BIT 8
#endif],
[extern char foo[sizeof(long) * CHAR_BIT >= 64 ? 1 : -1];],
liberty_cv_uint64="unsigned long",
[AC_TRY_COMPILE(
[#ifdef HAVE_LIMITS_H
#include <limits.h>
#endif
#ifndef CHAR_BIT
#define CHAR_BIT 8
#endif],
[extern char foo[sizeof(long long) * CHAR_BIT >= 64 ? 1 : -1];],
liberty_cv_uint64="unsigned long long", liberty_cv_uint64=none)])])])
AC_MSG_RESULT($liberty_cv_uint64)
if test "$liberty_cv_uint64" != none; then
AC_DEFINE(UNSIGNED_64BIT_TYPE, $liberty_cv_uint64,
[Define to an unsigned 64-bit type available in the compiler.])
fi
# Given the above check, we always have uintptr_t or a fallback # Given the above check, we always have uintptr_t or a fallback
# definition. So define HAVE_UINTPTR_T in case any imported code # definition. So define HAVE_UINTPTR_T in case any imported code
# relies on it. # relies on it.

View file

@ -1,5 +1,6 @@
/* An expandable hash tables datatype. /* An expandable hash tables datatype.
Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004
Free Software Foundation, Inc.
Contributed by Vladimir Makarov (vmakarov@cygnus.com). Contributed by Vladimir Makarov (vmakarov@cygnus.com).
This file is part of the libiberty library. This file is part of the libiberty library.
@ -40,20 +41,29 @@ Boston, MA 02111-1307, USA. */
#ifdef HAVE_STDLIB_H #ifdef HAVE_STDLIB_H
#include <stdlib.h> #include <stdlib.h>
#endif #endif
#ifdef HAVE_STRING_H #ifdef HAVE_STRING_H
#include <string.h> #include <string.h>
#endif #endif
#ifdef HAVE_MALLOC_H #ifdef HAVE_MALLOC_H
#include <malloc.h> #include <malloc.h>
#endif #endif
#ifdef HAVE_LIMITS_H
#include <limits.h>
#endif
#ifdef HAVE_STDINT_H
#include <stdint.h>
#endif
#include <stdio.h> #include <stdio.h>
#include "libiberty.h" #include "libiberty.h"
#include "ansidecl.h"
#include "hashtab.h" #include "hashtab.h"
#ifndef CHAR_BIT
#define CHAR_BIT 8
#endif
/* This macro defines reserved value for empty table entry. */ /* This macro defines reserved value for empty table entry. */
#define EMPTY_ENTRY ((PTR) 0) #define EMPTY_ENTRY ((PTR) 0)
@ -63,7 +73,10 @@ Boston, MA 02111-1307, USA. */
#define DELETED_ENTRY ((PTR) 1) #define DELETED_ENTRY ((PTR) 1)
static unsigned long higher_prime_number PARAMS ((unsigned long)); static unsigned int higher_prime_index PARAMS ((unsigned long));
static hashval_t htab_mod_1 PARAMS ((hashval_t, hashval_t, hashval_t, int));
static hashval_t htab_mod PARAMS ((hashval_t, htab_t));
static hashval_t htab_mod_m2 PARAMS ((hashval_t, htab_t));
static hashval_t hash_pointer PARAMS ((const void *)); static hashval_t hash_pointer PARAMS ((const void *));
static int eq_pointer PARAMS ((const void *, const void *)); static int eq_pointer PARAMS ((const void *, const void *));
static int htab_expand PARAMS ((htab_t)); static int htab_expand PARAMS ((htab_t));
@ -75,69 +88,117 @@ static PTR *find_empty_slot_for_expand PARAMS ((htab_t, hashval_t));
htab_hash htab_hash_pointer = hash_pointer; htab_hash htab_hash_pointer = hash_pointer;
htab_eq htab_eq_pointer = eq_pointer; htab_eq htab_eq_pointer = eq_pointer;
/* The following function returns a nearest prime number which is /* Table of primes and multiplicative inverses.
greater than N, and near a power of two. */
static unsigned long Note that these are not minimally reduced inverses. Unlike when generating
higher_prime_number (n) code to divide by a constant, we want to be able to use the same algorithm
all the time. All of these inverses (are implied to) have bit 32 set.
For the record, here's the function that computed the table; it's a
vastly simplified version of the function of the same name from gcc. */
#if 0
unsigned int
ceil_log2 (unsigned int x)
{
int i;
for (i = 31; i >= 0 ; --i)
if (x > (1u << i))
return i+1;
abort ();
}
unsigned int
choose_multiplier (unsigned int d, unsigned int *mlp, unsigned char *shiftp)
{
unsigned long long mhigh;
double nx;
int lgup, post_shift;
int pow, pow2;
int n = 32, precision = 32;
lgup = ceil_log2 (d);
pow = n + lgup;
pow2 = n + lgup - precision;
nx = ldexp (1.0, pow) + ldexp (1.0, pow2);
mhigh = nx / d;
*shiftp = lgup - 1;
*mlp = mhigh;
return mhigh >> 32;
}
#endif
struct prime_ent
{
hashval_t prime;
hashval_t inv;
hashval_t inv_m2; /* inverse of prime-2 */
hashval_t shift;
};
static struct prime_ent const prime_tab[] = {
{ 7, 0x24924925, 0x9999999b, 2 },
{ 13, 0x3b13b13c, 0x745d1747, 3 },
{ 31, 0x08421085, 0x1a7b9612, 4 },
{ 61, 0x0c9714fc, 0x15b1e5f8, 5 },
{ 127, 0x02040811, 0x0624dd30, 6 },
{ 251, 0x05197f7e, 0x073260a5, 7 },
{ 509, 0x01824366, 0x02864fc8, 8 },
{ 1021, 0x00c0906d, 0x014191f7, 9 },
{ 2039, 0x0121456f, 0x0161e69e, 10 },
{ 4093, 0x00300902, 0x00501908, 11 },
{ 8191, 0x00080041, 0x00180241, 12 },
{ 16381, 0x000c0091, 0x00140191, 13 },
{ 32749, 0x002605a5, 0x002a06e6, 14 },
{ 65521, 0x000f00e2, 0x00110122, 15 },
{ 131071, 0x00008001, 0x00018003, 16 },
{ 262139, 0x00014002, 0x0001c004, 17 },
{ 524287, 0x00002001, 0x00006001, 18 },
{ 1048573, 0x00003001, 0x00005001, 19 },
{ 2097143, 0x00004801, 0x00005801, 20 },
{ 4194301, 0x00000c01, 0x00001401, 21 },
{ 8388593, 0x00001e01, 0x00002201, 22 },
{ 16777213, 0x00000301, 0x00000501, 23 },
{ 33554393, 0x00001381, 0x00001481, 24 },
{ 67108859, 0x00000141, 0x000001c1, 25 },
{ 134217689, 0x000004e1, 0x00000521, 26 },
{ 268435399, 0x00000391, 0x000003b1, 27 },
{ 536870909, 0x00000019, 0x00000029, 28 },
{ 1073741789, 0x0000008d, 0x00000095, 29 },
{ 2147483647, 0x00000003, 0x00000007, 30 },
/* Avoid "decimal constant so large it is unsigned" for 4294967291. */
{ 0xfffffffb, 0x00000006, 0x00000008, 31 }
};
/* The following function returns an index into the above table of the
nearest prime number which is greater than N, and near a power of two. */
static unsigned int
higher_prime_index (n)
unsigned long n; unsigned long n;
{ {
/* These are primes that are near, but slightly smaller than, a unsigned int low = 0;
power of two. */ unsigned int high = sizeof(prime_tab) / sizeof(prime_tab[0]);
static const unsigned long primes[] = {
(unsigned long) 7,
(unsigned long) 13,
(unsigned long) 31,
(unsigned long) 61,
(unsigned long) 127,
(unsigned long) 251,
(unsigned long) 509,
(unsigned long) 1021,
(unsigned long) 2039,
(unsigned long) 4093,
(unsigned long) 8191,
(unsigned long) 16381,
(unsigned long) 32749,
(unsigned long) 65521,
(unsigned long) 131071,
(unsigned long) 262139,
(unsigned long) 524287,
(unsigned long) 1048573,
(unsigned long) 2097143,
(unsigned long) 4194301,
(unsigned long) 8388593,
(unsigned long) 16777213,
(unsigned long) 33554393,
(unsigned long) 67108859,
(unsigned long) 134217689,
(unsigned long) 268435399,
(unsigned long) 536870909,
(unsigned long) 1073741789,
(unsigned long) 2147483647,
/* 4294967291L */
((unsigned long) 2147483647) + ((unsigned long) 2147483644),
};
const unsigned long *low = &primes[0];
const unsigned long *high = &primes[sizeof(primes) / sizeof(primes[0])];
while (low != high) while (low != high)
{ {
const unsigned long *mid = low + (high - low) / 2; unsigned int mid = low + (high - low) / 2;
if (n > *mid) if (n > prime_tab[mid].prime)
low = mid + 1; low = mid + 1;
else else
high = mid; high = mid;
} }
/* If we've run out of primes, abort. */ /* If we've run out of primes, abort. */
if (n > *low) if (n > prime_tab[low].prime)
{ {
fprintf (stderr, "Cannot find prime bigger than %lu\n", n); fprintf (stderr, "Cannot find prime bigger than %lu\n", n);
abort (); abort ();
} }
return *low; return low;
} }
/* Returns a hash code for P. */ /* Returns a hash code for P. */
@ -177,6 +238,36 @@ htab_elements (htab)
return htab->n_elements - htab->n_deleted; return htab->n_elements - htab->n_deleted;
} }
/* Return X % Y. */
static inline hashval_t
htab_mod_1 (x, y, inv, shift)
hashval_t x, y, inv;
int shift;
{
/* The multiplicative inverses computed above are for 32-bit types, and
requires that we be able to compute a highpart multiply. */
#ifdef UNSIGNED_64BIT_TYPE
__extension__ typedef UNSIGNED_64BIT_TYPE ull;
if (sizeof (hashval_t) * CHAR_BIT <= 32)
{
hashval_t t1, t2, t3, t4, q, r;
t1 = ((ull)x * inv) >> 32;
t2 = x - t1;
t3 = t2 >> 1;
t4 = t1 + t3;
q = t4 >> shift;
r = x - (q * y);
return r;
}
#endif
/* Otherwise just use the native division routines. */
return x % y;
}
/* Compute the primary hash for HASH given HTAB's current size. */ /* Compute the primary hash for HASH given HTAB's current size. */
static inline hashval_t static inline hashval_t
@ -184,7 +275,8 @@ htab_mod (hash, htab)
hashval_t hash; hashval_t hash;
htab_t htab; htab_t htab;
{ {
return hash % htab_size (htab); const struct prime_ent *p = &prime_tab[htab->size_prime_index];
return htab_mod_1 (hash, p->prime, p->inv, p->shift);
} }
/* Compute the secondary hash for HASH given HTAB's current size. */ /* Compute the secondary hash for HASH given HTAB's current size. */
@ -194,7 +286,8 @@ htab_mod_m2 (hash, htab)
hashval_t hash; hashval_t hash;
htab_t htab; htab_t htab;
{ {
return 1 + hash % (htab_size (htab) - 2); const struct prime_ent *p = &prime_tab[htab->size_prime_index];
return 1 + htab_mod_1 (hash, p->prime - 2, p->inv_m2, p->shift);
} }
/* This function creates table with length slightly longer than given /* This function creates table with length slightly longer than given
@ -212,8 +305,11 @@ htab_create_alloc (size, hash_f, eq_f, del_f, alloc_f, free_f)
htab_free free_f; htab_free free_f;
{ {
htab_t result; htab_t result;
unsigned int size_prime_index;
size_prime_index = higher_prime_index (size);
size = prime_tab[size_prime_index].prime;
size = higher_prime_number (size);
result = (htab_t) (*alloc_f) (1, sizeof (struct htab)); result = (htab_t) (*alloc_f) (1, sizeof (struct htab));
if (result == NULL) if (result == NULL)
return NULL; return NULL;
@ -225,6 +321,7 @@ htab_create_alloc (size, hash_f, eq_f, del_f, alloc_f, free_f)
return NULL; return NULL;
} }
result->size = size; result->size = size;
result->size_prime_index = size_prime_index;
result->hash_f = hash_f; result->hash_f = hash_f;
result->eq_f = eq_f; result->eq_f = eq_f;
result->del_f = del_f; result->del_f = del_f;
@ -248,8 +345,11 @@ htab_create_alloc_ex (size, hash_f, eq_f, del_f, alloc_arg, alloc_f,
htab_free_with_arg free_f; htab_free_with_arg free_f;
{ {
htab_t result; htab_t result;
unsigned int size_prime_index;
size_prime_index = higher_prime_index (size);
size = prime_tab[size_prime_index].prime;
size = higher_prime_number (size);
result = (htab_t) (*alloc_f) (alloc_arg, 1, sizeof (struct htab)); result = (htab_t) (*alloc_f) (alloc_arg, 1, sizeof (struct htab));
if (result == NULL) if (result == NULL)
return NULL; return NULL;
@ -261,6 +361,7 @@ htab_create_alloc_ex (size, hash_f, eq_f, del_f, alloc_arg, alloc_f,
return NULL; return NULL;
} }
result->size = size; result->size = size;
result->size_prime_index = size_prime_index;
result->hash_f = hash_f; result->hash_f = hash_f;
result->eq_f = eq_f; result->eq_f = eq_f;
result->del_f = del_f; result->del_f = del_f;
@ -412,19 +513,27 @@ htab_expand (htab)
PTR *olimit; PTR *olimit;
PTR *p; PTR *p;
PTR *nentries; PTR *nentries;
size_t nsize; size_t nsize, osize, elts;
unsigned int oindex, nindex;
oentries = htab->entries; oentries = htab->entries;
olimit = oentries + htab->size; oindex = htab->size_prime_index;
osize = htab->size;
olimit = oentries + osize;
elts = htab_elements (htab);
/* Resize only when table after removal of unused elements is either /* Resize only when table after removal of unused elements is either
too full or too empty. */ too full or too empty. */
if ((htab->n_elements - htab->n_deleted) * 2 > htab->size if (elts * 2 > osize || (elts * 8 < osize && osize > 32))
|| ((htab->n_elements - htab->n_deleted) * 8 < htab->size {
&& htab->size > 32)) nindex = higher_prime_index (elts * 2);
nsize = higher_prime_number ((htab->n_elements - htab->n_deleted) * 2); nsize = prime_tab[nindex].prime;
}
else else
nsize = htab->size; {
nindex = oindex;
nsize = osize;
}
if (htab->alloc_with_arg_f != NULL) if (htab->alloc_with_arg_f != NULL)
nentries = (PTR *) (*htab->alloc_with_arg_f) (htab->alloc_arg, nsize, nentries = (PTR *) (*htab->alloc_with_arg_f) (htab->alloc_arg, nsize,
@ -435,7 +544,7 @@ htab_expand (htab)
return 0; return 0;
htab->entries = nentries; htab->entries = nentries;
htab->size = nsize; htab->size = nsize;
htab->size_prime_index = nindex;
htab->n_elements -= htab->n_deleted; htab->n_elements -= htab->n_deleted;
htab->n_deleted = 0; htab->n_deleted = 0;