New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Compile fails with -DPERL_HASH_FUNC_SIPHASH13 on GCC7.3 : static declaration of ‘S_perl_siphash_seed_state’ follows non-static declaration #16471
Comments
From @kentfredricCreated by @kentfredricAt least on GCC 7.3, Perl 5.27.9 Fails compile with hv_func.h:194:6: error: static declaration of �S_perl_siphash_seed_state� follows non-static declaration Shown site configuration data is from 5.27.9 with identical flags Complete failing build log attached. Perl Info
|
From @tonycozOn Sun, 18 Mar 2018 19:19:05 -0700, kentfredric@gmail.com wrote:
Please try the attached patch. Tony |
From @tonycoz0001-perl-132999-ensure-siphash-functions-are-declared-be.patchFrom 331cdf7f4ef7b46e3255b99220575919febffa6e Mon Sep 17 00:00:00 2001
From: Tony Cook <tony@develop-help.com>
Date: Wed, 28 Mar 2018 11:53:09 +1100
Subject: [PATCH] (perl #132999) ensure siphash functions are declared before
use
I considered moving only the parts that depend on these functions
after the siphash block, but that's a little fragile.
Rather than that, I made the siphash code match the other hash
functions, moving the siphash specific code into its own header.
This also make hv_func.h more focused, so it's only dealing with
the infrastructure needed to give all the hashes the same interface.
---
MANIFEST | 1 +
hv_func.h | 117 ++------------------------------------------------------------
siphash.h | 114 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 117 insertions(+), 115 deletions(-)
create mode 100644 siphash.h
diff --git a/MANIFEST b/MANIFEST
index 235689d946..be7916f84b 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -5344,6 +5344,7 @@ runtests.SH A script that generates runtests
sbox32_hash.h SBox hash code (32 Bit SBOX based hash function)
scope.c Scope entry and exit code
scope.h Scope entry and exit header
+siphash.h Siphash hash code
stadtx_hash.h StadtX hash code (64 Bit fast hash function)
sv.c Scalar value code
sv.h Scalar value header
diff --git a/hv_func.h b/hv_func.h
index 111de93f1e..098d96b1e4 100644
--- a/hv_func.h
+++ b/hv_func.h
@@ -40,12 +40,14 @@
# define __PERL_HASH_STATE_BYTES 32
# define __PERL_HASH_SEED_STATE(seed,state) S_perl_siphash_seed_state(seed,state)
# define __PERL_HASH_WITH_STATE(state,str,len) S_perl_hash_siphash_2_4_with_state((state),(U8*)(str),(len))
+#include "siphash.h"
#elif defined(PERL_HASH_FUNC_SIPHASH13)
# define __PERL_HASH_FUNC "SIPHASH_1_3"
# define __PERL_HASH_SEED_BYTES 16
# define __PERL_HASH_STATE_BYTES 32
# define __PERL_HASH_SEED_STATE(seed,state) S_perl_siphash_seed_state(seed,state)
# define __PERL_HASH_WITH_STATE(state,str,len) S_perl_hash_siphash_1_3_with_state((state),(U8*)(str),(len))
+#include "siphash.h"
#elif defined(PERL_HASH_FUNC_STADTX)
# define __PERL_HASH_FUNC "STATDX"
# define __PERL_HASH_SEED_BYTES 16
@@ -155,121 +157,6 @@ U32 S_perl_hash_with_seed(const U8 * const seed, const U8 * const str, const STR
#define PERL_HASH_INTERNAL(hash,str,len) PERL_HASH(hash,str,len)
#endif
-/* This is SipHash by Jean-Philippe Aumasson and Daniel J. Bernstein.
- * The authors claim it is relatively secure compared to the alternatives
- * and that performance wise it is a suitable hash for languages like Perl.
- * See:
- *
- * https://www.131002.net/siphash/
- *
- * This implementation seems to perform slightly slower than one-at-a-time for
- * short keys, but degrades slower for longer keys. Murmur Hash outperforms it
- * regardless of keys size.
- *
- * It is 64 bit only.
- */
-
-#ifdef CAN64BITHASH
-
-#define SIPROUND \
- STMT_START { \
- v0 += v1; v1=ROTL64(v1,13); v1 ^= v0; v0=ROTL64(v0,32); \
- v2 += v3; v3=ROTL64(v3,16); v3 ^= v2; \
- v0 += v3; v3=ROTL64(v3,21); v3 ^= v0; \
- v2 += v1; v1=ROTL64(v1,17); v1 ^= v2; v2=ROTL64(v2,32); \
- } STMT_END
-
-#define SIPHASH_SEED_STATE(key,v0,v1,v2,v3) \
-do { \
- v0 = v2 = U8TO64_LE(key + 0); \
- v1 = v3 = U8TO64_LE(key + 8); \
- /* "somepseudorandomlygeneratedbytes" */ \
- v0 ^= UINT64_C(0x736f6d6570736575); \
- v1 ^= UINT64_C(0x646f72616e646f6d); \
- v2 ^= UINT64_C(0x6c7967656e657261); \
- v3 ^= UINT64_C(0x7465646279746573); \
-} while (0)
-
-PERL_STATIC_INLINE
-void S_perl_siphash_seed_state(const unsigned char * const seed_buf, unsigned char * state_buf) {
- U64 *v= (U64*) state_buf;
- SIPHASH_SEED_STATE(seed_buf, v[0],v[1],v[2],v[3]);
-}
-
-#define PERL_SIPHASH_FNC(FNC,SIP_ROUNDS,SIP_FINAL_ROUNDS) \
-PERL_STATIC_INLINE U32 \
-FNC ## _with_state \
- (const unsigned char * const state, const unsigned char *in, const STRLEN inlen) \
-{ \
- const int left = inlen & 7; \
- const U8 *end = in + inlen - left; \
- \
- U64 b = ( ( U64 )(inlen) ) << 56; \
- U64 m; \
- U64 v0 = U8TO64_LE(state); \
- U64 v1 = U8TO64_LE(state+8); \
- U64 v2 = U8TO64_LE(state+16); \
- U64 v3 = U8TO64_LE(state+24); \
- \
- for ( ; in != end; in += 8 ) \
- { \
- m = U8TO64_LE( in ); \
- v3 ^= m; \
- \
- SIP_ROUNDS; \
- \
- v0 ^= m; \
- } \
- \
- switch( left ) \
- { \
- case 7: b |= ( ( U64 )in[ 6] ) << 48; \
- case 6: b |= ( ( U64 )in[ 5] ) << 40; \
- case 5: b |= ( ( U64 )in[ 4] ) << 32; \
- case 4: b |= ( ( U64 )in[ 3] ) << 24; \
- case 3: b |= ( ( U64 )in[ 2] ) << 16; \
- case 2: b |= ( ( U64 )in[ 1] ) << 8; \
- case 1: b |= ( ( U64 )in[ 0] ); break; \
- case 0: break; \
- } \
- \
- v3 ^= b; \
- \
- SIP_ROUNDS; \
- \
- v0 ^= b; \
- \
- v2 ^= 0xff; \
- \
- SIP_FINAL_ROUNDS \
- \
- b = v0 ^ v1 ^ v2 ^ v3; \
- return (U32)(b & U32_MAX); \
-} \
- \
-PERL_STATIC_INLINE U32 \
-FNC (const unsigned char * const seed, const unsigned char *in, const STRLEN inlen) \
-{ \
- U64 state[4]; \
- SIPHASH_SEED_STATE(seed,state[0],state[1],state[2],state[3]); \
- return FNC ## _with_state((U8*)state,in,inlen); \
-}
-
-
-PERL_SIPHASH_FNC(
- S_perl_hash_siphash_1_3
- ,SIPROUND;
- ,SIPROUND;SIPROUND;SIPROUND;
-)
-
-PERL_SIPHASH_FNC(
- S_perl_hash_siphash_2_4
- ,SIPROUND;SIPROUND;
- ,SIPROUND;SIPROUND;SIPROUND;SIPROUND;
-)
-#endif /* defined(CAN64BITHASH) */
-
-
#endif /*compile once*/
/*
diff --git a/siphash.h b/siphash.h
new file mode 100644
index 0000000000..10abb939cc
--- /dev/null
+++ b/siphash.h
@@ -0,0 +1,114 @@
+/* This is SipHash by Jean-Philippe Aumasson and Daniel J. Bernstein.
+ * The authors claim it is relatively secure compared to the alternatives
+ * and that performance wise it is a suitable hash for languages like Perl.
+ * See:
+ *
+ * https://www.131002.net/siphash/
+ *
+ * This implementation seems to perform slightly slower than one-at-a-time for
+ * short keys, but degrades slower for longer keys. Murmur Hash outperforms it
+ * regardless of keys size.
+ *
+ * It is 64 bit only.
+ */
+
+#ifdef CAN64BITHASH
+
+#define SIPROUND \
+ STMT_START { \
+ v0 += v1; v1=ROTL64(v1,13); v1 ^= v0; v0=ROTL64(v0,32); \
+ v2 += v3; v3=ROTL64(v3,16); v3 ^= v2; \
+ v0 += v3; v3=ROTL64(v3,21); v3 ^= v0; \
+ v2 += v1; v1=ROTL64(v1,17); v1 ^= v2; v2=ROTL64(v2,32); \
+ } STMT_END
+
+#define SIPHASH_SEED_STATE(key,v0,v1,v2,v3) \
+do { \
+ v0 = v2 = U8TO64_LE(key + 0); \
+ v1 = v3 = U8TO64_LE(key + 8); \
+ /* "somepseudorandomlygeneratedbytes" */ \
+ v0 ^= UINT64_C(0x736f6d6570736575); \
+ v1 ^= UINT64_C(0x646f72616e646f6d); \
+ v2 ^= UINT64_C(0x6c7967656e657261); \
+ v3 ^= UINT64_C(0x7465646279746573); \
+} while (0)
+
+PERL_STATIC_INLINE
+void S_perl_siphash_seed_state(const unsigned char * const seed_buf, unsigned char * state_buf) {
+ U64 *v= (U64*) state_buf;
+ SIPHASH_SEED_STATE(seed_buf, v[0],v[1],v[2],v[3]);
+}
+
+#define PERL_SIPHASH_FNC(FNC,SIP_ROUNDS,SIP_FINAL_ROUNDS) \
+PERL_STATIC_INLINE U32 \
+FNC ## _with_state \
+ (const unsigned char * const state, const unsigned char *in, const STRLEN inlen) \
+{ \
+ const int left = inlen & 7; \
+ const U8 *end = in + inlen - left; \
+ \
+ U64 b = ( ( U64 )(inlen) ) << 56; \
+ U64 m; \
+ U64 v0 = U8TO64_LE(state); \
+ U64 v1 = U8TO64_LE(state+8); \
+ U64 v2 = U8TO64_LE(state+16); \
+ U64 v3 = U8TO64_LE(state+24); \
+ \
+ for ( ; in != end; in += 8 ) \
+ { \
+ m = U8TO64_LE( in ); \
+ v3 ^= m; \
+ \
+ SIP_ROUNDS; \
+ \
+ v0 ^= m; \
+ } \
+ \
+ switch( left ) \
+ { \
+ case 7: b |= ( ( U64 )in[ 6] ) << 48; \
+ case 6: b |= ( ( U64 )in[ 5] ) << 40; \
+ case 5: b |= ( ( U64 )in[ 4] ) << 32; \
+ case 4: b |= ( ( U64 )in[ 3] ) << 24; \
+ case 3: b |= ( ( U64 )in[ 2] ) << 16; \
+ case 2: b |= ( ( U64 )in[ 1] ) << 8; \
+ case 1: b |= ( ( U64 )in[ 0] ); break; \
+ case 0: break; \
+ } \
+ \
+ v3 ^= b; \
+ \
+ SIP_ROUNDS; \
+ \
+ v0 ^= b; \
+ \
+ v2 ^= 0xff; \
+ \
+ SIP_FINAL_ROUNDS \
+ \
+ b = v0 ^ v1 ^ v2 ^ v3; \
+ return (U32)(b & U32_MAX); \
+} \
+ \
+PERL_STATIC_INLINE U32 \
+FNC (const unsigned char * const seed, const unsigned char *in, const STRLEN inlen) \
+{ \
+ U64 state[4]; \
+ SIPHASH_SEED_STATE(seed,state[0],state[1],state[2],state[3]); \
+ return FNC ## _with_state((U8*)state,in,inlen); \
+}
+
+
+PERL_SIPHASH_FNC(
+ S_perl_hash_siphash_1_3
+ ,SIPROUND;
+ ,SIPROUND;SIPROUND;SIPROUND;
+)
+
+PERL_SIPHASH_FNC(
+ S_perl_hash_siphash_2_4
+ ,SIPROUND;SIPROUND;
+ ,SIPROUND;SIPROUND;SIPROUND;SIPROUND;
+)
+#endif /* defined(CAN64BITHASH) */
+
--
2.11.0
|
The RT System itself - Status changed from 'new' to 'open' |
From @khwilliamsonIf the OP doesn't reply, I think we should move this to stalled, or go ahead and apply the patch |
Migrated from rt.perl.org#132999 (status was 'open')
Searchable as RT132999$
The text was updated successfully, but these errors were encountered: