mirror of
https://github.com/vlang/v.git
synced 2025-09-13 14:32:26 +03:00
thirdparty.zstd: upgrade to v1.5.7 release, add the local changes to a reusable .patch file (#24611)
This commit is contained in:
parent
b84512d408
commit
a1c5f41c6b
5 changed files with 311 additions and 330 deletions
33
thirdparty/zstd/fix.md
vendored
33
thirdparty/zstd/fix.md
vendored
|
@ -1,28 +1,9 @@
|
|||
1. replace all `abs64` with `zstd_abs64`.
|
||||
1. Get `zstd` from https://github.com/facebook/zstd/releases
|
||||
2. Download and extract `zstd`, and goto `zstd-1.5.7/build/single_file_libs/`, run `create_single_file_library.sh`
|
||||
3. Copy generated `zstd.c` to v's `thirdparty/zstd/zstd-1.5.7.c`
|
||||
4. In `thirdparty/zstd/`, apply patch by `patch -p0 -i zstd_v.patch -o zstd.c`
|
||||
5. Remove `zstd-1.5.7.c`
|
||||
|
||||
2. add following at header of the file:
|
||||
#if defined(__TINYC__)
|
||||
#if defined(_WIN32)
|
||||
#undef ZSTD_MULTITHREAD
|
||||
#define ZSTD_NO_INTRINSICS
|
||||
#endif
|
||||
#if defined(__arm__) || defined(__aarch64__)
|
||||
#define NO_PREFETCH
|
||||
#endif
|
||||
#endif
|
||||
|
||||
3. replace `qsort_r` with `qsort`, as there is no way detect __MUSL__ macro. add following at header of the file:
|
||||
#ifndef ZDICT_QSORT
|
||||
# if defined(__APPLE__)
|
||||
# define ZDICT_QSORT ZDICT_QSORT_APPLE /* uses qsort_r() with a different order for parameters */
|
||||
# elif defined(__GLIBC__)
|
||||
# define ZDICT_QSORT ZDICT_QSORT_GNU /* uses qsort_r() */
|
||||
# elif defined(_WIN32) && defined(_MSC_VER)
|
||||
# define ZDICT_QSORT ZDICT_QSORT_MSVC /* uses qsort_s() with a different order for parameters */
|
||||
# elif defined(STDC_LIB_EXT1) && (STDC_LIB_EXT1 > 0) /* C11 Annex K */
|
||||
# define ZDICT_QSORT ZDICT_QSORT_C11 /* uses qsort_s() */
|
||||
# else
|
||||
# define ZDICT_QSORT ZDICT_QSORT_C90 /* uses standard qsort() which is not re-entrant (requires global variable) */
|
||||
# endif
|
||||
#endif
|
||||
You can generate a new patch by `diff -u zstd-1.5.7.c zstd_modified.c > zstd_custom.patch`
|
||||
|
||||
BTW, patch is between `/* >> v_patch start */` and `/* << v_patch end */` mostly.
|
||||
|
|
513
thirdparty/zstd/zstd.c
vendored
513
thirdparty/zstd/zstd.c
vendored
File diff suppressed because it is too large
Load diff
87
thirdparty/zstd/zstd_v.patch
vendored
Normal file
87
thirdparty/zstd/zstd_v.patch
vendored
Normal file
|
@ -0,0 +1,87 @@
|
|||
--- zstd-1.5.7.c 2025-05-30 16:39:46.374765970 +0800
|
||||
+++ zstd.c 2025-05-30 21:02:30.710831777 +0800
|
||||
@@ -50,6 +50,27 @@
|
||||
/* TODO: Can't amalgamate ASM function */
|
||||
#define ZSTD_DISABLE_ASM 1
|
||||
|
||||
+/* >> v_patch start */
|
||||
+#if defined(__TINYC__)
|
||||
+
|
||||
+#if defined(_WIN32)
|
||||
+#undef ZSTD_MULTITHREAD
|
||||
+#define ZSTD_NO_INTRINSICS
|
||||
+#endif
|
||||
+
|
||||
+/* tcc doesn't support ARM asm */
|
||||
+#if defined(__arm__) || defined(__aarch64__)
|
||||
+#define NO_PREFETCH
|
||||
+#endif
|
||||
+
|
||||
+#if defined(__FreeBSD__) || defined(__OpenBSD__)
|
||||
+/* tcc on FreeBSD/OpenBSD define __GNUC__, but it can't work here */
|
||||
+#undef __GNUC__
|
||||
+#endif
|
||||
+
|
||||
+#endif /* __TINYC__ */
|
||||
+/* << v_patch end */
|
||||
+
|
||||
/* Include zstd_deps.h first with all the options we need enabled. */
|
||||
#define ZSTD_DEPS_NEED_MALLOC
|
||||
#define ZSTD_DEPS_NEED_MATH64
|
||||
@@ -22353,7 +22374,7 @@
|
||||
ZSTD_GEN_RECORD_FINGERPRINT(43, 8)
|
||||
|
||||
|
||||
-static U64 abs64(S64 s64) { return (U64)((s64 < 0) ? -s64 : s64); }
|
||||
+static U64 zstd_abs64(S64 s64) { return (U64)((s64 < 0) ? -s64 : s64); }
|
||||
|
||||
static U64 fpDistance(const Fingerprint* fp1, const Fingerprint* fp2, unsigned hashLog)
|
||||
{
|
||||
@@ -22362,7 +22383,7 @@
|
||||
assert(hashLog <= HASHLOG_MAX);
|
||||
for (n = 0; n < ((size_t)1 << hashLog); n++) {
|
||||
distance +=
|
||||
- abs64((S64)fp1->events[n] * (S64)fp2->nbEvents - (S64)fp2->events[n] * (S64)fp1->nbEvents);
|
||||
+ zstd_abs64((S64)fp1->events[n] * (S64)fp2->nbEvents - (S64)fp2->events[n] * (S64)fp1->nbEvents);
|
||||
}
|
||||
return distance;
|
||||
}
|
||||
@@ -22482,7 +22503,7 @@
|
||||
{ U64 const distFromBegin = fpDistance(&fpstats->pastEvents, middleEvents, 8);
|
||||
U64 const distFromEnd = fpDistance(&fpstats->newEvents, middleEvents, 8);
|
||||
U64 const minDistance = SEGMENT_SIZE * SEGMENT_SIZE / 3;
|
||||
- if (abs64((S64)distFromBegin - (S64)distFromEnd) < minDistance)
|
||||
+ if (zstd_abs64((S64)distFromBegin - (S64)distFromEnd) < minDistance)
|
||||
return 64 KB;
|
||||
return (distFromBegin > distFromEnd) ? 32 KB : 96 KB;
|
||||
}
|
||||
@@ -47318,8 +47339,9 @@
|
||||
unsigned d;
|
||||
} COVER_ctx_t;
|
||||
|
||||
-#if !defined(_GNU_SOURCE) && !defined(__APPLE__) && !defined(_MSC_VER)
|
||||
-/* C90 only offers qsort() that needs a global context. */
|
||||
+#if defined(ZSTD_USE_C90_QSORT) \
|
||||
+ || (!defined(_GNU_SOURCE) && !defined(__APPLE__) && !defined(_MSC_VER))
|
||||
+/* Use global context for non-reentrant sort functions */
|
||||
static COVER_ctx_t *g_coverCtx = NULL;
|
||||
#endif
|
||||
|
||||
@@ -47405,7 +47427,7 @@
|
||||
qsort_r(ctx->suffix, ctx->suffixSize, sizeof(U32),
|
||||
ctx,
|
||||
(ctx->d <= 8 ? &COVER_strict_cmp8 : &COVER_strict_cmp));
|
||||
-#elif defined(_GNU_SOURCE)
|
||||
+#elif defined(_GNU_SOURCE) && !defined(ZSTD_USE_C90_QSORT)
|
||||
qsort_r(ctx->suffix, ctx->suffixSize, sizeof(U32),
|
||||
(ctx->d <= 8 ? &COVER_strict_cmp8 : &COVER_strict_cmp),
|
||||
ctx);
|
||||
@@ -47419,7 +47441,7 @@
|
||||
(ctx->d <= 8 ? &COVER_strict_cmp8 : &COVER_strict_cmp));
|
||||
#else /* C90 fallback.*/
|
||||
g_coverCtx = ctx;
|
||||
- /* TODO(cavalcanti): implement a reentrant qsort() when is not available. */
|
||||
+ /* TODO(cavalcanti): implement a reentrant qsort() when _r is not available. */
|
||||
qsort(ctx->suffix, ctx->suffixSize, sizeof(U32),
|
||||
(ctx->d <= 8 ? &COVER_strict_cmp8 : &COVER_strict_cmp));
|
||||
#endif
|
|
@ -365,7 +365,7 @@ pub fn version_number() u32 {
|
|||
return C.ZSTD_versionNumber()
|
||||
}
|
||||
|
||||
// version_string returns runtime library version, like "1.5.8".
|
||||
// version_string returns runtime library version, like "1.5.7".
|
||||
pub fn version_string() string {
|
||||
return unsafe { tos_clone(C.ZSTD_versionString()) }
|
||||
}
|
||||
|
|
4
vlib/compress/zstd/zstd_d_musl.c.v
Normal file
4
vlib/compress/zstd/zstd_d_musl.c.v
Normal file
|
@ -0,0 +1,4 @@
|
|||
module zstd
|
||||
|
||||
// As MUSL has no `qsort_r()` as GLIBC, so fallback to `qsort()`
|
||||
#flag -DZSTD_USE_C90_QSORT
|
Loading…
Add table
Add a link
Reference in a new issue