extzstd 0.3.2 → 0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +4 -3
  3. data/contrib/zstd/CHANGELOG +225 -1
  4. data/contrib/zstd/CONTRIBUTING.md +158 -75
  5. data/contrib/zstd/LICENSE +4 -4
  6. data/contrib/zstd/Makefile +106 -69
  7. data/contrib/zstd/Package.swift +36 -0
  8. data/contrib/zstd/README.md +64 -36
  9. data/contrib/zstd/SECURITY.md +15 -0
  10. data/contrib/zstd/TESTING.md +2 -3
  11. data/contrib/zstd/lib/BUCK +5 -7
  12. data/contrib/zstd/lib/Makefile +117 -199
  13. data/contrib/zstd/lib/README.md +37 -7
  14. data/contrib/zstd/lib/common/allocations.h +55 -0
  15. data/contrib/zstd/lib/common/bits.h +200 -0
  16. data/contrib/zstd/lib/common/bitstream.h +80 -86
  17. data/contrib/zstd/lib/common/compiler.h +225 -63
  18. data/contrib/zstd/lib/common/cpu.h +37 -1
  19. data/contrib/zstd/lib/common/debug.c +7 -1
  20. data/contrib/zstd/lib/common/debug.h +21 -12
  21. data/contrib/zstd/lib/common/entropy_common.c +15 -37
  22. data/contrib/zstd/lib/common/error_private.c +9 -2
  23. data/contrib/zstd/lib/common/error_private.h +93 -5
  24. data/contrib/zstd/lib/common/fse.h +12 -87
  25. data/contrib/zstd/lib/common/fse_decompress.c +37 -117
  26. data/contrib/zstd/lib/common/huf.h +97 -172
  27. data/contrib/zstd/lib/common/mem.h +58 -58
  28. data/contrib/zstd/lib/common/pool.c +38 -17
  29. data/contrib/zstd/lib/common/pool.h +10 -4
  30. data/contrib/zstd/lib/common/portability_macros.h +158 -0
  31. data/contrib/zstd/lib/common/threading.c +74 -14
  32. data/contrib/zstd/lib/common/threading.h +5 -10
  33. data/contrib/zstd/lib/common/xxhash.c +6 -814
  34. data/contrib/zstd/lib/common/xxhash.h +6930 -195
  35. data/contrib/zstd/lib/common/zstd_common.c +1 -36
  36. data/contrib/zstd/lib/common/zstd_deps.h +1 -1
  37. data/contrib/zstd/lib/common/zstd_internal.h +68 -154
  38. data/contrib/zstd/lib/common/zstd_trace.h +163 -0
  39. data/contrib/zstd/lib/compress/clevels.h +134 -0
  40. data/contrib/zstd/lib/compress/fse_compress.c +75 -155
  41. data/contrib/zstd/lib/compress/hist.c +1 -1
  42. data/contrib/zstd/lib/compress/hist.h +1 -1
  43. data/contrib/zstd/lib/compress/huf_compress.c +810 -259
  44. data/contrib/zstd/lib/compress/zstd_compress.c +2864 -919
  45. data/contrib/zstd/lib/compress/zstd_compress_internal.h +523 -192
  46. data/contrib/zstd/lib/compress/zstd_compress_literals.c +117 -40
  47. data/contrib/zstd/lib/compress/zstd_compress_literals.h +16 -6
  48. data/contrib/zstd/lib/compress/zstd_compress_sequences.c +28 -19
  49. data/contrib/zstd/lib/compress/zstd_compress_sequences.h +1 -1
  50. data/contrib/zstd/lib/compress/zstd_compress_superblock.c +251 -412
  51. data/contrib/zstd/lib/compress/zstd_compress_superblock.h +1 -1
  52. data/contrib/zstd/lib/compress/zstd_cwksp.h +284 -97
  53. data/contrib/zstd/lib/compress/zstd_double_fast.c +382 -133
  54. data/contrib/zstd/lib/compress/zstd_double_fast.h +14 -2
  55. data/contrib/zstd/lib/compress/zstd_fast.c +732 -260
  56. data/contrib/zstd/lib/compress/zstd_fast.h +3 -2
  57. data/contrib/zstd/lib/compress/zstd_lazy.c +1177 -390
  58. data/contrib/zstd/lib/compress/zstd_lazy.h +129 -14
  59. data/contrib/zstd/lib/compress/zstd_ldm.c +280 -210
  60. data/contrib/zstd/lib/compress/zstd_ldm.h +3 -2
  61. data/contrib/zstd/lib/compress/zstd_ldm_geartab.h +106 -0
  62. data/contrib/zstd/lib/compress/zstd_opt.c +516 -285
  63. data/contrib/zstd/lib/compress/zstd_opt.h +32 -8
  64. data/contrib/zstd/lib/compress/zstdmt_compress.c +202 -131
  65. data/contrib/zstd/lib/compress/zstdmt_compress.h +9 -6
  66. data/contrib/zstd/lib/decompress/huf_decompress.c +1149 -555
  67. data/contrib/zstd/lib/decompress/huf_decompress_amd64.S +595 -0
  68. data/contrib/zstd/lib/decompress/zstd_ddict.c +4 -4
  69. data/contrib/zstd/lib/decompress/zstd_ddict.h +1 -1
  70. data/contrib/zstd/lib/decompress/zstd_decompress.c +583 -106
  71. data/contrib/zstd/lib/decompress/zstd_decompress_block.c +1054 -379
  72. data/contrib/zstd/lib/decompress/zstd_decompress_block.h +14 -3
  73. data/contrib/zstd/lib/decompress/zstd_decompress_internal.h +56 -6
  74. data/contrib/zstd/lib/deprecated/zbuff.h +1 -1
  75. data/contrib/zstd/lib/deprecated/zbuff_common.c +1 -1
  76. data/contrib/zstd/lib/deprecated/zbuff_compress.c +24 -4
  77. data/contrib/zstd/lib/deprecated/zbuff_decompress.c +3 -1
  78. data/contrib/zstd/lib/dictBuilder/cover.c +60 -44
  79. data/contrib/zstd/lib/dictBuilder/cover.h +6 -11
  80. data/contrib/zstd/lib/dictBuilder/divsufsort.c +1 -1
  81. data/contrib/zstd/lib/dictBuilder/fastcover.c +26 -18
  82. data/contrib/zstd/lib/dictBuilder/zdict.c +100 -101
  83. data/contrib/zstd/lib/legacy/zstd_legacy.h +38 -1
  84. data/contrib/zstd/lib/legacy/zstd_v01.c +18 -53
  85. data/contrib/zstd/lib/legacy/zstd_v01.h +1 -1
  86. data/contrib/zstd/lib/legacy/zstd_v02.c +28 -85
  87. data/contrib/zstd/lib/legacy/zstd_v02.h +1 -1
  88. data/contrib/zstd/lib/legacy/zstd_v03.c +29 -88
  89. data/contrib/zstd/lib/legacy/zstd_v03.h +1 -1
  90. data/contrib/zstd/lib/legacy/zstd_v04.c +27 -80
  91. data/contrib/zstd/lib/legacy/zstd_v04.h +1 -1
  92. data/contrib/zstd/lib/legacy/zstd_v05.c +36 -85
  93. data/contrib/zstd/lib/legacy/zstd_v05.h +1 -1
  94. data/contrib/zstd/lib/legacy/zstd_v06.c +44 -96
  95. data/contrib/zstd/lib/legacy/zstd_v06.h +1 -1
  96. data/contrib/zstd/lib/legacy/zstd_v07.c +37 -92
  97. data/contrib/zstd/lib/legacy/zstd_v07.h +1 -1
  98. data/contrib/zstd/lib/libzstd.mk +237 -0
  99. data/contrib/zstd/lib/libzstd.pc.in +4 -3
  100. data/contrib/zstd/lib/module.modulemap +35 -0
  101. data/contrib/zstd/lib/{dictBuilder/zdict.h → zdict.h} +202 -33
  102. data/contrib/zstd/lib/zstd.h +1030 -332
  103. data/contrib/zstd/lib/{common/zstd_errors.h → zstd_errors.h} +27 -8
  104. data/ext/extconf.rb +26 -7
  105. data/ext/extzstd.c +51 -24
  106. data/ext/extzstd.h +33 -6
  107. data/ext/extzstd_stream.c +74 -31
  108. data/ext/libzstd_conf.h +0 -1
  109. data/ext/zstd_decompress_asm.S +1 -0
  110. metadata +17 -7
  111. data/contrib/zstd/appveyor.yml +0 -292
  112. data/ext/depend +0 -2
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (c) 2016-2020, Yann Collet, Facebook, Inc.
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
3
  * All rights reserved.
4
4
  *
5
5
  * This source code is licensed under both the BSD-style license (found in the
@@ -14,7 +14,6 @@
14
14
  * Dependencies
15
15
  ***************************************/
16
16
  #define ZSTD_DEPS_NEED_MALLOC
17
- #include "zstd_deps.h" /* ZSTD_malloc, ZSTD_calloc, ZSTD_free, ZSTD_memset */
18
17
  #include "error_private.h"
19
18
  #include "zstd_internal.h"
20
19
 
@@ -47,37 +46,3 @@ ZSTD_ErrorCode ZSTD_getErrorCode(size_t code) { return ERR_getErrorCode(code); }
47
46
  /*! ZSTD_getErrorString() :
48
47
  * provides error code string from enum */
49
48
  const char* ZSTD_getErrorString(ZSTD_ErrorCode code) { return ERR_getErrorString(code); }
50
-
51
-
52
-
53
- /*=**************************************************************
54
- * Custom allocator
55
- ****************************************************************/
56
- void* ZSTD_customMalloc(size_t size, ZSTD_customMem customMem)
57
- {
58
- if (customMem.customAlloc)
59
- return customMem.customAlloc(customMem.opaque, size);
60
- return ZSTD_malloc(size);
61
- }
62
-
63
- void* ZSTD_customCalloc(size_t size, ZSTD_customMem customMem)
64
- {
65
- if (customMem.customAlloc) {
66
- /* calloc implemented as malloc+memset;
67
- * not as efficient as calloc, but next best guess for custom malloc */
68
- void* const ptr = customMem.customAlloc(customMem.opaque, size);
69
- ZSTD_memset(ptr, 0, size);
70
- return ptr;
71
- }
72
- return ZSTD_calloc(1, size);
73
- }
74
-
75
- void ZSTD_customFree(void* ptr, ZSTD_customMem customMem)
76
- {
77
- if (ptr!=NULL) {
78
- if (customMem.customFree)
79
- customMem.customFree(customMem.opaque, ptr);
80
- else
81
- ZSTD_free(ptr);
82
- }
83
- }
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (c) 2016-2020, Facebook, Inc.
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
3
  * All rights reserved.
4
4
  *
5
5
  * This source code is licensed under both the BSD-style license (found in the
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (c) 2016-2020, Yann Collet, Facebook, Inc.
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
3
  * All rights reserved.
4
4
  *
5
5
  * This source code is licensed under both the BSD-style license (found in the
@@ -19,10 +19,8 @@
19
19
  /*-*************************************
20
20
  * Dependencies
21
21
  ***************************************/
22
- #if !defined(ZSTD_NO_INTRINSICS) && defined(__ARM_NEON)
23
- #include <arm_neon.h>
24
- #endif
25
22
  #include "compiler.h"
23
+ #include "cpu.h"
26
24
  #include "mem.h"
27
25
  #include "debug.h" /* assert, DEBUGLOG, RAWLOG, g_debuglevel */
28
26
  #include "error_private.h"
@@ -30,12 +28,16 @@
30
28
  #include "../zstd.h"
31
29
  #define FSE_STATIC_LINKING_ONLY
32
30
  #include "fse.h"
33
- #define HUF_STATIC_LINKING_ONLY
34
31
  #include "huf.h"
35
32
  #ifndef XXH_STATIC_LINKING_ONLY
36
33
  # define XXH_STATIC_LINKING_ONLY /* XXH64_state_t */
37
34
  #endif
38
35
  #include "xxhash.h" /* XXH_reset, update, digest */
36
+ #ifndef ZSTD_NO_TRACE
37
+ # include "zstd_trace.h"
38
+ #else
39
+ # define ZSTD_TRACE 0
40
+ #endif
39
41
 
40
42
  #if defined (__cplusplus)
41
43
  extern "C" {
@@ -55,81 +57,7 @@ extern "C" {
55
57
  #undef MAX
56
58
  #define MIN(a,b) ((a)<(b) ? (a) : (b))
57
59
  #define MAX(a,b) ((a)>(b) ? (a) : (b))
58
-
59
- /**
60
- * Ignore: this is an internal helper.
61
- *
62
- * This is a helper function to help force C99-correctness during compilation.
63
- * Under strict compilation modes, variadic macro arguments can't be empty.
64
- * However, variadic function arguments can be. Using a function therefore lets
65
- * us statically check that at least one (string) argument was passed,
66
- * independent of the compilation flags.
67
- */
68
- static INLINE_KEYWORD UNUSED_ATTR
69
- void _force_has_format_string(const char *format, ...) {
70
- (void)format;
71
- }
72
-
73
- /**
74
- * Ignore: this is an internal helper.
75
- *
76
- * We want to force this function invocation to be syntactically correct, but
77
- * we don't want to force runtime evaluation of its arguments.
78
- */
79
- #define _FORCE_HAS_FORMAT_STRING(...) \
80
- if (0) { \
81
- _force_has_format_string(__VA_ARGS__); \
82
- }
83
-
84
- /**
85
- * Return the specified error if the condition evaluates to true.
86
- *
87
- * In debug modes, prints additional information.
88
- * In order to do that (particularly, printing the conditional that failed),
89
- * this can't just wrap RETURN_ERROR().
90
- */
91
- #define RETURN_ERROR_IF(cond, err, ...) \
92
- if (cond) { \
93
- RAWLOG(3, "%s:%d: ERROR!: check %s failed, returning %s", \
94
- __FILE__, __LINE__, ZSTD_QUOTE(cond), ZSTD_QUOTE(ERROR(err))); \
95
- _FORCE_HAS_FORMAT_STRING(__VA_ARGS__); \
96
- RAWLOG(3, ": " __VA_ARGS__); \
97
- RAWLOG(3, "\n"); \
98
- return ERROR(err); \
99
- }
100
-
101
- /**
102
- * Unconditionally return the specified error.
103
- *
104
- * In debug modes, prints additional information.
105
- */
106
- #define RETURN_ERROR(err, ...) \
107
- do { \
108
- RAWLOG(3, "%s:%d: ERROR!: unconditional check failed, returning %s", \
109
- __FILE__, __LINE__, ZSTD_QUOTE(ERROR(err))); \
110
- _FORCE_HAS_FORMAT_STRING(__VA_ARGS__); \
111
- RAWLOG(3, ": " __VA_ARGS__); \
112
- RAWLOG(3, "\n"); \
113
- return ERROR(err); \
114
- } while(0);
115
-
116
- /**
117
- * If the provided expression evaluates to an error code, returns that error code.
118
- *
119
- * In debug modes, prints additional information.
120
- */
121
- #define FORWARD_IF_ERROR(err, ...) \
122
- do { \
123
- size_t const err_code = (err); \
124
- if (ERR_isError(err_code)) { \
125
- RAWLOG(3, "%s:%d: ERROR!: forwarding error in %s: %s", \
126
- __FILE__, __LINE__, ZSTD_QUOTE(err), ERR_getErrorName(err_code)); \
127
- _FORCE_HAS_FORMAT_STRING(__VA_ARGS__); \
128
- RAWLOG(3, ": " __VA_ARGS__); \
129
- RAWLOG(3, "\n"); \
130
- return err_code; \
131
- } \
132
- } while(0);
60
+ #define BOUNDED(min,val,max) (MAX(min,MIN(val,max)))
133
61
 
134
62
 
135
63
  /*-*************************************
@@ -138,7 +66,6 @@ void _force_has_format_string(const char *format, ...) {
138
66
  #define ZSTD_OPT_NUM (1<<12)
139
67
 
140
68
  #define ZSTD_REP_NUM 3 /* number of repcodes */
141
- #define ZSTD_REP_MOVE (ZSTD_REP_NUM-1)
142
69
  static UNUSED_ATTR const U32 repStartValue[ZSTD_REP_NUM] = { 1, 4, 8 };
143
70
 
144
71
  #define KB *(1 <<10)
@@ -165,9 +92,9 @@ typedef enum { bt_raw, bt_rle, bt_compressed, bt_reserved } blockType_e;
165
92
  #define ZSTD_FRAMECHECKSUMSIZE 4
166
93
 
167
94
  #define MIN_SEQUENCES_SIZE 1 /* nbSeq==0 */
168
- #define MIN_CBLOCK_SIZE (1 /*litCSize*/ + 1 /* RLE or RAW */ + MIN_SEQUENCES_SIZE /* nbSeq==0 */) /* for a non-null block */
95
+ #define MIN_CBLOCK_SIZE (1 /*litCSize*/ + 1 /* RLE or RAW */) /* for a non-null block */
96
+ #define MIN_LITERALS_FOR_4_STREAMS 6
169
97
 
170
- #define HufLog 12
171
98
  typedef enum { set_basic, set_rle, set_compressed, set_repeat } symbolEncodingType_e;
172
99
 
173
100
  #define LONGNBSEQ 0x7F00
@@ -175,6 +102,7 @@ typedef enum { set_basic, set_rle, set_compressed, set_repeat } symbolEncodingTy
175
102
  #define MINMATCH 3
176
103
 
177
104
  #define Litbits 8
105
+ #define LitHufLog 11
178
106
  #define MaxLit ((1<<Litbits) - 1)
179
107
  #define MaxML 52
180
108
  #define MaxLL 35
@@ -185,12 +113,14 @@ typedef enum { set_basic, set_rle, set_compressed, set_repeat } symbolEncodingTy
185
113
  #define LLFSELog 9
186
114
  #define OffFSELog 8
187
115
  #define MaxFSELog MAX(MAX(MLFSELog, LLFSELog), OffFSELog)
116
+ #define MaxMLBits 16
117
+ #define MaxLLBits 16
188
118
 
189
119
  #define ZSTD_MAX_HUF_HEADER_SIZE 128 /* header + <= 127 byte tree description */
190
120
  /* Each table cannot take more than #symbols * FSELog bits */
191
121
  #define ZSTD_MAX_FSE_HEADERS_SIZE (((MaxML + 1) * MLFSELog + (MaxLL + 1) * LLFSELog + (MaxOff + 1) * OffFSELog + 7) / 8)
192
122
 
193
- static UNUSED_ATTR const U32 LL_bits[MaxLL+1] = {
123
+ static UNUSED_ATTR const U8 LL_bits[MaxLL+1] = {
194
124
  0, 0, 0, 0, 0, 0, 0, 0,
195
125
  0, 0, 0, 0, 0, 0, 0, 0,
196
126
  1, 1, 1, 1, 2, 2, 3, 3,
@@ -207,7 +137,7 @@ static UNUSED_ATTR const S16 LL_defaultNorm[MaxLL+1] = {
207
137
  #define LL_DEFAULTNORMLOG 6 /* for static allocation */
208
138
  static UNUSED_ATTR const U32 LL_defaultNormLog = LL_DEFAULTNORMLOG;
209
139
 
210
- static UNUSED_ATTR const U32 ML_bits[MaxML+1] = {
140
+ static UNUSED_ATTR const U8 ML_bits[MaxML+1] = {
211
141
  0, 0, 0, 0, 0, 0, 0, 0,
212
142
  0, 0, 0, 0, 0, 0, 0, 0,
213
143
  0, 0, 0, 0, 0, 0, 0, 0,
@@ -242,22 +172,33 @@ static UNUSED_ATTR const U32 OF_defaultNormLog = OF_DEFAULTNORMLOG;
242
172
  * Shared functions to include for inlining
243
173
  *********************************************/
244
174
  static void ZSTD_copy8(void* dst, const void* src) {
245
- #if !defined(ZSTD_NO_INTRINSICS) && defined(__ARM_NEON)
175
+ #if defined(ZSTD_ARCH_ARM_NEON)
246
176
  vst1_u8((uint8_t*)dst, vld1_u8((const uint8_t*)src));
247
177
  #else
248
178
  ZSTD_memcpy(dst, src, 8);
249
179
  #endif
250
180
  }
181
+ #define COPY8(d,s) do { ZSTD_copy8(d,s); d+=8; s+=8; } while (0)
251
182
 
252
- #define COPY8(d,s) { ZSTD_copy8(d,s); d+=8; s+=8; }
183
+ /* Need to use memmove here since the literal buffer can now be located within
184
+ the dst buffer. In circumstances where the op "catches up" to where the
185
+ literal buffer is, there can be partial overlaps in this call on the final
186
+ copy if the literal is being shifted by less than 16 bytes. */
253
187
  static void ZSTD_copy16(void* dst, const void* src) {
254
- #if !defined(ZSTD_NO_INTRINSICS) && defined(__ARM_NEON)
188
+ #if defined(ZSTD_ARCH_ARM_NEON)
255
189
  vst1q_u8((uint8_t*)dst, vld1q_u8((const uint8_t*)src));
190
+ #elif defined(ZSTD_ARCH_X86_SSE2)
191
+ _mm_storeu_si128((__m128i*)dst, _mm_loadu_si128((const __m128i*)src));
192
+ #elif defined(__clang__)
193
+ ZSTD_memmove(dst, src, 16);
256
194
  #else
257
- ZSTD_memcpy(dst, src, 16);
195
+ /* ZSTD_memmove is not inlined properly by gcc */
196
+ BYTE copy16_buf[16];
197
+ ZSTD_memcpy(copy16_buf, src, 16);
198
+ ZSTD_memcpy(dst, copy16_buf, 16);
258
199
  #endif
259
200
  }
260
- #define COPY16(d,s) { ZSTD_copy16(d,s); d+=16; s+=16; }
201
+ #define COPY16(d,s) do { ZSTD_copy16(d,s); d+=16; s+=16; } while (0)
261
202
 
262
203
  #define WILDCOPY_OVERLENGTH 32
263
204
  #define WILDCOPY_VECLEN 16
@@ -283,12 +224,10 @@ void ZSTD_wildcopy(void* dst, const void* src, ptrdiff_t length, ZSTD_overlap_e
283
224
  BYTE* op = (BYTE*)dst;
284
225
  BYTE* const oend = op + length;
285
226
 
286
- assert(diff >= 8 || (ovtype == ZSTD_no_overlap && diff <= -WILDCOPY_VECLEN));
287
-
288
227
  if (ovtype == ZSTD_overlap_src_before_dst && diff < WILDCOPY_VECLEN) {
289
228
  /* Handle short offset copies. */
290
229
  do {
291
- COPY8(op, ip)
230
+ COPY8(op, ip);
292
231
  } while (op < oend);
293
232
  } else {
294
233
  assert(diff >= WILDCOPY_VECLEN || diff <= -WILDCOPY_VECLEN);
@@ -298,12 +237,6 @@ void ZSTD_wildcopy(void* dst, const void* src, ptrdiff_t length, ZSTD_overlap_e
298
237
  * one COPY16() in the first call. Then, do two calls per loop since
299
238
  * at that point it is more likely to have a high trip count.
300
239
  */
301
- #ifdef __aarch64__
302
- do {
303
- COPY16(op, ip);
304
- }
305
- while (op < oend);
306
- #else
307
240
  ZSTD_copy16(op, ip);
308
241
  if (16 >= length) return;
309
242
  op += 16;
@@ -313,7 +246,6 @@ void ZSTD_wildcopy(void* dst, const void* src, ptrdiff_t length, ZSTD_overlap_e
313
246
  COPY16(op, ip);
314
247
  }
315
248
  while (op < oend);
316
- #endif
317
249
  }
318
250
  }
319
251
 
@@ -347,28 +279,35 @@ typedef enum {
347
279
  * Private declarations
348
280
  *********************************************/
349
281
  typedef struct seqDef_s {
350
- U32 offset; /* Offset code of the sequence */
282
+ U32 offBase; /* offBase == Offset + ZSTD_REP_NUM, or repcode 1,2,3 */
351
283
  U16 litLength;
352
- U16 matchLength;
284
+ U16 mlBase; /* mlBase == matchLength - MINMATCH */
353
285
  } seqDef;
354
286
 
287
+ /* Controls whether seqStore has a single "long" litLength or matchLength. See seqStore_t. */
288
+ typedef enum {
289
+ ZSTD_llt_none = 0, /* no longLengthType */
290
+ ZSTD_llt_literalLength = 1, /* represents a long literal */
291
+ ZSTD_llt_matchLength = 2 /* represents a long match */
292
+ } ZSTD_longLengthType_e;
293
+
355
294
  typedef struct {
356
295
  seqDef* sequencesStart;
357
296
  seqDef* sequences; /* ptr to end of sequences */
358
- BYTE* litStart;
359
- BYTE* lit; /* ptr to end of literals */
360
- BYTE* llCode;
361
- BYTE* mlCode;
362
- BYTE* ofCode;
297
+ BYTE* litStart;
298
+ BYTE* lit; /* ptr to end of literals */
299
+ BYTE* llCode;
300
+ BYTE* mlCode;
301
+ BYTE* ofCode;
363
302
  size_t maxNbSeq;
364
303
  size_t maxNbLit;
365
304
 
366
- /* longLengthPos and longLengthID to allow us to represent either a single litLength or matchLength
305
+ /* longLengthPos and longLengthType to allow us to represent either a single litLength or matchLength
367
306
  * in the seqStore that has a value larger than U16 (if it exists). To do so, we increment
368
- * the existing value of the litLength or matchLength by 0x10000.
307
+ * the existing value of the litLength or matchLength by 0x10000.
369
308
  */
370
- U32 longLengthID; /* 0 == no longLength; 1 == Represent the long literal; 2 == Represent the long match; */
371
- U32 longLengthPos; /* Index of the sequence to apply long length modification to */
309
+ ZSTD_longLengthType_e longLengthType;
310
+ U32 longLengthPos; /* Index of the sequence to apply long length modification to */
372
311
  } seqStore_t;
373
312
 
374
313
  typedef struct {
@@ -378,19 +317,19 @@ typedef struct {
378
317
 
379
318
  /**
380
319
  * Returns the ZSTD_sequenceLength for the given sequences. It handles the decoding of long sequences
381
- * indicated by longLengthPos and longLengthID, and adds MINMATCH back to matchLength.
320
+ * indicated by longLengthPos and longLengthType, and adds MINMATCH back to matchLength.
382
321
  */
383
322
  MEM_STATIC ZSTD_sequenceLength ZSTD_getSequenceLength(seqStore_t const* seqStore, seqDef const* seq)
384
323
  {
385
324
  ZSTD_sequenceLength seqLen;
386
325
  seqLen.litLength = seq->litLength;
387
- seqLen.matchLength = seq->matchLength + MINMATCH;
326
+ seqLen.matchLength = seq->mlBase + MINMATCH;
388
327
  if (seqStore->longLengthPos == (U32)(seq - seqStore->sequencesStart)) {
389
- if (seqStore->longLengthID == 1) {
390
- seqLen.litLength += 0xFFFF;
328
+ if (seqStore->longLengthType == ZSTD_llt_literalLength) {
329
+ seqLen.litLength += 0x10000;
391
330
  }
392
- if (seqStore->longLengthID == 2) {
393
- seqLen.matchLength += 0xFFFF;
331
+ if (seqStore->longLengthType == ZSTD_llt_matchLength) {
332
+ seqLen.matchLength += 0x10000;
394
333
  }
395
334
  }
396
335
  return seqLen;
@@ -403,46 +342,13 @@ MEM_STATIC ZSTD_sequenceLength ZSTD_getSequenceLength(seqStore_t const* seqStore
403
342
  * `decompressedBound != ZSTD_CONTENTSIZE_ERROR`
404
343
  */
405
344
  typedef struct {
345
+ size_t nbBlocks;
406
346
  size_t compressedSize;
407
347
  unsigned long long decompressedBound;
408
348
  } ZSTD_frameSizeInfo; /* decompress & legacy */
409
349
 
410
350
  const seqStore_t* ZSTD_getSeqStore(const ZSTD_CCtx* ctx); /* compress & dictBuilder */
411
- void ZSTD_seqToCodes(const seqStore_t* seqStorePtr); /* compress, dictBuilder, decodeCorpus (shouldn't get its definition from here) */
412
-
413
- /* custom memory allocation functions */
414
- void* ZSTD_customMalloc(size_t size, ZSTD_customMem customMem);
415
- void* ZSTD_customCalloc(size_t size, ZSTD_customMem customMem);
416
- void ZSTD_customFree(void* ptr, ZSTD_customMem customMem);
417
-
418
-
419
- MEM_STATIC U32 ZSTD_highbit32(U32 val) /* compress, dictBuilder, decodeCorpus */
420
- {
421
- assert(val != 0);
422
- {
423
- # if defined(_MSC_VER) /* Visual */
424
- # if STATIC_BMI2 == 1
425
- return _lzcnt_u32(val)^31;
426
- # else
427
- unsigned long r=0;
428
- return _BitScanReverse(&r, val) ? (unsigned)r : 0;
429
- # endif
430
- # elif defined(__GNUC__) && (__GNUC__ >= 3) /* GCC Intrinsic */
431
- return __builtin_clz (val) ^ 31;
432
- # elif defined(__ICCARM__) /* IAR Intrinsic */
433
- return 31 - __CLZ(val);
434
- # else /* Software version */
435
- static const U32 DeBruijnClz[32] = { 0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30, 8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31 };
436
- U32 v = val;
437
- v |= v >> 1;
438
- v |= v >> 2;
439
- v |= v >> 4;
440
- v |= v >> 8;
441
- v |= v >> 16;
442
- return DeBruijnClz[(v * 0x07C4ACDDU) >> 27];
443
- # endif
444
- }
445
- }
351
+ int ZSTD_seqToCodes(const seqStore_t* seqStorePtr); /* compress, dictBuilder, decodeCorpus (shouldn't get its definition from here) */
446
352
 
447
353
 
448
354
  /* ZSTD_invalidateRepCodes() :
@@ -460,16 +366,24 @@ typedef struct {
460
366
 
461
367
  /*! ZSTD_getcBlockSize() :
462
368
  * Provides the size of compressed block from block header `src` */
463
- /* Used by: decompress, fullbench (does not get its definition from here) */
369
+ /* Used by: decompress, fullbench */
464
370
  size_t ZSTD_getcBlockSize(const void* src, size_t srcSize,
465
371
  blockProperties_t* bpPtr);
466
372
 
467
373
  /*! ZSTD_decodeSeqHeaders() :
468
374
  * decode sequence header from src */
469
- /* Used by: decompress, fullbench (does not get its definition from here) */
375
+ /* Used by: zstd_decompress_block, fullbench */
470
376
  size_t ZSTD_decodeSeqHeaders(ZSTD_DCtx* dctx, int* nbSeqPtr,
471
377
  const void* src, size_t srcSize);
472
378
 
379
+ /**
380
+ * @returns true iff the CPU supports dynamic BMI2 dispatch.
381
+ */
382
+ MEM_STATIC int ZSTD_cpuSupportsBmi2(void)
383
+ {
384
+ ZSTD_cpuid_t cpuid = ZSTD_cpuid();
385
+ return ZSTD_cpuid_bmi1(cpuid) && ZSTD_cpuid_bmi2(cpuid);
386
+ }
473
387
 
474
388
  #if defined (__cplusplus)
475
389
  }
@@ -0,0 +1,163 @@
1
+ /*
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ * All rights reserved.
4
+ *
5
+ * This source code is licensed under both the BSD-style license (found in the
6
+ * LICENSE file in the root directory of this source tree) and the GPLv2 (found
7
+ * in the COPYING file in the root directory of this source tree).
8
+ * You may select, at your option, one of the above-listed licenses.
9
+ */
10
+
11
+ #ifndef ZSTD_TRACE_H
12
+ #define ZSTD_TRACE_H
13
+
14
+ #if defined (__cplusplus)
15
+ extern "C" {
16
+ #endif
17
+
18
+ #include <stddef.h>
19
+
20
+ /* weak symbol support
21
+ * For now, enable conservatively:
22
+ * - Only GNUC
23
+ * - Only ELF
24
+ * - Only x86-64, i386 and aarch64
25
+ * Also, explicitly disable on platforms known not to work so they aren't
26
+ * forgotten in the future.
27
+ */
28
+ #if !defined(ZSTD_HAVE_WEAK_SYMBOLS) && \
29
+ defined(__GNUC__) && defined(__ELF__) && \
30
+ (defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || defined(_M_IX86) || defined(__aarch64__)) && \
31
+ !defined(__APPLE__) && !defined(_WIN32) && !defined(__MINGW32__) && \
32
+ !defined(__CYGWIN__) && !defined(_AIX)
33
+ # define ZSTD_HAVE_WEAK_SYMBOLS 1
34
+ #else
35
+ # define ZSTD_HAVE_WEAK_SYMBOLS 0
36
+ #endif
37
+ #if ZSTD_HAVE_WEAK_SYMBOLS
38
+ # define ZSTD_WEAK_ATTR __attribute__((__weak__))
39
+ #else
40
+ # define ZSTD_WEAK_ATTR
41
+ #endif
42
+
43
+ /* Only enable tracing when weak symbols are available. */
44
+ #ifndef ZSTD_TRACE
45
+ # define ZSTD_TRACE ZSTD_HAVE_WEAK_SYMBOLS
46
+ #endif
47
+
48
+ #if ZSTD_TRACE
49
+
50
+ struct ZSTD_CCtx_s;
51
+ struct ZSTD_DCtx_s;
52
+ struct ZSTD_CCtx_params_s;
53
+
54
+ typedef struct {
55
+ /**
56
+ * ZSTD_VERSION_NUMBER
57
+ *
58
+ * This is guaranteed to be the first member of ZSTD_trace.
59
+ * Otherwise, this struct is not stable between versions. If
60
+ * the version number does not match your expectation, you
61
+ * should not interpret the rest of the struct.
62
+ */
63
+ unsigned version;
64
+ /**
65
+ * Non-zero if streaming (de)compression is used.
66
+ */
67
+ unsigned streaming;
68
+ /**
69
+ * The dictionary ID.
70
+ */
71
+ unsigned dictionaryID;
72
+ /**
73
+ * Is the dictionary cold?
74
+ * Only set on decompression.
75
+ */
76
+ unsigned dictionaryIsCold;
77
+ /**
78
+ * The dictionary size or zero if no dictionary.
79
+ */
80
+ size_t dictionarySize;
81
+ /**
82
+ * The uncompressed size of the data.
83
+ */
84
+ size_t uncompressedSize;
85
+ /**
86
+ * The compressed size of the data.
87
+ */
88
+ size_t compressedSize;
89
+ /**
90
+ * The fully resolved CCtx parameters (NULL on decompression).
91
+ */
92
+ struct ZSTD_CCtx_params_s const* params;
93
+ /**
94
+ * The ZSTD_CCtx pointer (NULL on decompression).
95
+ */
96
+ struct ZSTD_CCtx_s const* cctx;
97
+ /**
98
+ * The ZSTD_DCtx pointer (NULL on compression).
99
+ */
100
+ struct ZSTD_DCtx_s const* dctx;
101
+ } ZSTD_Trace;
102
+
103
+ /**
104
+ * A tracing context. It must be 0 when tracing is disabled.
105
+ * Otherwise, any non-zero value returned by a tracing begin()
106
+ * function is presented to any subsequent calls to end().
107
+ *
108
+ * Any non-zero value is treated as tracing is enabled and not
109
+ * interpreted by the library.
110
+ *
111
+ * Two possible uses are:
112
+ * * A timestamp for when the begin() function was called.
113
+ * * A unique key identifying the (de)compression, like the
114
+ * address of the [dc]ctx pointer if you need to track
115
+ * more information than just a timestamp.
116
+ */
117
+ typedef unsigned long long ZSTD_TraceCtx;
118
+
119
+ /**
120
+ * Trace the beginning of a compression call.
121
+ * @param cctx The dctx pointer for the compression.
122
+ * It can be used as a key to map begin() to end().
123
+ * @returns Non-zero if tracing is enabled. The return value is
124
+ * passed to ZSTD_trace_compress_end().
125
+ */
126
+ ZSTD_WEAK_ATTR ZSTD_TraceCtx ZSTD_trace_compress_begin(
127
+ struct ZSTD_CCtx_s const* cctx);
128
+
129
+ /**
130
+ * Trace the end of a compression call.
131
+ * @param ctx The return value of ZSTD_trace_compress_begin().
132
+ * @param trace The zstd tracing info.
133
+ */
134
+ ZSTD_WEAK_ATTR void ZSTD_trace_compress_end(
135
+ ZSTD_TraceCtx ctx,
136
+ ZSTD_Trace const* trace);
137
+
138
+ /**
139
+ * Trace the beginning of a decompression call.
140
+ * @param dctx The dctx pointer for the decompression.
141
+ * It can be used as a key to map begin() to end().
142
+ * @returns Non-zero if tracing is enabled. The return value is
143
+ * passed to ZSTD_trace_compress_end().
144
+ */
145
+ ZSTD_WEAK_ATTR ZSTD_TraceCtx ZSTD_trace_decompress_begin(
146
+ struct ZSTD_DCtx_s const* dctx);
147
+
148
+ /**
149
+ * Trace the end of a decompression call.
150
+ * @param ctx The return value of ZSTD_trace_decompress_begin().
151
+ * @param trace The zstd tracing info.
152
+ */
153
+ ZSTD_WEAK_ATTR void ZSTD_trace_decompress_end(
154
+ ZSTD_TraceCtx ctx,
155
+ ZSTD_Trace const* trace);
156
+
157
+ #endif /* ZSTD_TRACE */
158
+
159
+ #if defined (__cplusplus)
160
+ }
161
+ #endif
162
+
163
+ #endif /* ZSTD_TRACE_H */