From c3e587a1ca34e86c63e72e3adb2500cb181a386e Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Tue, 21 Jan 2025 14:53:24 -0800 Subject: [PATCH 1/2] attempt to silence a recent ubsan warning with code reorganization apparently, UBSAN uses the prototype of the inner inlined function instead of the outer shell of the function. Let's see if one indirection level is enough to fix this. --- xxhash.h | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/xxhash.h b/xxhash.h index 812dcb01..9f5eef77 100644 --- a/xxhash.h +++ b/xxhash.h @@ -6523,8 +6523,9 @@ XXH3_consumeStripes(xxh_u64* XXH_RESTRICT acc, # define XXH3_STREAM_USE_STACK 1 # endif #endif -/* - * Both XXH3_64bits_update and XXH3_128bits_update use this routine. +/* This function accepts f_acc and f_scramble as function pointers, + * making it possible to implement multiple variants with different acc & scramble stages. + * This is notably useful to implement multiple vector variants with different intrinsics. */ XXH_FORCE_INLINE XXH_errorcode XXH3_update(XXH3_state_t* XXH_RESTRICT const state, @@ -6605,12 +6606,21 @@ XXH3_update(XXH3_state_t* XXH_RESTRICT const state, return XXH_OK; } +/* + * Both XXH3_64bits_update and XXH3_128bits_update use this routine. + */ +XXH_NO_INLINE XXH_errorcode +XXH3_update_regular(XXH_NOESCAPE XXH3_state_t* state, XXH_NOESCAPE const void* input, size_t len) +{ + return XXH3_update(state, (const xxh_u8*)input, len, + XXH3_accumulate, XXH3_scrambleAcc); +} + /*! @ingroup XXH3_family */ XXH_PUBLIC_API XXH_errorcode XXH3_64bits_update(XXH_NOESCAPE XXH3_state_t* state, XXH_NOESCAPE const void* input, size_t len) { - return XXH3_update(state, (const xxh_u8*)input, len, - XXH3_accumulate, XXH3_scrambleAcc); + return XXH3_update_regular(state, input, len); } @@ -7146,7 +7156,7 @@ XXH3_128bits_reset_withSecretandSeed(XXH_NOESCAPE XXH3_state_t* statePtr, XXH_NO XXH_PUBLIC_API XXH_errorcode XXH3_128bits_update(XXH_NOESCAPE XXH3_state_t* state, XXH_NOESCAPE const void* input, size_t len) { - return XXH3_64bits_update(state, input, len); + return XXH3_update_regular(state, input, len); } /*! @ingroup XXH3_family */ From 71e797bd8c5409bf818ed0187105296aa94cb535 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Tue, 21 Jan 2025 20:34:45 -0800 Subject: [PATCH 2/2] add XXH_NOESCAPE --- cli/xsum_sanity_check.c | 2 +- xxh_x86dispatch.c | 2 +- xxhash.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cli/xsum_sanity_check.c b/cli/xsum_sanity_check.c index 98014d59..95e5375e 100644 --- a/cli/xsum_sanity_check.c +++ b/cli/xsum_sanity_check.c @@ -342,7 +342,7 @@ static XSUM_U32 XSUM_rand(void) * Technically, XXH3_64bits_update is identical to XXH3_128bits_update as of * v0.8.0, but we treat them as separate. */ -typedef XXH_errorcode (*XSUM_XXH3_update_t)(XXH3_state_t* state, const void* input, size_t length); +typedef XXH_errorcode (*XSUM_XXH3_update_t)(XXH_NOESCAPE XXH3_state_t* state, XXH_NOESCAPE const void* input, size_t length); /* * Runs the passed XXH3_update variant on random lengths. This is to test the diff --git a/xxh_x86dispatch.c b/xxh_x86dispatch.c index 03e7dc41..0c158200 100644 --- a/xxh_x86dispatch.c +++ b/xxh_x86dispatch.c @@ -632,7 +632,7 @@ typedef XXH128_hash_t (*XXH3_dispatchx86_hashLong128_default)(XXH_NOESCAPE const typedef XXH128_hash_t (*XXH3_dispatchx86_hashLong128_withSeed)(XXH_NOESCAPE const void* XXH_RESTRICT, size_t, XXH64_hash_t); -typedef XXH128_hash_t (*XXH3_dispatchx86_hashLong128_withSecret)(XXH_NOESCAPE const void* XXH_RESTRICT, size_t, const void* XXH_RESTRICT, size_t); +typedef XXH128_hash_t (*XXH3_dispatchx86_hashLong128_withSecret)(XXH_NOESCAPE const void* XXH_RESTRICT, size_t, XXH_NOESCAPE const void* XXH_RESTRICT, size_t); typedef struct { XXH3_dispatchx86_hashLong128_default hashLong128_default; diff --git a/xxhash.h b/xxhash.h index 9f5eef77..95ae101a 100644 --- a/xxhash.h +++ b/xxhash.h @@ -1363,7 +1363,7 @@ XXH_PUBLIC_API XXH_errorcode XXH3_64bits_update (XXH_NOESCAPE XXH3_state_t* stat * * @see @ref streaming_example "Streaming Example" */ -XXH_PUBLIC_API XXH_PUREF XXH64_hash_t XXH3_64bits_digest (XXH_NOESCAPE const XXH3_state_t* statePtr); +XXH_PUBLIC_API XXH_PUREF XXH64_hash_t XXH3_64bits_digest (XXH_NOESCAPE const XXH3_state_t* statePtr); #endif /* !XXH_NO_STREAM */ /* note : canonical representation of XXH3 is the same as XXH64