Commit 19b890af by Kimmo Kinnunen Committed by Jamie Madill

Import new MurmurHash3 to fix g++ 4.9.2 errors

The code is from http://smhasher.googlecode.com/svn/trunk/ revision 152. Fixes error: ../../src/third_party/murmurhash/MurmurHash3.cpp:57:41: error: inlining failed in call to always_inline ‘uint32_t getblock(const uint32_t*, int)’: function body can be overwritten at link time FORCE_INLINE uint32_t getblock ( const uint32_t * p, int i ) The error was previously fixed by adding a pragma to ignore the warning. The problem the compiler is complaining is that the function is visible to outside of the compilation unit. This can be fixed by making the function inline (as in the new version of the MurmurHash3.cpp) or static. Change-Id: I7a1262964489d72de8b4707ca2284363c8b46e20 Reviewed-on: https://chromium-review.googlesource.com/291620Tested-by: 's avatarKimmo Kinnunen <kkinnunen@nvidia.com> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarDongseong Hwang <dongseong.hwang@intel.com> Tested-by: 's avatarDongseong Hwang <dongseong.hwang@intel.com> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 8afe1e1b
...@@ -29,9 +29,7 @@ ...@@ -29,9 +29,7 @@
#else // defined(_MSC_VER) #else // defined(_MSC_VER)
// Ignore GCC force inline warnings #define FORCE_INLINE inline __attribute__((always_inline))
#pragma GCC diagnostic ignored "-Wattributes"
#define FORCE_INLINE __attribute__((always_inline))
inline uint32_t rotl32 ( uint32_t x, int8_t r ) inline uint32_t rotl32 ( uint32_t x, int8_t r )
{ {
...@@ -54,12 +52,12 @@ inline uint64_t rotl64 ( uint64_t x, int8_t r ) ...@@ -54,12 +52,12 @@ inline uint64_t rotl64 ( uint64_t x, int8_t r )
// Block read - if your platform needs to do endian-swapping or can only // Block read - if your platform needs to do endian-swapping or can only
// handle aligned reads, do the conversion here // handle aligned reads, do the conversion here
FORCE_INLINE uint32_t getblock ( const uint32_t * p, int i ) FORCE_INLINE uint32_t getblock32 ( const uint32_t * p, int i )
{ {
return p[i]; return p[i];
} }
FORCE_INLINE uint64_t getblock ( const uint64_t * p, int i ) FORCE_INLINE uint64_t getblock64 ( const uint64_t * p, int i )
{ {
return p[i]; return p[i];
} }
...@@ -67,7 +65,7 @@ FORCE_INLINE uint64_t getblock ( const uint64_t * p, int i ) ...@@ -67,7 +65,7 @@ FORCE_INLINE uint64_t getblock ( const uint64_t * p, int i )
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Finalization mix - force all bits of a hash block to avalanche // Finalization mix - force all bits of a hash block to avalanche
FORCE_INLINE uint32_t fmix ( uint32_t h ) FORCE_INLINE uint32_t fmix32 ( uint32_t h )
{ {
h ^= h >> 16; h ^= h >> 16;
h *= 0x85ebca6b; h *= 0x85ebca6b;
...@@ -80,7 +78,7 @@ FORCE_INLINE uint32_t fmix ( uint32_t h ) ...@@ -80,7 +78,7 @@ FORCE_INLINE uint32_t fmix ( uint32_t h )
//---------- //----------
FORCE_INLINE uint64_t fmix ( uint64_t k ) FORCE_INLINE uint64_t fmix64 ( uint64_t k )
{ {
k ^= k >> 33; k ^= k >> 33;
k *= BIG_CONSTANT(0xff51afd7ed558ccd); k *= BIG_CONSTANT(0xff51afd7ed558ccd);
...@@ -111,7 +109,7 @@ void MurmurHash3_x86_32 ( const void * key, int len, ...@@ -111,7 +109,7 @@ void MurmurHash3_x86_32 ( const void * key, int len,
for(int i = -nblocks; i; i++) for(int i = -nblocks; i; i++)
{ {
uint32_t k1 = getblock(blocks,i); uint32_t k1 = getblock32(blocks,i);
k1 *= c1; k1 *= c1;
k1 = ROTL32(k1,15); k1 = ROTL32(k1,15);
...@@ -142,7 +140,7 @@ void MurmurHash3_x86_32 ( const void * key, int len, ...@@ -142,7 +140,7 @@ void MurmurHash3_x86_32 ( const void * key, int len,
h1 ^= len; h1 ^= len;
h1 = fmix(h1); h1 = fmix32(h1);
*(uint32_t*)out = h1; *(uint32_t*)out = h1;
} }
...@@ -172,10 +170,10 @@ void MurmurHash3_x86_128 ( const void * key, const int len, ...@@ -172,10 +170,10 @@ void MurmurHash3_x86_128 ( const void * key, const int len,
for(int i = -nblocks; i; i++) for(int i = -nblocks; i; i++)
{ {
uint32_t k1 = getblock(blocks,i*4+0); uint32_t k1 = getblock32(blocks,i*4+0);
uint32_t k2 = getblock(blocks,i*4+1); uint32_t k2 = getblock32(blocks,i*4+1);
uint32_t k3 = getblock(blocks,i*4+2); uint32_t k3 = getblock32(blocks,i*4+2);
uint32_t k4 = getblock(blocks,i*4+3); uint32_t k4 = getblock32(blocks,i*4+3);
k1 *= c1; k1 = ROTL32(k1,15); k1 *= c2; h1 ^= k1; k1 *= c1; k1 = ROTL32(k1,15); k1 *= c2; h1 ^= k1;
...@@ -238,10 +236,10 @@ void MurmurHash3_x86_128 ( const void * key, const int len, ...@@ -238,10 +236,10 @@ void MurmurHash3_x86_128 ( const void * key, const int len,
h1 += h2; h1 += h3; h1 += h4; h1 += h2; h1 += h3; h1 += h4;
h2 += h1; h3 += h1; h4 += h1; h2 += h1; h3 += h1; h4 += h1;
h1 = fmix(h1); h1 = fmix32(h1);
h2 = fmix(h2); h2 = fmix32(h2);
h3 = fmix(h3); h3 = fmix32(h3);
h4 = fmix(h4); h4 = fmix32(h4);
h1 += h2; h1 += h3; h1 += h4; h1 += h2; h1 += h3; h1 += h4;
h2 += h1; h3 += h1; h4 += h1; h2 += h1; h3 += h1; h4 += h1;
...@@ -273,8 +271,8 @@ void MurmurHash3_x64_128 ( const void * key, const int len, ...@@ -273,8 +271,8 @@ void MurmurHash3_x64_128 ( const void * key, const int len,
for(int i = 0; i < nblocks; i++) for(int i = 0; i < nblocks; i++)
{ {
uint64_t k1 = getblock(blocks,i*2+0); uint64_t k1 = getblock64(blocks,i*2+0);
uint64_t k2 = getblock(blocks,i*2+1); uint64_t k2 = getblock64(blocks,i*2+1);
k1 *= c1; k1 = ROTL64(k1,31); k1 *= c2; h1 ^= k1; k1 *= c1; k1 = ROTL64(k1,31); k1 *= c2; h1 ^= k1;
...@@ -295,23 +293,23 @@ void MurmurHash3_x64_128 ( const void * key, const int len, ...@@ -295,23 +293,23 @@ void MurmurHash3_x64_128 ( const void * key, const int len,
switch(len & 15) switch(len & 15)
{ {
case 15: k2 ^= uint64_t(tail[14]) << 48; case 15: k2 ^= ((uint64_t)tail[14]) << 48;
case 14: k2 ^= uint64_t(tail[13]) << 40; case 14: k2 ^= ((uint64_t)tail[13]) << 40;
case 13: k2 ^= uint64_t(tail[12]) << 32; case 13: k2 ^= ((uint64_t)tail[12]) << 32;
case 12: k2 ^= uint64_t(tail[11]) << 24; case 12: k2 ^= ((uint64_t)tail[11]) << 24;
case 11: k2 ^= uint64_t(tail[10]) << 16; case 11: k2 ^= ((uint64_t)tail[10]) << 16;
case 10: k2 ^= uint64_t(tail[ 9]) << 8; case 10: k2 ^= ((uint64_t)tail[ 9]) << 8;
case 9: k2 ^= uint64_t(tail[ 8]) << 0; case 9: k2 ^= ((uint64_t)tail[ 8]) << 0;
k2 *= c2; k2 = ROTL64(k2,33); k2 *= c1; h2 ^= k2; k2 *= c2; k2 = ROTL64(k2,33); k2 *= c1; h2 ^= k2;
case 8: k1 ^= uint64_t(tail[ 7]) << 56; case 8: k1 ^= ((uint64_t)tail[ 7]) << 56;
case 7: k1 ^= uint64_t(tail[ 6]) << 48; case 7: k1 ^= ((uint64_t)tail[ 6]) << 48;
case 6: k1 ^= uint64_t(tail[ 5]) << 40; case 6: k1 ^= ((uint64_t)tail[ 5]) << 40;
case 5: k1 ^= uint64_t(tail[ 4]) << 32; case 5: k1 ^= ((uint64_t)tail[ 4]) << 32;
case 4: k1 ^= uint64_t(tail[ 3]) << 24; case 4: k1 ^= ((uint64_t)tail[ 3]) << 24;
case 3: k1 ^= uint64_t(tail[ 2]) << 16; case 3: k1 ^= ((uint64_t)tail[ 2]) << 16;
case 2: k1 ^= uint64_t(tail[ 1]) << 8; case 2: k1 ^= ((uint64_t)tail[ 1]) << 8;
case 1: k1 ^= uint64_t(tail[ 0]) << 0; case 1: k1 ^= ((uint64_t)tail[ 0]) << 0;
k1 *= c1; k1 = ROTL64(k1,31); k1 *= c2; h1 ^= k1; k1 *= c1; k1 = ROTL64(k1,31); k1 *= c2; h1 ^= k1;
}; };
...@@ -323,8 +321,8 @@ void MurmurHash3_x64_128 ( const void * key, const int len, ...@@ -323,8 +321,8 @@ void MurmurHash3_x64_128 ( const void * key, const int len,
h1 += h2; h1 += h2;
h2 += h1; h2 += h1;
h1 = fmix(h1); h1 = fmix64(h1);
h2 = fmix(h2); h2 = fmix64(h2);
h1 += h2; h1 += h2;
h2 += h1; h2 += h1;
...@@ -334,3 +332,4 @@ void MurmurHash3_x64_128 ( const void * key, const int len, ...@@ -334,3 +332,4 @@ void MurmurHash3_x64_128 ( const void * key, const int len,
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
...@@ -8,8 +8,22 @@ ...@@ -8,8 +8,22 @@
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Platform-specific functions and macros // Platform-specific functions and macros
// Microsoft Visual Studio
#if defined(_MSC_VER) && (_MSC_VER < 1600)
typedef unsigned char uint8_t;
typedef unsigned int uint32_t;
typedef unsigned __int64 uint64_t;
// Other compilers
#else // defined(_MSC_VER)
#include <stdint.h> #include <stdint.h>
#endif // !defined(_MSC_VER)
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void MurmurHash3_x86_32 ( const void * key, int len, uint32_t seed, void * out ); void MurmurHash3_x86_32 ( const void * key, int len, uint32_t seed, void * out );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment