aboutsummaryrefslogtreecommitdiff
path: root/gold
diff options
context:
space:
mode:
Diffstat (limited to 'gold')
-rw-r--r--gold/ChangeLog10
-rw-r--r--gold/config.in3
-rwxr-xr-xgold/configure33
-rw-r--r--gold/configure.ac19
-rw-r--r--gold/gold.h16
-rw-r--r--gold/output.h4
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