Allow override for unaligned reads in SpookyHashV2
authorMichael Lee <mzlee@fb.com>
Thu, 17 Dec 2015 18:57:47 +0000 (10:57 -0800)
committerfacebook-github-bot-1 <folly-bot@fb.com>
Thu, 17 Dec 2015 19:20:23 +0000 (11:20 -0800)
Summary: Add configuration for disabling unaligned reads in SpookyHashV2

Reviewed By: yfeldblum

Differential Revision: D2750885

fb-gh-sync-id: 9f48dcdfd5af05478a38e354f6fa0332b1332c14

folly/Portability.h
folly/SpookyHashV2.cpp
folly/configure.ac

index 267bd82d6f967f89371c2819ab774a07121cc93b..63318a2ce3a2ae14783dc5f265071760b1756bd5 100644 (file)
  #endif
 #endif
 
+#ifndef FOLLY_HAVE_UNALIGNED_READS
+#define FOLLY_HAVE_UNALIGNED_READS 0
+#endif
+
 // A change in folly/MemoryMapping.cpp uses MAP_ANONYMOUS, which is named
 // MAP_ANON on OSX/BSD.
 #if defined(__APPLE__) || defined(__FreeBSD__)
index e2f665f2259dd6d830361a0e4511b6928bbdaa57..877e0e7295c2184d8dfb99e804302264b9eea0fb 100644 (file)
 
 #include <folly/SpookyHashV2.h>
 
-#include <cstring>
+#include <folly/Portability.h>
 
-#define ALLOW_UNALIGNED_READS 1
+#include <cstring>
 
 namespace folly {
 namespace hash {
 
+static constexpr auto kAllowUnalignedReads = bool(FOLLY_HAVE_UNALIGNED_READS);
+
 //
 // short hash ... it could be used on any message,
 // but it's used by Spooky just for short messages.
@@ -56,7 +58,7 @@ void SpookyHashV2::Short(
 
     u.p8 = (const uint8_t *)message;
 
-    if (!ALLOW_UNALIGNED_READS && (u.i & 0x7))
+    if (!kAllowUnalignedReads && (u.i & 0x7))
     {
         memcpy(buf, message, length);
         u.p64 = buf;
@@ -176,7 +178,7 @@ void SpookyHashV2::Hash128(
     end = u.p64 + (length/sc_blockSize)*sc_numVars;
 
     // handle all whole sc_blockSize blocks of bytes
-    if (ALLOW_UNALIGNED_READS || ((u.i & 0x7) == 0))
+    if (kAllowUnalignedReads || ((u.i & 0x7) == 0))
     {
         while (u.p64 < end)
         {
@@ -284,7 +286,7 @@ void SpookyHashV2::Update(const void *message, size_t length)
     // handle all whole blocks of sc_blockSize bytes
     end = u.p64 + (length/sc_blockSize)*sc_numVars;
     remainder = (uint8_t)(length-((const uint8_t *)end-u.p8));
-    if (ALLOW_UNALIGNED_READS || (u.i & 0x7) == 0)
+    if (kAllowUnalignedReads || (u.i & 0x7) == 0)
     {
         while (u.p64 < end)
         {
index d89061b141ee2eb05e2d12630e487dae522a745f..a60af3c5b5c5715ea4807deb3fd07695cf564c60 100644 (file)
@@ -317,6 +317,26 @@ if test "$folly_cv_prog_cc_weak_symbols" = yes; then
             [Define to 1 if the linker supports weak symbols.])
 fi
 
+# Figure out whether the architecture supports unaligned reads
+AC_CACHE_CHECK(
+  [for unaligned reads support],
+  [folly_cv_prog_cc_unaligned_reads],
+  [AC_RUN_IFELSE(
+    [AC_LANG_SOURCE[
+      int main(int argc, char** argv) {
+        char buf[64] = {0};
+        unsigned long *ptr = (unsigned long *)(buf + 1);
+        *ptr = 0xdeadbeef;
+        return (*ptr & 0xff) == 0xef ? 0 : 1;
+      }
+    ]],
+    [folly_cv_prog_cc_unaligned_reads=yes],
+    [folly_cv_prog_cc_unaligned_reads=no])])
+
+if test "$folly_cv_prog_cc_unaligned_reads" = "yes"; then
+  AC_DEFINE([HAVE_UNALIGNED_READS], [1], [Define to 1 if the architecture allows unaligned reads])
+fi
+
 AC_CACHE_CHECK(
   [for vsnprintf reporting bad format strings],
   [folly_cv_prog_vsnprintf_bad_format],