zstd-ruby 1.5.0.0 → 1.5.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ruby.yml +2 -2
- data/README.md +1 -1
- data/ext/zstdruby/extconf.rb +1 -0
- data/ext/zstdruby/libzstd/Makefile +50 -175
- data/ext/zstdruby/libzstd/README.md +7 -1
- data/ext/zstdruby/libzstd/common/bitstream.h +24 -9
- data/ext/zstdruby/libzstd/common/compiler.h +89 -43
- data/ext/zstdruby/libzstd/common/entropy_common.c +11 -5
- data/ext/zstdruby/libzstd/common/error_private.h +79 -0
- data/ext/zstdruby/libzstd/common/fse.h +2 -1
- data/ext/zstdruby/libzstd/common/fse_decompress.c +1 -1
- data/ext/zstdruby/libzstd/common/huf.h +24 -22
- data/ext/zstdruby/libzstd/common/mem.h +18 -0
- data/ext/zstdruby/libzstd/common/portability_macros.h +131 -0
- data/ext/zstdruby/libzstd/common/xxhash.c +5 -805
- data/ext/zstdruby/libzstd/common/xxhash.h +5568 -167
- data/ext/zstdruby/libzstd/common/zstd_internal.h +92 -88
- data/ext/zstdruby/libzstd/common/zstd_trace.h +12 -3
- data/ext/zstdruby/libzstd/compress/clevels.h +134 -0
- data/ext/zstdruby/libzstd/compress/fse_compress.c +63 -27
- data/ext/zstdruby/libzstd/compress/huf_compress.c +537 -104
- data/ext/zstdruby/libzstd/compress/zstd_compress.c +194 -278
- data/ext/zstdruby/libzstd/compress/zstd_compress_internal.h +102 -44
- data/ext/zstdruby/libzstd/compress/zstd_compress_literals.c +4 -3
- data/ext/zstdruby/libzstd/compress/zstd_compress_literals.h +3 -1
- data/ext/zstdruby/libzstd/compress/zstd_compress_sequences.c +5 -4
- data/ext/zstdruby/libzstd/compress/zstd_compress_superblock.c +3 -2
- data/ext/zstdruby/libzstd/compress/zstd_cwksp.h +3 -3
- data/ext/zstdruby/libzstd/compress/zstd_double_fast.c +289 -114
- data/ext/zstdruby/libzstd/compress/zstd_fast.c +302 -123
- data/ext/zstdruby/libzstd/compress/zstd_lazy.c +418 -502
- data/ext/zstdruby/libzstd/compress/zstd_ldm.c +4 -4
- data/ext/zstdruby/libzstd/compress/zstd_ldm.h +1 -1
- data/ext/zstdruby/libzstd/compress/zstd_ldm_geartab.h +4 -1
- data/ext/zstdruby/libzstd/compress/zstd_opt.c +186 -108
- data/ext/zstdruby/libzstd/compress/zstdmt_compress.c +59 -29
- data/ext/zstdruby/libzstd/decompress/huf_decompress.c +727 -189
- data/ext/zstdruby/libzstd/decompress/huf_decompress_amd64.S +571 -0
- data/ext/zstdruby/libzstd/decompress/zstd_decompress.c +85 -22
- data/ext/zstdruby/libzstd/decompress/zstd_decompress_block.c +744 -220
- data/ext/zstdruby/libzstd/decompress/zstd_decompress_block.h +8 -2
- data/ext/zstdruby/libzstd/decompress/zstd_decompress_internal.h +34 -3
- data/ext/zstdruby/libzstd/deprecated/zbuff_compress.c +23 -3
- data/ext/zstdruby/libzstd/dictBuilder/cover.c +9 -2
- data/ext/zstdruby/libzstd/dictBuilder/fastcover.c +11 -4
- data/ext/zstdruby/libzstd/dictBuilder/zdict.c +99 -28
- data/ext/zstdruby/libzstd/legacy/zstd_v01.c +2 -6
- data/ext/zstdruby/libzstd/legacy/zstd_v02.c +3 -7
- data/ext/zstdruby/libzstd/legacy/zstd_v03.c +3 -7
- data/ext/zstdruby/libzstd/legacy/zstd_v04.c +3 -7
- data/ext/zstdruby/libzstd/legacy/zstd_v05.c +3 -7
- data/ext/zstdruby/libzstd/legacy/zstd_v06.c +3 -7
- data/ext/zstdruby/libzstd/legacy/zstd_v07.c +3 -7
- data/ext/zstdruby/libzstd/libzstd.mk +185 -0
- data/ext/zstdruby/libzstd/libzstd.pc.in +1 -0
- data/ext/zstdruby/libzstd/modulemap/module.modulemap +4 -0
- data/ext/zstdruby/libzstd/zdict.h +4 -4
- data/ext/zstdruby/libzstd/zstd.h +179 -136
- data/ext/zstdruby/zstdruby.c +2 -2
- data/lib/zstd-ruby/version.rb +1 -1
- metadata +8 -3
@@ -22,6 +22,8 @@ extern "C" {
|
|
22
22
|
* Dependencies
|
23
23
|
******************************************/
|
24
24
|
#include "../zstd_errors.h" /* enum list */
|
25
|
+
#include "compiler.h"
|
26
|
+
#include "debug.h"
|
25
27
|
#include "zstd_deps.h" /* size_t */
|
26
28
|
|
27
29
|
|
@@ -73,6 +75,83 @@ ERR_STATIC const char* ERR_getErrorName(size_t code)
|
|
73
75
|
return ERR_getErrorString(ERR_getErrorCode(code));
|
74
76
|
}
|
75
77
|
|
78
|
+
/**
|
79
|
+
* Ignore: this is an internal helper.
|
80
|
+
*
|
81
|
+
* This is a helper function to help force C99-correctness during compilation.
|
82
|
+
* Under strict compilation modes, variadic macro arguments can't be empty.
|
83
|
+
* However, variadic function arguments can be. Using a function therefore lets
|
84
|
+
* us statically check that at least one (string) argument was passed,
|
85
|
+
* independent of the compilation flags.
|
86
|
+
*/
|
87
|
+
static INLINE_KEYWORD UNUSED_ATTR
|
88
|
+
void _force_has_format_string(const char *format, ...) {
|
89
|
+
(void)format;
|
90
|
+
}
|
91
|
+
|
92
|
+
/**
|
93
|
+
* Ignore: this is an internal helper.
|
94
|
+
*
|
95
|
+
* We want to force this function invocation to be syntactically correct, but
|
96
|
+
* we don't want to force runtime evaluation of its arguments.
|
97
|
+
*/
|
98
|
+
#define _FORCE_HAS_FORMAT_STRING(...) \
|
99
|
+
if (0) { \
|
100
|
+
_force_has_format_string(__VA_ARGS__); \
|
101
|
+
}
|
102
|
+
|
103
|
+
#define ERR_QUOTE(str) #str
|
104
|
+
|
105
|
+
/**
|
106
|
+
* Return the specified error if the condition evaluates to true.
|
107
|
+
*
|
108
|
+
* In debug modes, prints additional information.
|
109
|
+
* In order to do that (particularly, printing the conditional that failed),
|
110
|
+
* this can't just wrap RETURN_ERROR().
|
111
|
+
*/
|
112
|
+
#define RETURN_ERROR_IF(cond, err, ...) \
|
113
|
+
if (cond) { \
|
114
|
+
RAWLOG(3, "%s:%d: ERROR!: check %s failed, returning %s", \
|
115
|
+
__FILE__, __LINE__, ERR_QUOTE(cond), ERR_QUOTE(ERROR(err))); \
|
116
|
+
_FORCE_HAS_FORMAT_STRING(__VA_ARGS__); \
|
117
|
+
RAWLOG(3, ": " __VA_ARGS__); \
|
118
|
+
RAWLOG(3, "\n"); \
|
119
|
+
return ERROR(err); \
|
120
|
+
}
|
121
|
+
|
122
|
+
/**
|
123
|
+
* Unconditionally return the specified error.
|
124
|
+
*
|
125
|
+
* In debug modes, prints additional information.
|
126
|
+
*/
|
127
|
+
#define RETURN_ERROR(err, ...) \
|
128
|
+
do { \
|
129
|
+
RAWLOG(3, "%s:%d: ERROR!: unconditional check failed, returning %s", \
|
130
|
+
__FILE__, __LINE__, ERR_QUOTE(ERROR(err))); \
|
131
|
+
_FORCE_HAS_FORMAT_STRING(__VA_ARGS__); \
|
132
|
+
RAWLOG(3, ": " __VA_ARGS__); \
|
133
|
+
RAWLOG(3, "\n"); \
|
134
|
+
return ERROR(err); \
|
135
|
+
} while(0);
|
136
|
+
|
137
|
+
/**
|
138
|
+
* If the provided expression evaluates to an error code, returns that error code.
|
139
|
+
*
|
140
|
+
* In debug modes, prints additional information.
|
141
|
+
*/
|
142
|
+
#define FORWARD_IF_ERROR(err, ...) \
|
143
|
+
do { \
|
144
|
+
size_t const err_code = (err); \
|
145
|
+
if (ERR_isError(err_code)) { \
|
146
|
+
RAWLOG(3, "%s:%d: ERROR!: forwarding error in %s: %s", \
|
147
|
+
__FILE__, __LINE__, ERR_QUOTE(err), ERR_getErrorName(err_code)); \
|
148
|
+
_FORCE_HAS_FORMAT_STRING(__VA_ARGS__); \
|
149
|
+
RAWLOG(3, ": " __VA_ARGS__); \
|
150
|
+
RAWLOG(3, "\n"); \
|
151
|
+
return err_code; \
|
152
|
+
} \
|
153
|
+
} while(0);
|
154
|
+
|
76
155
|
#if defined (__cplusplus)
|
77
156
|
}
|
78
157
|
#endif
|
@@ -336,8 +336,9 @@ size_t FSE_buildCTable_rle (FSE_CTable* ct, unsigned char symbolValue);
|
|
336
336
|
/* FSE_buildCTable_wksp() :
|
337
337
|
* Same as FSE_buildCTable(), but using an externally allocated scratch buffer (`workSpace`).
|
338
338
|
* `wkspSize` must be >= `FSE_BUILD_CTABLE_WORKSPACE_SIZE_U32(maxSymbolValue, tableLog)` of `unsigned`.
|
339
|
+
* See FSE_buildCTable_wksp() for breakdown of workspace usage.
|
339
340
|
*/
|
340
|
-
#define FSE_BUILD_CTABLE_WORKSPACE_SIZE_U32(maxSymbolValue, tableLog) (maxSymbolValue + 2 + (1ull << (tableLog
|
341
|
+
#define FSE_BUILD_CTABLE_WORKSPACE_SIZE_U32(maxSymbolValue, tableLog) (((maxSymbolValue + 2) + (1ull << (tableLog)))/2 + sizeof(U64)/sizeof(U32) /* additional 8 bytes for potential table overwrite */)
|
341
342
|
#define FSE_BUILD_CTABLE_WORKSPACE_SIZE(maxSymbolValue, tableLog) (sizeof(unsigned) * FSE_BUILD_CTABLE_WORKSPACE_SIZE_U32(maxSymbolValue, tableLog))
|
342
343
|
size_t FSE_buildCTable_wksp(FSE_CTable* ct, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog, void* workSpace, size_t wkspSize);
|
343
344
|
|
@@ -365,7 +365,7 @@ static size_t FSE_decompress_wksp_body_default(void* dst, size_t dstCapacity, co
|
|
365
365
|
}
|
366
366
|
|
367
367
|
#if DYNAMIC_BMI2
|
368
|
-
|
368
|
+
BMI2_TARGET_ATTRIBUTE static size_t FSE_decompress_wksp_body_bmi2(void* dst, size_t dstCapacity, const void* cSrc, size_t cSrcSize, unsigned maxLog, void* workSpace, size_t wkspSize)
|
369
369
|
{
|
370
370
|
return FSE_decompress_wksp_body(dst, dstCapacity, cSrc, cSrcSize, maxLog, workSpace, wkspSize, 1);
|
371
371
|
}
|
@@ -89,9 +89,9 @@ HUF_PUBLIC_API size_t HUF_compress2 (void* dst, size_t dstCapacity,
|
|
89
89
|
|
90
90
|
/** HUF_compress4X_wksp() :
|
91
91
|
* Same as HUF_compress2(), but uses externally allocated `workSpace`.
|
92
|
-
* `workspace` must
|
93
|
-
#define HUF_WORKSPACE_SIZE ((
|
94
|
-
#define
|
92
|
+
* `workspace` must be at least as large as HUF_WORKSPACE_SIZE */
|
93
|
+
#define HUF_WORKSPACE_SIZE ((8 << 10) + 512 /* sorting scratch space */)
|
94
|
+
#define HUF_WORKSPACE_SIZE_U64 (HUF_WORKSPACE_SIZE / sizeof(U64))
|
95
95
|
HUF_PUBLIC_API size_t HUF_compress4X_wksp (void* dst, size_t dstCapacity,
|
96
96
|
const void* src, size_t srcSize,
|
97
97
|
unsigned maxSymbolValue, unsigned tableLog,
|
@@ -116,11 +116,11 @@ HUF_PUBLIC_API size_t HUF_compress4X_wksp (void* dst, size_t dstCapacity,
|
|
116
116
|
|
117
117
|
|
118
118
|
/* *** Constants *** */
|
119
|
-
#define HUF_TABLELOG_MAX 12 /* max runtime value of tableLog (due to static allocation); can be modified up to
|
119
|
+
#define HUF_TABLELOG_MAX 12 /* max runtime value of tableLog (due to static allocation); can be modified up to HUF_TABLELOG_ABSOLUTEMAX */
|
120
120
|
#define HUF_TABLELOG_DEFAULT 11 /* default tableLog value when none specified */
|
121
121
|
#define HUF_SYMBOLVALUE_MAX 255
|
122
122
|
|
123
|
-
#define HUF_TABLELOG_ABSOLUTEMAX
|
123
|
+
#define HUF_TABLELOG_ABSOLUTEMAX 12 /* absolute limit of HUF_MAX_TABLELOG. Beyond that value, code does not work */
|
124
124
|
#if (HUF_TABLELOG_MAX > HUF_TABLELOG_ABSOLUTEMAX)
|
125
125
|
# error "HUF_TABLELOG_MAX is too large !"
|
126
126
|
#endif
|
@@ -136,15 +136,11 @@ HUF_PUBLIC_API size_t HUF_compress4X_wksp (void* dst, size_t dstCapacity,
|
|
136
136
|
|
137
137
|
/* static allocation of HUF's Compression Table */
|
138
138
|
/* this is a private definition, just exposed for allocation and strict aliasing purpose. never EVER access its members directly */
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
}; /* typedef'd to HUF_CElt */
|
143
|
-
typedef struct HUF_CElt_s HUF_CElt; /* consider it an incomplete type */
|
144
|
-
#define HUF_CTABLE_SIZE_U32(maxSymbolValue) ((maxSymbolValue)+1) /* Use tables of U32, for proper alignment */
|
145
|
-
#define HUF_CTABLE_SIZE(maxSymbolValue) (HUF_CTABLE_SIZE_U32(maxSymbolValue) * sizeof(U32))
|
139
|
+
typedef size_t HUF_CElt; /* consider it an incomplete type */
|
140
|
+
#define HUF_CTABLE_SIZE_ST(maxSymbolValue) ((maxSymbolValue)+2) /* Use tables of size_t, for proper alignment */
|
141
|
+
#define HUF_CTABLE_SIZE(maxSymbolValue) (HUF_CTABLE_SIZE_ST(maxSymbolValue) * sizeof(size_t))
|
146
142
|
#define HUF_CREATE_STATIC_CTABLE(name, maxSymbolValue) \
|
147
|
-
HUF_CElt name[
|
143
|
+
HUF_CElt name[HUF_CTABLE_SIZE_ST(maxSymbolValue)] /* no final ; */
|
148
144
|
|
149
145
|
/* static allocation of HUF's DTable */
|
150
146
|
typedef U32 HUF_DTable;
|
@@ -194,6 +190,7 @@ size_t HUF_buildCTable (HUF_CElt* CTable, const unsigned* count, unsigned maxSym
|
|
194
190
|
size_t HUF_writeCTable (void* dst, size_t maxDstSize, const HUF_CElt* CTable, unsigned maxSymbolValue, unsigned huffLog);
|
195
191
|
size_t HUF_writeCTable_wksp(void* dst, size_t maxDstSize, const HUF_CElt* CTable, unsigned maxSymbolValue, unsigned huffLog, void* workspace, size_t workspaceSize);
|
196
192
|
size_t HUF_compress4X_usingCTable(void* dst, size_t dstSize, const void* src, size_t srcSize, const HUF_CElt* CTable);
|
193
|
+
size_t HUF_compress4X_usingCTable_bmi2(void* dst, size_t dstSize, const void* src, size_t srcSize, const HUF_CElt* CTable, int bmi2);
|
197
194
|
size_t HUF_estimateCompressedSize(const HUF_CElt* CTable, const unsigned* count, unsigned maxSymbolValue);
|
198
195
|
int HUF_validateCTable(const HUF_CElt* CTable, const unsigned* count, unsigned maxSymbolValue);
|
199
196
|
|
@@ -206,12 +203,13 @@ typedef enum {
|
|
206
203
|
* Same as HUF_compress4X_wksp(), but considers using hufTable if *repeat != HUF_repeat_none.
|
207
204
|
* If it uses hufTable it does not modify hufTable or repeat.
|
208
205
|
* If it doesn't, it sets *repeat = HUF_repeat_none, and it sets hufTable to the table used.
|
209
|
-
* If preferRepeat then the old table will always be used if valid.
|
206
|
+
* If preferRepeat then the old table will always be used if valid.
|
207
|
+
* If suspectUncompressible then some sampling checks will be run to potentially skip huffman coding */
|
210
208
|
size_t HUF_compress4X_repeat(void* dst, size_t dstSize,
|
211
209
|
const void* src, size_t srcSize,
|
212
210
|
unsigned maxSymbolValue, unsigned tableLog,
|
213
211
|
void* workSpace, size_t wkspSize, /**< `workSpace` must be aligned on 4-bytes boundaries, `wkspSize` must be >= HUF_WORKSPACE_SIZE */
|
214
|
-
HUF_CElt* hufTable, HUF_repeat* repeat, int preferRepeat, int bmi2);
|
212
|
+
HUF_CElt* hufTable, HUF_repeat* repeat, int preferRepeat, int bmi2, unsigned suspectUncompressible);
|
215
213
|
|
216
214
|
/** HUF_buildCTable_wksp() :
|
217
215
|
* Same as HUF_buildCTable(), but using externally allocated scratch buffer.
|
@@ -249,11 +247,10 @@ size_t HUF_readStats_wksp(BYTE* huffWeight, size_t hwSize,
|
|
249
247
|
* Loading a CTable saved with HUF_writeCTable() */
|
250
248
|
size_t HUF_readCTable (HUF_CElt* CTable, unsigned* maxSymbolValuePtr, const void* src, size_t srcSize, unsigned *hasZeroWeights);
|
251
249
|
|
252
|
-
/**
|
250
|
+
/** HUF_getNbBitsFromCTable() :
|
253
251
|
* Read nbBits from CTable symbolTable, for symbol `symbolValue` presumed <= HUF_SYMBOLVALUE_MAX
|
254
|
-
* Note 1 : is not inlined, as HUF_CElt definition is private
|
255
|
-
|
256
|
-
U32 HUF_getNbBits(const void* symbolTable, U32 symbolValue);
|
252
|
+
* Note 1 : is not inlined, as HUF_CElt definition is private */
|
253
|
+
U32 HUF_getNbBitsFromCTable(const HUF_CElt* symbolTable, U32 symbolValue);
|
257
254
|
|
258
255
|
/*
|
259
256
|
* HUF_decompress() does the following:
|
@@ -305,18 +302,20 @@ size_t HUF_decompress4X2_usingDTable(void* dst, size_t maxDstSize, const void* c
|
|
305
302
|
/* ====================== */
|
306
303
|
|
307
304
|
size_t HUF_compress1X (void* dst, size_t dstSize, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog);
|
308
|
-
size_t HUF_compress1X_wksp (void* dst, size_t dstSize, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog, void* workSpace, size_t wkspSize); /**< `workSpace` must be a table of at least
|
305
|
+
size_t HUF_compress1X_wksp (void* dst, size_t dstSize, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog, void* workSpace, size_t wkspSize); /**< `workSpace` must be a table of at least HUF_WORKSPACE_SIZE_U64 U64 */
|
309
306
|
size_t HUF_compress1X_usingCTable(void* dst, size_t dstSize, const void* src, size_t srcSize, const HUF_CElt* CTable);
|
307
|
+
size_t HUF_compress1X_usingCTable_bmi2(void* dst, size_t dstSize, const void* src, size_t srcSize, const HUF_CElt* CTable, int bmi2);
|
310
308
|
/** HUF_compress1X_repeat() :
|
311
309
|
* Same as HUF_compress1X_wksp(), but considers using hufTable if *repeat != HUF_repeat_none.
|
312
310
|
* If it uses hufTable it does not modify hufTable or repeat.
|
313
311
|
* If it doesn't, it sets *repeat = HUF_repeat_none, and it sets hufTable to the table used.
|
314
|
-
* If preferRepeat then the old table will always be used if valid.
|
312
|
+
* If preferRepeat then the old table will always be used if valid.
|
313
|
+
* If suspectUncompressible then some sampling checks will be run to potentially skip huffman coding */
|
315
314
|
size_t HUF_compress1X_repeat(void* dst, size_t dstSize,
|
316
315
|
const void* src, size_t srcSize,
|
317
316
|
unsigned maxSymbolValue, unsigned tableLog,
|
318
317
|
void* workSpace, size_t wkspSize, /**< `workSpace` must be aligned on 4-bytes boundaries, `wkspSize` must be >= HUF_WORKSPACE_SIZE */
|
319
|
-
HUF_CElt* hufTable, HUF_repeat* repeat, int preferRepeat, int bmi2);
|
318
|
+
HUF_CElt* hufTable, HUF_repeat* repeat, int preferRepeat, int bmi2, unsigned suspectUncompressible);
|
320
319
|
|
321
320
|
size_t HUF_decompress1X1 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize); /* single-symbol decoder */
|
322
321
|
#ifndef HUF_FORCE_DECOMPRESS_X1
|
@@ -354,6 +353,9 @@ size_t HUF_decompress4X_hufOnly_wksp_bmi2(HUF_DTable* dctx, void* dst, size_t ds
|
|
354
353
|
#ifndef HUF_FORCE_DECOMPRESS_X2
|
355
354
|
size_t HUF_readDTableX1_wksp_bmi2(HUF_DTable* DTable, const void* src, size_t srcSize, void* workSpace, size_t wkspSize, int bmi2);
|
356
355
|
#endif
|
356
|
+
#ifndef HUF_FORCE_DECOMPRESS_X1
|
357
|
+
size_t HUF_readDTableX2_wksp_bmi2(HUF_DTable* DTable, const void* src, size_t srcSize, void* workSpace, size_t wkspSize, int bmi2);
|
358
|
+
#endif
|
357
359
|
|
358
360
|
#endif /* HUF_STATIC_LINKING_ONLY */
|
359
361
|
|
@@ -51,6 +51,8 @@ extern "C" {
|
|
51
51
|
# include <stdint.h> /* intptr_t */
|
52
52
|
# endif
|
53
53
|
typedef uint8_t BYTE;
|
54
|
+
typedef uint8_t U8;
|
55
|
+
typedef int8_t S8;
|
54
56
|
typedef uint16_t U16;
|
55
57
|
typedef int16_t S16;
|
56
58
|
typedef uint32_t U32;
|
@@ -63,6 +65,8 @@ extern "C" {
|
|
63
65
|
# error "this implementation requires char to be exactly 8-bit type"
|
64
66
|
#endif
|
65
67
|
typedef unsigned char BYTE;
|
68
|
+
typedef unsigned char U8;
|
69
|
+
typedef signed char S8;
|
66
70
|
#if USHRT_MAX != 65535
|
67
71
|
# error "this implementation requires short to be exactly 16-bit type"
|
68
72
|
#endif
|
@@ -153,8 +157,22 @@ MEM_STATIC unsigned MEM_64bits(void) { return sizeof(size_t)==8; }
|
|
153
157
|
|
154
158
|
MEM_STATIC unsigned MEM_isLittleEndian(void)
|
155
159
|
{
|
160
|
+
#if defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
|
161
|
+
return 1;
|
162
|
+
#elif defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
|
163
|
+
return 0;
|
164
|
+
#elif defined(__clang__) && __LITTLE_ENDIAN__
|
165
|
+
return 1;
|
166
|
+
#elif defined(__clang__) && __BIG_ENDIAN__
|
167
|
+
return 0;
|
168
|
+
#elif defined(_MSC_VER) && (_M_AMD64 || _M_IX86)
|
169
|
+
return 1;
|
170
|
+
#elif defined(__DMC__) && defined(_M_IX86)
|
171
|
+
return 1;
|
172
|
+
#else
|
156
173
|
const union { U32 u; BYTE c[4]; } one = { 1 }; /* don't use static : performance detrimental */
|
157
174
|
return one.c[0];
|
175
|
+
#endif
|
158
176
|
}
|
159
177
|
|
160
178
|
#if defined(MEM_FORCE_MEMORY_ACCESS) && (MEM_FORCE_MEMORY_ACCESS==2)
|
@@ -0,0 +1,131 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (c) 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_PORTABILITY_MACROS_H
|
12
|
+
#define ZSTD_PORTABILITY_MACROS_H
|
13
|
+
|
14
|
+
/**
|
15
|
+
* This header file contains macro defintions to support portability.
|
16
|
+
* This header is shared between C and ASM code, so it MUST only
|
17
|
+
* contain macro definitions. It MUST not contain any C code.
|
18
|
+
*
|
19
|
+
* This header ONLY defines macros to detect platforms/feature support.
|
20
|
+
*
|
21
|
+
*/
|
22
|
+
|
23
|
+
|
24
|
+
/* compat. with non-clang compilers */
|
25
|
+
#ifndef __has_attribute
|
26
|
+
#define __has_attribute(x) 0
|
27
|
+
#endif
|
28
|
+
|
29
|
+
/* compat. with non-clang compilers */
|
30
|
+
#ifndef __has_builtin
|
31
|
+
# define __has_builtin(x) 0
|
32
|
+
#endif
|
33
|
+
|
34
|
+
/* compat. with non-clang compilers */
|
35
|
+
#ifndef __has_feature
|
36
|
+
# define __has_feature(x) 0
|
37
|
+
#endif
|
38
|
+
|
39
|
+
/* detects whether we are being compiled under msan */
|
40
|
+
#ifndef ZSTD_MEMORY_SANITIZER
|
41
|
+
# if __has_feature(memory_sanitizer)
|
42
|
+
# define ZSTD_MEMORY_SANITIZER 1
|
43
|
+
# else
|
44
|
+
# define ZSTD_MEMORY_SANITIZER 0
|
45
|
+
# endif
|
46
|
+
#endif
|
47
|
+
|
48
|
+
/* detects whether we are being compiled under asan */
|
49
|
+
#ifndef ZSTD_ADDRESS_SANITIZER
|
50
|
+
# if __has_feature(address_sanitizer)
|
51
|
+
# define ZSTD_ADDRESS_SANITIZER 1
|
52
|
+
# elif defined(__SANITIZE_ADDRESS__)
|
53
|
+
# define ZSTD_ADDRESS_SANITIZER 1
|
54
|
+
# else
|
55
|
+
# define ZSTD_ADDRESS_SANITIZER 0
|
56
|
+
# endif
|
57
|
+
#endif
|
58
|
+
|
59
|
+
/* detects whether we are being compiled under dfsan */
|
60
|
+
#ifndef ZSTD_DATAFLOW_SANITIZER
|
61
|
+
# if __has_feature(dataflow_sanitizer)
|
62
|
+
# define ZSTD_DATAFLOW_SANITIZER 1
|
63
|
+
# else
|
64
|
+
# define ZSTD_DATAFLOW_SANITIZER 0
|
65
|
+
# endif
|
66
|
+
#endif
|
67
|
+
|
68
|
+
|
69
|
+
/* Enable runtime BMI2 dispatch based on the CPU.
|
70
|
+
* Enabled for clang & gcc >=4.8 on x86 when BMI2 isn't enabled by default.
|
71
|
+
*/
|
72
|
+
#ifndef DYNAMIC_BMI2
|
73
|
+
#if ((defined(__clang__) && __has_attribute(__target__)) \
|
74
|
+
|| (defined(__GNUC__) \
|
75
|
+
&& (__GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)))) \
|
76
|
+
&& (defined(__x86_64__) || defined(_M_X64)) \
|
77
|
+
&& !defined(__BMI2__)
|
78
|
+
# define DYNAMIC_BMI2 1
|
79
|
+
#else
|
80
|
+
# define DYNAMIC_BMI2 0
|
81
|
+
#endif
|
82
|
+
#endif
|
83
|
+
|
84
|
+
/**
|
85
|
+
* Only enable assembly for GNUC comptabile compilers,
|
86
|
+
* because other platforms may not support GAS assembly syntax.
|
87
|
+
*
|
88
|
+
* Only enable assembly for Linux / MacOS, other platforms may
|
89
|
+
* work, but they haven't been tested. This could likely be
|
90
|
+
* extended to BSD systems.
|
91
|
+
*
|
92
|
+
* Disable assembly when MSAN is enabled, because MSAN requires
|
93
|
+
* 100% of code to be instrumented to work.
|
94
|
+
*/
|
95
|
+
#if defined(__GNUC__)
|
96
|
+
# if defined(__linux__) || defined(__linux) || defined(__APPLE__)
|
97
|
+
# if ZSTD_MEMORY_SANITIZER
|
98
|
+
# define ZSTD_ASM_SUPPORTED 0
|
99
|
+
# elif ZSTD_DATAFLOW_SANITIZER
|
100
|
+
# define ZSTD_ASM_SUPPORTED 0
|
101
|
+
# else
|
102
|
+
# define ZSTD_ASM_SUPPORTED 1
|
103
|
+
# endif
|
104
|
+
# else
|
105
|
+
# define ZSTD_ASM_SUPPORTED 0
|
106
|
+
# endif
|
107
|
+
#else
|
108
|
+
# define ZSTD_ASM_SUPPORTED 0
|
109
|
+
#endif
|
110
|
+
|
111
|
+
/**
|
112
|
+
* Determines whether we should enable assembly for x86-64
|
113
|
+
* with BMI2.
|
114
|
+
*
|
115
|
+
* Enable if all of the following conditions hold:
|
116
|
+
* - ASM hasn't been explicitly disabled by defining ZSTD_DISABLE_ASM
|
117
|
+
* - Assembly is supported
|
118
|
+
* - We are compiling for x86-64 and either:
|
119
|
+
* - DYNAMIC_BMI2 is enabled
|
120
|
+
* - BMI2 is supported at compile time
|
121
|
+
*/
|
122
|
+
#if !defined(ZSTD_DISABLE_ASM) && \
|
123
|
+
ZSTD_ASM_SUPPORTED && \
|
124
|
+
defined(__x86_64__) && \
|
125
|
+
(DYNAMIC_BMI2 || defined(__BMI2__))
|
126
|
+
# define ZSTD_ENABLE_ASM_X86_64_BMI2 1
|
127
|
+
#else
|
128
|
+
# define ZSTD_ENABLE_ASM_X86_64_BMI2 0
|
129
|
+
#endif
|
130
|
+
|
131
|
+
#endif /* ZSTD_PORTABILITY_MACROS_H */
|