zstdlib 0.6.0-x64-mingw32 → 0.9.0-x64-mingw32
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.
- checksums.yaml +4 -4
- data/CHANGES.md +20 -0
- data/README.md +7 -1
- data/Rakefile +38 -8
- data/ext/{zstdlib → zstdlib_c}/extconf.rb +10 -5
- data/ext/{zstdlib → zstdlib_c}/ruby/zlib-2.2/zstdlib.c +2 -2
- data/ext/{zstdlib → zstdlib_c}/ruby/zlib-2.3/zstdlib.c +2 -2
- data/ext/{zstdlib → zstdlib_c}/ruby/zlib-2.4/zstdlib.c +2 -2
- data/ext/{zstdlib → zstdlib_c}/ruby/zlib-2.5/zstdlib.c +2 -2
- data/ext/{zstdlib → zstdlib_c}/ruby/zlib-2.6/zstdlib.c +2 -2
- data/ext/{zstdlib → zstdlib_c}/ruby/zlib-2.7/zstdlib.c +2 -2
- data/ext/zstdlib_c/ruby/zlib-3.0/zstdlib.c +4994 -0
- data/ext/zstdlib_c/ruby/zlib-3.1/zstdlib.c +5076 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/adler32.c +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/compress.c +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/crc32.c +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/crc32.h +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/deflate.c +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/deflate.h +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/gzclose.c +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/gzguts.h +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/gzlib.c +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/gzread.c +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/gzwrite.c +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/infback.c +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/inffast.c +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/inffast.h +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/inffixed.h +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/inflate.c +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/inflate.h +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/inftrees.c +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/inftrees.h +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/trees.c +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/trees.h +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/uncompr.c +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/zconf.h +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/zlib.h +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/zutil.c +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib-1.2.11/zutil.h +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlib.mk +0 -0
- data/ext/{zstdlib → zstdlib_c}/zlibwrapper/zlibwrapper.c +1 -5
- data/ext/{zstdlib → zstdlib_c}/zlibwrapper.mk +0 -0
- data/ext/{zstdlib/zstd-1.4.4 → zstdlib_c/zstd-1.5.2}/lib/common/bitstream.h +75 -57
- data/ext/zstdlib_c/zstd-1.5.2/lib/common/compiler.h +335 -0
- data/ext/{zstdlib/zstd-1.4.4 → zstdlib_c/zstd-1.5.2}/lib/common/cpu.h +1 -3
- data/ext/zstdlib_c/zstd-1.5.2/lib/common/debug.c +24 -0
- data/ext/{zstdlib/zstd-1.4.4 → zstdlib_c/zstd-1.5.2}/lib/common/debug.h +22 -49
- data/ext/zstdlib_c/zstd-1.5.2/lib/common/entropy_common.c +368 -0
- data/ext/{zstdlib/zstd-1.4.4 → zstdlib_c/zstd-1.5.2}/lib/common/error_private.c +3 -1
- data/ext/zstdlib_c/zstd-1.5.2/lib/common/error_private.h +159 -0
- data/ext/{zstdlib/zstd-1.4.4 → zstdlib_c/zstd-1.5.2}/lib/common/fse.h +51 -42
- data/ext/{zstdlib/zstd-1.4.4 → zstdlib_c/zstd-1.5.2}/lib/common/fse_decompress.c +149 -57
- data/ext/{zstdlib/zstd-1.4.4 → zstdlib_c/zstd-1.5.2}/lib/common/huf.h +60 -54
- data/ext/{zstdlib/zstd-1.4.4 → zstdlib_c/zstd-1.5.2}/lib/common/mem.h +87 -98
- data/ext/{zstdlib/zstd-1.4.4 → zstdlib_c/zstd-1.5.2}/lib/common/pool.c +34 -23
- data/ext/{zstdlib/zstd-1.4.4 → zstdlib_c/zstd-1.5.2}/lib/common/pool.h +5 -5
- data/ext/zstdlib_c/zstd-1.5.2/lib/common/portability_macros.h +137 -0
- data/ext/{zstdlib/zstd-1.4.4 → zstdlib_c/zstd-1.5.2}/lib/common/threading.c +10 -8
- data/ext/{zstdlib/zstd-1.4.4 → zstdlib_c/zstd-1.5.2}/lib/common/threading.h +4 -3
- data/ext/zstdlib_c/zstd-1.5.2/lib/common/xxhash.c +24 -0
- data/ext/zstdlib_c/zstd-1.5.2/lib/common/xxhash.h +5686 -0
- data/ext/{zstdlib/zstd-1.4.4 → zstdlib_c/zstd-1.5.2}/lib/common/zstd_common.c +10 -10
- data/ext/zstdlib_c/zstd-1.5.2/lib/common/zstd_deps.h +111 -0
- data/ext/zstdlib_c/zstd-1.5.2/lib/common/zstd_internal.h +493 -0
- data/ext/zstdlib_c/zstd-1.5.2/lib/common/zstd_trace.h +163 -0
- data/ext/zstdlib_c/zstd-1.5.2/lib/compress/clevels.h +134 -0
- data/ext/{zstdlib/zstd-1.4.4 → zstdlib_c/zstd-1.5.2}/lib/compress/fse_compress.c +105 -85
- data/ext/{zstdlib/zstd-1.4.4 → zstdlib_c/zstd-1.5.2}/lib/compress/hist.c +41 -63
- data/ext/{zstdlib/zstd-1.4.4 → zstdlib_c/zstd-1.5.2}/lib/compress/hist.h +13 -33
- data/ext/zstdlib_c/zstd-1.5.2/lib/compress/huf_compress.c +1370 -0
- data/ext/zstdlib_c/zstd-1.5.2/lib/compress/zstd_compress.c +6327 -0
- data/ext/{zstdlib/zstd-1.4.4 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_compress_internal.h +537 -82
- data/ext/{zstdlib/zstd-1.4.4 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_compress_literals.c +21 -16
- data/ext/{zstdlib/zstd-1.4.4 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_compress_literals.h +4 -2
- data/ext/{zstdlib/zstd-1.4.4 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_compress_sequences.c +61 -34
- data/ext/{zstdlib/zstd-1.4.4 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_compress_sequences.h +10 -3
- data/ext/zstdlib_c/zstd-1.5.2/lib/compress/zstd_compress_superblock.c +573 -0
- data/ext/zstdlib_c/zstd-1.5.2/lib/compress/zstd_compress_superblock.h +32 -0
- data/ext/{zstdlib/zstd-1.4.4 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_cwksp.h +236 -95
- data/ext/{zstdlib/zstd-1.4.4 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_double_fast.c +321 -143
- data/ext/{zstdlib/zstd-1.4.4 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_double_fast.h +2 -2
- data/ext/{zstdlib/zstd-1.4.4 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_fast.c +328 -137
- data/ext/{zstdlib/zstd-1.4.4 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_fast.h +2 -2
- data/ext/zstdlib_c/zstd-1.5.2/lib/compress/zstd_lazy.c +2104 -0
- data/ext/zstdlib_c/zstd-1.5.2/lib/compress/zstd_lazy.h +125 -0
- data/ext/{zstdlib/zstd-1.4.4 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_ldm.c +336 -209
- data/ext/{zstdlib/zstd-1.4.4 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_ldm.h +15 -3
- data/ext/zstdlib_c/zstd-1.5.2/lib/compress/zstd_ldm_geartab.h +106 -0
- data/ext/{zstdlib/zstd-1.4.4 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_opt.c +439 -239
- data/ext/{zstdlib/zstd-1.4.4 → zstdlib_c/zstd-1.5.2}/lib/compress/zstd_opt.h +1 -1
- data/ext/{zstdlib/zstd-1.4.4 → zstdlib_c/zstd-1.5.2}/lib/compress/zstdmt_compress.c +205 -462
- data/ext/zstdlib_c/zstd-1.5.2/lib/compress/zstdmt_compress.h +113 -0
- data/ext/zstdlib_c/zstd-1.5.2/lib/decompress/huf_decompress.c +1889 -0
- data/ext/zstdlib_c/zstd-1.5.2/lib/decompress/huf_decompress_amd64.S +585 -0
- data/ext/{zstdlib/zstd-1.4.4 → zstdlib_c/zstd-1.5.2}/lib/decompress/zstd_ddict.c +20 -16
- data/ext/{zstdlib/zstd-1.4.4 → zstdlib_c/zstd-1.5.2}/lib/decompress/zstd_ddict.h +3 -3
- data/ext/{zstdlib/zstd-1.4.4 → zstdlib_c/zstd-1.5.2}/lib/decompress/zstd_decompress.c +691 -230
- data/ext/zstdlib_c/zstd-1.5.2/lib/decompress/zstd_decompress_block.c +2072 -0
- data/ext/{zstdlib/zstd-1.4.4 → zstdlib_c/zstd-1.5.2}/lib/decompress/zstd_decompress_block.h +16 -7
- data/ext/{zstdlib/zstd-1.4.4 → zstdlib_c/zstd-1.5.2}/lib/decompress/zstd_decompress_internal.h +71 -10
- data/ext/zstdlib_c/zstd-1.5.2/lib/zdict.h +452 -0
- data/ext/{zstdlib/zstd-1.4.4 → zstdlib_c/zstd-1.5.2}/lib/zstd.h +760 -234
- data/ext/{zstdlib/zstd-1.4.4/lib/common → zstdlib_c/zstd-1.5.2/lib}/zstd_errors.h +3 -1
- data/ext/{zstdlib/zstd-1.4.4 → zstdlib_c/zstd-1.5.2}/zlibWrapper/gzclose.c +0 -0
- data/ext/{zstdlib/zstd-1.4.4 → zstdlib_c/zstd-1.5.2}/zlibWrapper/gzcompatibility.h +1 -1
- data/ext/{zstdlib/zstd-1.4.4 → zstdlib_c/zstd-1.5.2}/zlibWrapper/gzguts.h +0 -0
- data/ext/{zstdlib/zstd-1.4.4 → zstdlib_c/zstd-1.5.2}/zlibWrapper/gzlib.c +0 -0
- data/ext/{zstdlib/zstd-1.4.4 → zstdlib_c/zstd-1.5.2}/zlibWrapper/gzread.c +0 -0
- data/ext/{zstdlib/zstd-1.4.4 → zstdlib_c/zstd-1.5.2}/zlibWrapper/gzwrite.c +0 -0
- data/ext/{zstdlib/zstd-1.4.4 → zstdlib_c/zstd-1.5.2}/zlibWrapper/zstd_zlibwrapper.c +133 -44
- data/ext/{zstdlib/zstd-1.4.4 → zstdlib_c/zstd-1.5.2}/zlibWrapper/zstd_zlibwrapper.h +1 -1
- data/ext/zstdlib_c/zstd.mk +15 -0
- data/lib/2.4/zstdlib_c.so +0 -0
- data/lib/2.5/zstdlib_c.so +0 -0
- data/lib/2.6/zstdlib_c.so +0 -0
- data/lib/2.7/zstdlib_c.so +0 -0
- data/lib/3.0/zstdlib_c.so +0 -0
- data/lib/zstdlib.rb +2 -2
- metadata +124 -114
- data/ext/zstdlib/zstd-1.4.4/lib/common/compiler.h +0 -159
- data/ext/zstdlib/zstd-1.4.4/lib/common/debug.c +0 -44
- data/ext/zstdlib/zstd-1.4.4/lib/common/entropy_common.c +0 -236
- data/ext/zstdlib/zstd-1.4.4/lib/common/error_private.h +0 -76
- data/ext/zstdlib/zstd-1.4.4/lib/common/xxhash.c +0 -882
- data/ext/zstdlib/zstd-1.4.4/lib/common/xxhash.h +0 -305
- data/ext/zstdlib/zstd-1.4.4/lib/common/zstd_internal.h +0 -350
- data/ext/zstdlib/zstd-1.4.4/lib/compress/huf_compress.c +0 -798
- data/ext/zstdlib/zstd-1.4.4/lib/compress/zstd_compress.c +0 -4103
- data/ext/zstdlib/zstd-1.4.4/lib/compress/zstd_lazy.c +0 -1115
- data/ext/zstdlib/zstd-1.4.4/lib/compress/zstd_lazy.h +0 -67
- data/ext/zstdlib/zstd-1.4.4/lib/compress/zstdmt_compress.h +0 -192
- data/ext/zstdlib/zstd-1.4.4/lib/decompress/huf_decompress.c +0 -1234
- data/ext/zstdlib/zstd-1.4.4/lib/decompress/zstd_decompress_block.c +0 -1323
- data/ext/zstdlib/zstd.mk +0 -14
- data/lib/2.2/zstdlib.so +0 -0
- data/lib/2.3/zstdlib.so +0 -0
- data/lib/2.4/zstdlib.so +0 -0
- data/lib/2.5/zstdlib.so +0 -0
- data/lib/2.6/zstdlib.so +0 -0
- data/lib/2.7/zstdlib.so +0 -0
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -1,12 +1,8 @@
|
|
1
1
|
/* Additional required wrappers not covered by zstd's zlibwrapper */
|
2
2
|
|
3
3
|
#include <zlib.h>
|
4
|
-
#include "zstd_zlibwrapper.h"
|
5
4
|
|
6
|
-
|
7
|
-
{
|
8
|
-
return zError(a);
|
9
|
-
}
|
5
|
+
#include "zstd_zlibwrapper.h"
|
10
6
|
|
11
7
|
ZEXTERN int ZEXPORT z_inflateSyncPoint OF((z_streamp a))
|
12
8
|
{
|
File without changes
|
@@ -1,35 +1,15 @@
|
|
1
1
|
/* ******************************************************************
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
notice, this list of conditions and the following disclaimer.
|
14
|
-
* Redistributions in binary form must reproduce the above
|
15
|
-
copyright notice, this list of conditions and the following disclaimer
|
16
|
-
in the documentation and/or other materials provided with the
|
17
|
-
distribution.
|
18
|
-
|
19
|
-
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
20
|
-
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
21
|
-
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
22
|
-
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
23
|
-
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
24
|
-
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
25
|
-
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
26
|
-
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
27
|
-
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
28
|
-
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
29
|
-
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
30
|
-
|
31
|
-
You can contact the author at :
|
32
|
-
- Source repository : https://github.com/Cyan4973/FiniteStateEntropy
|
2
|
+
* bitstream
|
3
|
+
* Part of FSE library
|
4
|
+
* Copyright (c) Yann Collet, Facebook, Inc.
|
5
|
+
*
|
6
|
+
* You can contact the author at :
|
7
|
+
* - Source repository : https://github.com/Cyan4973/FiniteStateEntropy
|
8
|
+
*
|
9
|
+
* This source code is licensed under both the BSD-style license (found in the
|
10
|
+
* LICENSE file in the root directory of this source tree) and the GPLv2 (found
|
11
|
+
* in the COPYING file in the root directory of this source tree).
|
12
|
+
* You may select, at your option, one of the above-listed licenses.
|
33
13
|
****************************************************************** */
|
34
14
|
#ifndef BITSTREAM_H_MODULE
|
35
15
|
#define BITSTREAM_H_MODULE
|
@@ -37,7 +17,6 @@
|
|
37
17
|
#if defined (__cplusplus)
|
38
18
|
extern "C" {
|
39
19
|
#endif
|
40
|
-
|
41
20
|
/*
|
42
21
|
* This API consists of small unitary functions, which must be inlined for best performance.
|
43
22
|
* Since link-time-optimization is not available for all compilers,
|
@@ -48,6 +27,7 @@ extern "C" {
|
|
48
27
|
* Dependencies
|
49
28
|
******************************************/
|
50
29
|
#include "mem.h" /* unaligned access routines */
|
30
|
+
#include "compiler.h" /* UNLIKELY() */
|
51
31
|
#include "debug.h" /* assert(), DEBUGLOG(), RAWLOG() */
|
52
32
|
#include "error_private.h" /* error codes and messages */
|
53
33
|
|
@@ -55,10 +35,12 @@ extern "C" {
|
|
55
35
|
/*=========================================
|
56
36
|
* Target specific
|
57
37
|
=========================================*/
|
58
|
-
#
|
59
|
-
#
|
60
|
-
#
|
61
|
-
#
|
38
|
+
#ifndef ZSTD_NO_INTRINSICS
|
39
|
+
# if defined(__BMI__) && defined(__GNUC__)
|
40
|
+
# include <immintrin.h> /* support for bextr (experimental) */
|
41
|
+
# elif defined(__ICCARM__)
|
42
|
+
# include <intrinsics.h>
|
43
|
+
# endif
|
62
44
|
#endif
|
63
45
|
|
64
46
|
#define STREAM_ACCUMULATOR_MIN_32 25
|
@@ -160,9 +142,18 @@ MEM_STATIC unsigned BIT_highbit32 (U32 val)
|
|
160
142
|
assert(val != 0);
|
161
143
|
{
|
162
144
|
# if defined(_MSC_VER) /* Visual */
|
163
|
-
|
164
|
-
|
165
|
-
|
145
|
+
# if STATIC_BMI2 == 1
|
146
|
+
return _lzcnt_u32(val) ^ 31;
|
147
|
+
# else
|
148
|
+
if (val != 0) {
|
149
|
+
unsigned long r;
|
150
|
+
_BitScanReverse(&r, val);
|
151
|
+
return (unsigned)r;
|
152
|
+
} else {
|
153
|
+
/* Should not reach this code path */
|
154
|
+
__assume(0);
|
155
|
+
}
|
156
|
+
# endif
|
166
157
|
# elif defined(__GNUC__) && (__GNUC__ >= 3) /* Use GCC Intrinsic */
|
167
158
|
return __builtin_clz (val) ^ 31;
|
168
159
|
# elif defined(__ICCARM__) /* IAR Intrinsic */
|
@@ -218,7 +209,7 @@ MEM_STATIC size_t BIT_initCStream(BIT_CStream_t* bitC,
|
|
218
209
|
MEM_STATIC void BIT_addBits(BIT_CStream_t* bitC,
|
219
210
|
size_t value, unsigned nbBits)
|
220
211
|
{
|
221
|
-
|
212
|
+
DEBUG_STATIC_ASSERT(BIT_MASK_SIZE == 32);
|
222
213
|
assert(nbBits < BIT_MASK_SIZE);
|
223
214
|
assert(nbBits + bitC->bitPos < sizeof(bitC->bitContainer) * 8);
|
224
215
|
bitC->bitContainer |= (value & BIT_mask[nbBits]) << bitC->bitPos;
|
@@ -291,7 +282,7 @@ MEM_STATIC size_t BIT_closeCStream(BIT_CStream_t* bitC)
|
|
291
282
|
*/
|
292
283
|
MEM_STATIC size_t BIT_initDStream(BIT_DStream_t* bitD, const void* srcBuffer, size_t srcSize)
|
293
284
|
{
|
294
|
-
if (srcSize < 1) {
|
285
|
+
if (srcSize < 1) { ZSTD_memset(bitD, 0, sizeof(*bitD)); return ERROR(srcSize_wrong); }
|
295
286
|
|
296
287
|
bitD->start = (const char*)srcBuffer;
|
297
288
|
bitD->limitPtr = bitD->start + sizeof(bitD->bitContainer);
|
@@ -308,22 +299,22 @@ MEM_STATIC size_t BIT_initDStream(BIT_DStream_t* bitD, const void* srcBuffer, si
|
|
308
299
|
switch(srcSize)
|
309
300
|
{
|
310
301
|
case 7: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[6]) << (sizeof(bitD->bitContainer)*8 - 16);
|
311
|
-
|
302
|
+
ZSTD_FALLTHROUGH;
|
312
303
|
|
313
304
|
case 6: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[5]) << (sizeof(bitD->bitContainer)*8 - 24);
|
314
|
-
|
305
|
+
ZSTD_FALLTHROUGH;
|
315
306
|
|
316
307
|
case 5: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[4]) << (sizeof(bitD->bitContainer)*8 - 32);
|
317
|
-
|
308
|
+
ZSTD_FALLTHROUGH;
|
318
309
|
|
319
310
|
case 4: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[3]) << 24;
|
320
|
-
|
311
|
+
ZSTD_FALLTHROUGH;
|
321
312
|
|
322
313
|
case 3: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[2]) << 16;
|
323
|
-
|
314
|
+
ZSTD_FALLTHROUGH;
|
324
315
|
|
325
316
|
case 2: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[1]) << 8;
|
326
|
-
|
317
|
+
ZSTD_FALLTHROUGH;
|
327
318
|
|
328
319
|
default: break;
|
329
320
|
}
|
@@ -337,23 +328,36 @@ MEM_STATIC size_t BIT_initDStream(BIT_DStream_t* bitD, const void* srcBuffer, si
|
|
337
328
|
return srcSize;
|
338
329
|
}
|
339
330
|
|
340
|
-
MEM_STATIC size_t BIT_getUpperBits(size_t bitContainer, U32 const start)
|
331
|
+
MEM_STATIC FORCE_INLINE_ATTR size_t BIT_getUpperBits(size_t bitContainer, U32 const start)
|
341
332
|
{
|
342
333
|
return bitContainer >> start;
|
343
334
|
}
|
344
335
|
|
345
|
-
MEM_STATIC size_t BIT_getMiddleBits(size_t bitContainer, U32 const start, U32 const nbBits)
|
336
|
+
MEM_STATIC FORCE_INLINE_ATTR size_t BIT_getMiddleBits(size_t bitContainer, U32 const start, U32 const nbBits)
|
346
337
|
{
|
347
338
|
U32 const regMask = sizeof(bitContainer)*8 - 1;
|
348
339
|
/* if start > regMask, bitstream is corrupted, and result is undefined */
|
349
340
|
assert(nbBits < BIT_MASK_SIZE);
|
341
|
+
/* x86 transform & ((1 << nbBits) - 1) to bzhi instruction, it is better
|
342
|
+
* than accessing memory. When bmi2 instruction is not present, we consider
|
343
|
+
* such cpus old (pre-Haswell, 2013) and their performance is not of that
|
344
|
+
* importance.
|
345
|
+
*/
|
346
|
+
#if defined(__x86_64__) || defined(_M_X86)
|
347
|
+
return (bitContainer >> (start & regMask)) & ((((U64)1) << nbBits) - 1);
|
348
|
+
#else
|
350
349
|
return (bitContainer >> (start & regMask)) & BIT_mask[nbBits];
|
350
|
+
#endif
|
351
351
|
}
|
352
352
|
|
353
|
-
MEM_STATIC size_t BIT_getLowerBits(size_t bitContainer, U32 const nbBits)
|
353
|
+
MEM_STATIC FORCE_INLINE_ATTR size_t BIT_getLowerBits(size_t bitContainer, U32 const nbBits)
|
354
354
|
{
|
355
|
+
#if defined(STATIC_BMI2) && STATIC_BMI2 == 1
|
356
|
+
return _bzhi_u64(bitContainer, nbBits);
|
357
|
+
#else
|
355
358
|
assert(nbBits < BIT_MASK_SIZE);
|
356
359
|
return bitContainer & BIT_mask[nbBits];
|
360
|
+
#endif
|
357
361
|
}
|
358
362
|
|
359
363
|
/*! BIT_lookBits() :
|
@@ -362,7 +366,7 @@ MEM_STATIC size_t BIT_getLowerBits(size_t bitContainer, U32 const nbBits)
|
|
362
366
|
* On 32-bits, maxNbBits==24.
|
363
367
|
* On 64-bits, maxNbBits==56.
|
364
368
|
* @return : value extracted */
|
365
|
-
MEM_STATIC size_t BIT_lookBits(const BIT_DStream_t*
|
369
|
+
MEM_STATIC FORCE_INLINE_ATTR size_t BIT_lookBits(const BIT_DStream_t* bitD, U32 nbBits)
|
366
370
|
{
|
367
371
|
/* arbitrate between double-shift and shift+mask */
|
368
372
|
#if 1
|
@@ -385,7 +389,7 @@ MEM_STATIC size_t BIT_lookBitsFast(const BIT_DStream_t* bitD, U32 nbBits)
|
|
385
389
|
return (bitD->bitContainer << (bitD->bitsConsumed & regMask)) >> (((regMask+1)-nbBits) & regMask);
|
386
390
|
}
|
387
391
|
|
388
|
-
MEM_STATIC void BIT_skipBits(BIT_DStream_t* bitD, U32 nbBits)
|
392
|
+
MEM_STATIC FORCE_INLINE_ATTR void BIT_skipBits(BIT_DStream_t* bitD, U32 nbBits)
|
389
393
|
{
|
390
394
|
bitD->bitsConsumed += nbBits;
|
391
395
|
}
|
@@ -394,7 +398,7 @@ MEM_STATIC void BIT_skipBits(BIT_DStream_t* bitD, U32 nbBits)
|
|
394
398
|
* Read (consume) next n bits from local register and update.
|
395
399
|
* Pay attention to not read more than nbBits contained into local register.
|
396
400
|
* @return : extracted value. */
|
397
|
-
MEM_STATIC size_t BIT_readBits(BIT_DStream_t* bitD, unsigned nbBits)
|
401
|
+
MEM_STATIC FORCE_INLINE_ATTR size_t BIT_readBits(BIT_DStream_t* bitD, unsigned nbBits)
|
398
402
|
{
|
399
403
|
size_t const value = BIT_lookBits(bitD, nbBits);
|
400
404
|
BIT_skipBits(bitD, nbBits);
|
@@ -411,6 +415,23 @@ MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, unsigned nbBits)
|
|
411
415
|
return value;
|
412
416
|
}
|
413
417
|
|
418
|
+
/*! BIT_reloadDStreamFast() :
|
419
|
+
* Similar to BIT_reloadDStream(), but with two differences:
|
420
|
+
* 1. bitsConsumed <= sizeof(bitD->bitContainer)*8 must hold!
|
421
|
+
* 2. Returns BIT_DStream_overflow when bitD->ptr < bitD->limitPtr, at this
|
422
|
+
* point you must use BIT_reloadDStream() to reload.
|
423
|
+
*/
|
424
|
+
MEM_STATIC BIT_DStream_status BIT_reloadDStreamFast(BIT_DStream_t* bitD)
|
425
|
+
{
|
426
|
+
if (UNLIKELY(bitD->ptr < bitD->limitPtr))
|
427
|
+
return BIT_DStream_overflow;
|
428
|
+
assert(bitD->bitsConsumed <= sizeof(bitD->bitContainer)*8);
|
429
|
+
bitD->ptr -= bitD->bitsConsumed >> 3;
|
430
|
+
bitD->bitsConsumed &= 7;
|
431
|
+
bitD->bitContainer = MEM_readLEST(bitD->ptr);
|
432
|
+
return BIT_DStream_unfinished;
|
433
|
+
}
|
434
|
+
|
414
435
|
/*! BIT_reloadDStream() :
|
415
436
|
* Refill `bitD` from buffer previously set in BIT_initDStream() .
|
416
437
|
* This function is safe, it guarantees it will not read beyond src buffer.
|
@@ -422,10 +443,7 @@ MEM_STATIC BIT_DStream_status BIT_reloadDStream(BIT_DStream_t* bitD)
|
|
422
443
|
return BIT_DStream_overflow;
|
423
444
|
|
424
445
|
if (bitD->ptr >= bitD->limitPtr) {
|
425
|
-
|
426
|
-
bitD->bitsConsumed &= 7;
|
427
|
-
bitD->bitContainer = MEM_readLEST(bitD->ptr);
|
428
|
-
return BIT_DStream_unfinished;
|
446
|
+
return BIT_reloadDStreamFast(bitD);
|
429
447
|
}
|
430
448
|
if (bitD->ptr == bitD->start) {
|
431
449
|
if (bitD->bitsConsumed < sizeof(bitD->bitContainer)*8) return BIT_DStream_endOfBuffer;
|
@@ -0,0 +1,335 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (c) Yann Collet, Facebook, Inc.
|
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_COMPILER_H
|
12
|
+
#define ZSTD_COMPILER_H
|
13
|
+
|
14
|
+
#include "portability_macros.h"
|
15
|
+
|
16
|
+
/*-*******************************************************
|
17
|
+
* Compiler specifics
|
18
|
+
*********************************************************/
|
19
|
+
/* force inlining */
|
20
|
+
|
21
|
+
#if !defined(ZSTD_NO_INLINE)
|
22
|
+
#if (defined(__GNUC__) && !defined(__STRICT_ANSI__)) || defined(__cplusplus) || defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 */
|
23
|
+
# define INLINE_KEYWORD inline
|
24
|
+
#else
|
25
|
+
# define INLINE_KEYWORD
|
26
|
+
#endif
|
27
|
+
|
28
|
+
#if defined(__GNUC__) || defined(__ICCARM__)
|
29
|
+
# define FORCE_INLINE_ATTR __attribute__((always_inline))
|
30
|
+
#elif defined(_MSC_VER)
|
31
|
+
# define FORCE_INLINE_ATTR __forceinline
|
32
|
+
#else
|
33
|
+
# define FORCE_INLINE_ATTR
|
34
|
+
#endif
|
35
|
+
|
36
|
+
#else
|
37
|
+
|
38
|
+
#define INLINE_KEYWORD
|
39
|
+
#define FORCE_INLINE_ATTR
|
40
|
+
|
41
|
+
#endif
|
42
|
+
|
43
|
+
/**
|
44
|
+
On MSVC qsort requires that functions passed into it use the __cdecl calling conversion(CC).
|
45
|
+
This explicitly marks such functions as __cdecl so that the code will still compile
|
46
|
+
if a CC other than __cdecl has been made the default.
|
47
|
+
*/
|
48
|
+
#if defined(_MSC_VER)
|
49
|
+
# define WIN_CDECL __cdecl
|
50
|
+
#else
|
51
|
+
# define WIN_CDECL
|
52
|
+
#endif
|
53
|
+
|
54
|
+
/**
|
55
|
+
* FORCE_INLINE_TEMPLATE is used to define C "templates", which take constant
|
56
|
+
* parameters. They must be inlined for the compiler to eliminate the constant
|
57
|
+
* branches.
|
58
|
+
*/
|
59
|
+
#define FORCE_INLINE_TEMPLATE static INLINE_KEYWORD FORCE_INLINE_ATTR
|
60
|
+
/**
|
61
|
+
* HINT_INLINE is used to help the compiler generate better code. It is *not*
|
62
|
+
* used for "templates", so it can be tweaked based on the compilers
|
63
|
+
* performance.
|
64
|
+
*
|
65
|
+
* gcc-4.8 and gcc-4.9 have been shown to benefit from leaving off the
|
66
|
+
* always_inline attribute.
|
67
|
+
*
|
68
|
+
* clang up to 5.0.0 (trunk) benefit tremendously from the always_inline
|
69
|
+
* attribute.
|
70
|
+
*/
|
71
|
+
#if !defined(__clang__) && defined(__GNUC__) && __GNUC__ >= 4 && __GNUC_MINOR__ >= 8 && __GNUC__ < 5
|
72
|
+
# define HINT_INLINE static INLINE_KEYWORD
|
73
|
+
#else
|
74
|
+
# define HINT_INLINE static INLINE_KEYWORD FORCE_INLINE_ATTR
|
75
|
+
#endif
|
76
|
+
|
77
|
+
/* UNUSED_ATTR tells the compiler it is okay if the function is unused. */
|
78
|
+
#if defined(__GNUC__)
|
79
|
+
# define UNUSED_ATTR __attribute__((unused))
|
80
|
+
#else
|
81
|
+
# define UNUSED_ATTR
|
82
|
+
#endif
|
83
|
+
|
84
|
+
/* force no inlining */
|
85
|
+
#ifdef _MSC_VER
|
86
|
+
# define FORCE_NOINLINE static __declspec(noinline)
|
87
|
+
#else
|
88
|
+
# if defined(__GNUC__) || defined(__ICCARM__)
|
89
|
+
# define FORCE_NOINLINE static __attribute__((__noinline__))
|
90
|
+
# else
|
91
|
+
# define FORCE_NOINLINE static
|
92
|
+
# endif
|
93
|
+
#endif
|
94
|
+
|
95
|
+
|
96
|
+
/* target attribute */
|
97
|
+
#if defined(__GNUC__) || defined(__ICCARM__)
|
98
|
+
# define TARGET_ATTRIBUTE(target) __attribute__((__target__(target)))
|
99
|
+
#else
|
100
|
+
# define TARGET_ATTRIBUTE(target)
|
101
|
+
#endif
|
102
|
+
|
103
|
+
/* Target attribute for BMI2 dynamic dispatch.
|
104
|
+
* Enable lzcnt, bmi, and bmi2.
|
105
|
+
* We test for bmi1 & bmi2. lzcnt is included in bmi1.
|
106
|
+
*/
|
107
|
+
#define BMI2_TARGET_ATTRIBUTE TARGET_ATTRIBUTE("lzcnt,bmi,bmi2")
|
108
|
+
|
109
|
+
/* prefetch
|
110
|
+
* can be disabled, by declaring NO_PREFETCH build macro */
|
111
|
+
#if defined(NO_PREFETCH)
|
112
|
+
# define PREFETCH_L1(ptr) (void)(ptr) /* disabled */
|
113
|
+
# define PREFETCH_L2(ptr) (void)(ptr) /* disabled */
|
114
|
+
#else
|
115
|
+
# if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_I86)) /* _mm_prefetch() is not defined outside of x86/x64 */
|
116
|
+
# include <mmintrin.h> /* https://msdn.microsoft.com/fr-fr/library/84szxsww(v=vs.90).aspx */
|
117
|
+
# define PREFETCH_L1(ptr) _mm_prefetch((const char*)(ptr), _MM_HINT_T0)
|
118
|
+
# define PREFETCH_L2(ptr) _mm_prefetch((const char*)(ptr), _MM_HINT_T1)
|
119
|
+
# elif defined(__GNUC__) && ( (__GNUC__ >= 4) || ( (__GNUC__ == 3) && (__GNUC_MINOR__ >= 1) ) )
|
120
|
+
# define PREFETCH_L1(ptr) __builtin_prefetch((ptr), 0 /* rw==read */, 3 /* locality */)
|
121
|
+
# define PREFETCH_L2(ptr) __builtin_prefetch((ptr), 0 /* rw==read */, 2 /* locality */)
|
122
|
+
# elif defined(__aarch64__)
|
123
|
+
# define PREFETCH_L1(ptr) __asm__ __volatile__("prfm pldl1keep, %0" ::"Q"(*(ptr)))
|
124
|
+
# define PREFETCH_L2(ptr) __asm__ __volatile__("prfm pldl2keep, %0" ::"Q"(*(ptr)))
|
125
|
+
# else
|
126
|
+
# define PREFETCH_L1(ptr) (void)(ptr) /* disabled */
|
127
|
+
# define PREFETCH_L2(ptr) (void)(ptr) /* disabled */
|
128
|
+
# endif
|
129
|
+
#endif /* NO_PREFETCH */
|
130
|
+
|
131
|
+
#define CACHELINE_SIZE 64
|
132
|
+
|
133
|
+
#define PREFETCH_AREA(p, s) { \
|
134
|
+
const char* const _ptr = (const char*)(p); \
|
135
|
+
size_t const _size = (size_t)(s); \
|
136
|
+
size_t _pos; \
|
137
|
+
for (_pos=0; _pos<_size; _pos+=CACHELINE_SIZE) { \
|
138
|
+
PREFETCH_L2(_ptr + _pos); \
|
139
|
+
} \
|
140
|
+
}
|
141
|
+
|
142
|
+
/* vectorization
|
143
|
+
* older GCC (pre gcc-4.3 picked as the cutoff) uses a different syntax,
|
144
|
+
* and some compilers, like Intel ICC and MCST LCC, do not support it at all. */
|
145
|
+
#if !defined(__INTEL_COMPILER) && !defined(__clang__) && defined(__GNUC__) && !defined(__LCC__)
|
146
|
+
# if (__GNUC__ == 4 && __GNUC_MINOR__ > 3) || (__GNUC__ >= 5)
|
147
|
+
# define DONT_VECTORIZE __attribute__((optimize("no-tree-vectorize")))
|
148
|
+
# else
|
149
|
+
# define DONT_VECTORIZE _Pragma("GCC optimize(\"no-tree-vectorize\")")
|
150
|
+
# endif
|
151
|
+
#else
|
152
|
+
# define DONT_VECTORIZE
|
153
|
+
#endif
|
154
|
+
|
155
|
+
/* Tell the compiler that a branch is likely or unlikely.
|
156
|
+
* Only use these macros if it causes the compiler to generate better code.
|
157
|
+
* If you can remove a LIKELY/UNLIKELY annotation without speed changes in gcc
|
158
|
+
* and clang, please do.
|
159
|
+
*/
|
160
|
+
#if defined(__GNUC__)
|
161
|
+
#define LIKELY(x) (__builtin_expect((x), 1))
|
162
|
+
#define UNLIKELY(x) (__builtin_expect((x), 0))
|
163
|
+
#else
|
164
|
+
#define LIKELY(x) (x)
|
165
|
+
#define UNLIKELY(x) (x)
|
166
|
+
#endif
|
167
|
+
|
168
|
+
/* disable warnings */
|
169
|
+
#ifdef _MSC_VER /* Visual Studio */
|
170
|
+
# include <intrin.h> /* For Visual 2005 */
|
171
|
+
# pragma warning(disable : 4100) /* disable: C4100: unreferenced formal parameter */
|
172
|
+
# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */
|
173
|
+
# pragma warning(disable : 4204) /* disable: C4204: non-constant aggregate initializer */
|
174
|
+
# pragma warning(disable : 4214) /* disable: C4214: non-int bitfields */
|
175
|
+
# pragma warning(disable : 4324) /* disable: C4324: padded structure */
|
176
|
+
#endif
|
177
|
+
|
178
|
+
/*Like DYNAMIC_BMI2 but for compile time determination of BMI2 support*/
|
179
|
+
#ifndef STATIC_BMI2
|
180
|
+
# if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_I86))
|
181
|
+
# ifdef __AVX2__ //MSVC does not have a BMI2 specific flag, but every CPU that supports AVX2 also supports BMI2
|
182
|
+
# define STATIC_BMI2 1
|
183
|
+
# endif
|
184
|
+
# endif
|
185
|
+
#endif
|
186
|
+
|
187
|
+
#ifndef STATIC_BMI2
|
188
|
+
#define STATIC_BMI2 0
|
189
|
+
#endif
|
190
|
+
|
191
|
+
/* compile time determination of SIMD support */
|
192
|
+
#if !defined(ZSTD_NO_INTRINSICS)
|
193
|
+
# if defined(__SSE2__) || defined(_M_AMD64) || (defined (_M_IX86) && defined(_M_IX86_FP) && (_M_IX86_FP >= 2))
|
194
|
+
# define ZSTD_ARCH_X86_SSE2
|
195
|
+
# endif
|
196
|
+
# if defined(__ARM_NEON) || defined(_M_ARM64)
|
197
|
+
# define ZSTD_ARCH_ARM_NEON
|
198
|
+
# endif
|
199
|
+
#
|
200
|
+
# if defined(ZSTD_ARCH_X86_SSE2)
|
201
|
+
# include <emmintrin.h>
|
202
|
+
# elif defined(ZSTD_ARCH_ARM_NEON)
|
203
|
+
# include <arm_neon.h>
|
204
|
+
# endif
|
205
|
+
#endif
|
206
|
+
|
207
|
+
/* C-language Attributes are added in C23. */
|
208
|
+
#if defined(__STDC_VERSION__) && (__STDC_VERSION__ > 201710L) && defined(__has_c_attribute)
|
209
|
+
# define ZSTD_HAS_C_ATTRIBUTE(x) __has_c_attribute(x)
|
210
|
+
#else
|
211
|
+
# define ZSTD_HAS_C_ATTRIBUTE(x) 0
|
212
|
+
#endif
|
213
|
+
|
214
|
+
/* Only use C++ attributes in C++. Some compilers report support for C++
|
215
|
+
* attributes when compiling with C.
|
216
|
+
*/
|
217
|
+
#if defined(__cplusplus) && defined(__has_cpp_attribute)
|
218
|
+
# define ZSTD_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x)
|
219
|
+
#else
|
220
|
+
# define ZSTD_HAS_CPP_ATTRIBUTE(x) 0
|
221
|
+
#endif
|
222
|
+
|
223
|
+
/* Define ZSTD_FALLTHROUGH macro for annotating switch case with the 'fallthrough' attribute.
|
224
|
+
* - C23: https://en.cppreference.com/w/c/language/attributes/fallthrough
|
225
|
+
* - CPP17: https://en.cppreference.com/w/cpp/language/attributes/fallthrough
|
226
|
+
* - Else: __attribute__((__fallthrough__))
|
227
|
+
*/
|
228
|
+
#ifndef ZSTD_FALLTHROUGH
|
229
|
+
# if ZSTD_HAS_C_ATTRIBUTE(fallthrough)
|
230
|
+
# define ZSTD_FALLTHROUGH [[fallthrough]]
|
231
|
+
# elif ZSTD_HAS_CPP_ATTRIBUTE(fallthrough)
|
232
|
+
# define ZSTD_FALLTHROUGH [[fallthrough]]
|
233
|
+
# elif __has_attribute(__fallthrough__)
|
234
|
+
/* Leading semicolon is to satisfy gcc-11 with -pedantic. Without the semicolon
|
235
|
+
* gcc complains about: a label can only be part of a statement and a declaration is not a statement.
|
236
|
+
*/
|
237
|
+
# define ZSTD_FALLTHROUGH ; __attribute__((__fallthrough__))
|
238
|
+
# else
|
239
|
+
# define ZSTD_FALLTHROUGH
|
240
|
+
# endif
|
241
|
+
#endif
|
242
|
+
|
243
|
+
/*-**************************************************************
|
244
|
+
* Alignment check
|
245
|
+
*****************************************************************/
|
246
|
+
|
247
|
+
/* this test was initially positioned in mem.h,
|
248
|
+
* but this file is removed (or replaced) for linux kernel
|
249
|
+
* so it's now hosted in compiler.h,
|
250
|
+
* which remains valid for both user & kernel spaces.
|
251
|
+
*/
|
252
|
+
|
253
|
+
#ifndef ZSTD_ALIGNOF
|
254
|
+
# if defined(__GNUC__) || defined(_MSC_VER)
|
255
|
+
/* covers gcc, clang & MSVC */
|
256
|
+
/* note : this section must come first, before C11,
|
257
|
+
* due to a limitation in the kernel source generator */
|
258
|
+
# define ZSTD_ALIGNOF(T) __alignof(T)
|
259
|
+
|
260
|
+
# elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)
|
261
|
+
/* C11 support */
|
262
|
+
# include <stdalign.h>
|
263
|
+
# define ZSTD_ALIGNOF(T) alignof(T)
|
264
|
+
|
265
|
+
# else
|
266
|
+
/* No known support for alignof() - imperfect backup */
|
267
|
+
# define ZSTD_ALIGNOF(T) (sizeof(void*) < sizeof(T) ? sizeof(void*) : sizeof(T))
|
268
|
+
|
269
|
+
# endif
|
270
|
+
#endif /* ZSTD_ALIGNOF */
|
271
|
+
|
272
|
+
/*-**************************************************************
|
273
|
+
* Sanitizer
|
274
|
+
*****************************************************************/
|
275
|
+
|
276
|
+
#if ZSTD_MEMORY_SANITIZER
|
277
|
+
/* Not all platforms that support msan provide sanitizers/msan_interface.h.
|
278
|
+
* We therefore declare the functions we need ourselves, rather than trying to
|
279
|
+
* include the header file... */
|
280
|
+
#include <stddef.h> /* size_t */
|
281
|
+
#define ZSTD_DEPS_NEED_STDINT
|
282
|
+
#include "zstd_deps.h" /* intptr_t */
|
283
|
+
|
284
|
+
/* Make memory region fully initialized (without changing its contents). */
|
285
|
+
void __msan_unpoison(const volatile void *a, size_t size);
|
286
|
+
|
287
|
+
/* Make memory region fully uninitialized (without changing its contents).
|
288
|
+
This is a legacy interface that does not update origin information. Use
|
289
|
+
__msan_allocated_memory() instead. */
|
290
|
+
void __msan_poison(const volatile void *a, size_t size);
|
291
|
+
|
292
|
+
/* Returns the offset of the first (at least partially) poisoned byte in the
|
293
|
+
memory range, or -1 if the whole range is good. */
|
294
|
+
intptr_t __msan_test_shadow(const volatile void *x, size_t size);
|
295
|
+
#endif
|
296
|
+
|
297
|
+
#if ZSTD_ADDRESS_SANITIZER
|
298
|
+
/* Not all platforms that support asan provide sanitizers/asan_interface.h.
|
299
|
+
* We therefore declare the functions we need ourselves, rather than trying to
|
300
|
+
* include the header file... */
|
301
|
+
#include <stddef.h> /* size_t */
|
302
|
+
|
303
|
+
/**
|
304
|
+
* Marks a memory region (<c>[addr, addr+size)</c>) as unaddressable.
|
305
|
+
*
|
306
|
+
* This memory must be previously allocated by your program. Instrumented
|
307
|
+
* code is forbidden from accessing addresses in this region until it is
|
308
|
+
* unpoisoned. This function is not guaranteed to poison the entire region -
|
309
|
+
* it could poison only a subregion of <c>[addr, addr+size)</c> due to ASan
|
310
|
+
* alignment restrictions.
|
311
|
+
*
|
312
|
+
* \note This function is not thread-safe because no two threads can poison or
|
313
|
+
* unpoison memory in the same memory region simultaneously.
|
314
|
+
*
|
315
|
+
* \param addr Start of memory region.
|
316
|
+
* \param size Size of memory region. */
|
317
|
+
void __asan_poison_memory_region(void const volatile *addr, size_t size);
|
318
|
+
|
319
|
+
/**
|
320
|
+
* Marks a memory region (<c>[addr, addr+size)</c>) as addressable.
|
321
|
+
*
|
322
|
+
* This memory must be previously allocated by your program. Accessing
|
323
|
+
* addresses in this region is allowed until this region is poisoned again.
|
324
|
+
* This function could unpoison a super-region of <c>[addr, addr+size)</c> due
|
325
|
+
* to ASan alignment restrictions.
|
326
|
+
*
|
327
|
+
* \note This function is not thread-safe because no two threads can
|
328
|
+
* poison or unpoison memory in the same memory region simultaneously.
|
329
|
+
*
|
330
|
+
* \param addr Start of memory region.
|
331
|
+
* \param size Size of memory region. */
|
332
|
+
void __asan_unpoison_memory_region(void const volatile *addr, size_t size);
|
333
|
+
#endif
|
334
|
+
|
335
|
+
#endif /* ZSTD_COMPILER_H */
|