diff options
Diffstat (limited to 'gold')
-rw-r--r-- | gold/ChangeLog | 10 | ||||
-rw-r--r-- | gold/config.in | 3 | ||||
-rwxr-xr-x | gold/configure | 33 | ||||
-rw-r--r-- | gold/configure.ac | 19 | ||||
-rw-r--r-- | gold/gold.h | 16 | ||||
-rw-r--r-- | gold/output.h | 4 |
6 files changed, 85 insertions, 0 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog index 6017530..33317bf 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,13 @@ +2012-07-10 Dodji Seketeli <dodji@redhat.com> + Ian Lance Taylor <iant@google.com> + + PR gold/14309 + * configure.ac: Test whether std::tr1::hash<off_t> works. + * gold.h: Add a specialization for std::tr1::hash<off_t> if + needed. + * output.h (class Output_fill): Add virtual destructor. + * configure, config.in: Rebuild. + 2012-06-22 Roland McGrath <mcgrathr@google.com> * layout.cc (finalize): Define __ehdr_start symbol if applicable. diff --git a/gold/config.in b/gold/config.in index ff4d5ee..3edc0d6 100644 --- a/gold/config.in +++ b/gold/config.in @@ -169,6 +169,9 @@ /* Define to 1 if you have the `times' function. */ #undef HAVE_TIMES +/* Define if std::tr1::hash<off_t> is usable */ +#undef HAVE_TR1_HASH_OFF_T + /* Define to 1 if you have the <tr1/unordered_map> header file. */ #undef HAVE_TR1_UNORDERED_MAP diff --git a/gold/configure b/gold/configure index b84234a..b9967ae 100755 --- a/gold/configure +++ b/gold/configure @@ -7266,6 +7266,39 @@ $as_echo "#define HAVE_TR1_UNORDERED_MAP_REHASH 1" >>confdefs.h fi +# Use of tr1/unordered_map with off_t as a key is not supported on GCC +# 4.1.xx when compiling in 32-bit mode with a 64-bit off_t type. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether std::tr1::hash<off_t> is defined" >&5 +$as_echo_n "checking whether std::tr1::hash<off_t> is defined... " >&6; } +if test "${gold_cv_hash_off_t+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + CXXFLAGS_hold=$CXXFLAGS +CXXFLAGS="$CXXFLAGS $LFS_CFLAGS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include <sys/types.h> +#include <tr1/unordered_map> +std::tr1::hash<off_t> h; + +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + gold_cv_hash_off_t=yes +else + gold_cv_hash_off_t=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +CXXFLAGS=$CFLAGS_hold +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gold_cv_hash_off_t" >&5 +$as_echo "$gold_cv_hash_off_t" >&6; } +if test "$gold_cv_hash_off_t" = "yes"; then + +$as_echo "#define HAVE_TR1_HASH_OFF_T 1" >>confdefs.h + +fi + # gcc 4.3.0 doesn't recognize the printf attribute on a template # function. Check for that. This is gcc bug 35546. This test can # probably be removed after the bug has been fixed for a while. diff --git a/gold/configure.ac b/gold/configure.ac index fdea629..5e3dc06 100644 --- a/gold/configure.ac +++ b/gold/configure.ac @@ -515,6 +515,25 @@ if test "$gold_cv_unordered_map_rehash" = "yes"; then [Define if ::std::tr1::unordered_map::rehash is usable]) fi +# Use of tr1/unordered_map with off_t as a key is not supported on GCC +# 4.1.xx when compiling in 32-bit mode with a 64-bit off_t type. +AC_CACHE_CHECK([whether std::tr1::hash<off_t> is defined], +[gold_cv_hash_off_t], +[CXXFLAGS_hold=$CXXFLAGS +CXXFLAGS="$CXXFLAGS $LFS_CFLAGS" +AC_COMPILE_IFELSE([ +#include <sys/types.h> +#include <tr1/unordered_map> +std::tr1::hash<off_t> h; +], +[gold_cv_hash_off_t=yes], +[gold_cv_hash_off_t=no]) +CXXFLAGS=$CFLAGS_hold]) +if test "$gold_cv_hash_off_t" = "yes"; then + AC_DEFINE(HAVE_TR1_HASH_OFF_T, 1, + [Define if std::tr1::hash<off_t> is usable]) +fi + # gcc 4.3.0 doesn't recognize the printf attribute on a template # function. Check for that. This is gcc bug 35546. This test can # probably be removed after the bug has been fixed for a while. diff --git a/gold/gold.h b/gold/gold.h index 4258d55..9aa7cf3 100644 --- a/gold/gold.h +++ b/gold/gold.h @@ -80,6 +80,22 @@ #define reserve_unordered_map(map, n) ((map)->rehash(n)) +#ifndef HAVE_TR1_HASH_OFF_T +// The library does not support hashes of off_t values. Add support +// here. This is likely to be specific to libstdc++. This issue +// arises with GCC 4.1.x when compiling in 32-bit mode with a 64-bit +// off_t type. +namespace std { namespace tr1 { +template<> +struct hash<off_t> : public std::unary_function<off_t, std::size_t> +{ + std::size_t + operator()(off_t val) const + { return static_cast<std::size_t>(val); } +}; +} } // Close namespaces. +#endif // !defined(HAVE_TR1_HASH_OFF_T) + #elif defined(HAVE_EXT_HASH_MAP) && defined(HAVE_EXT_HASH_SET) #include <ext/hash_map> diff --git a/gold/output.h b/gold/output.h index 3796e91..170f0ff 100644 --- a/gold/output.h +++ b/gold/output.h @@ -2819,6 +2819,10 @@ class Output_fill : is_big_endian_(parameters->target().is_big_endian()) { } + virtual + ~Output_fill() + { } + // Return the smallest size chunk of free space that can be // filled with a dummy compilation unit. size_t |