zstd-ruby 1.5.0.0 → 1.5.2.0
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/.github/workflows/ruby.yml +2 -2
- data/README.md +1 -1
- data/ext/zstdruby/extconf.rb +2 -1
- 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/pool.c +11 -6
- data/ext/zstdruby/libzstd/common/pool.h +2 -2
- data/ext/zstdruby/libzstd/common/portability_macros.h +137 -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 +95 -92
- 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 +307 -373
- data/ext/zstdruby/libzstd/compress/zstd_compress_internal.h +174 -83
- 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 +15 -14
- data/ext/zstdruby/libzstd/compress/zstd_compress_superblock.c +4 -3
- data/ext/zstdruby/libzstd/compress/zstd_cwksp.h +41 -27
- data/ext/zstdruby/libzstd/compress/zstd_double_fast.c +295 -120
- data/ext/zstdruby/libzstd/compress/zstd_fast.c +309 -130
- data/ext/zstdruby/libzstd/compress/zstd_lazy.c +482 -562
- data/ext/zstdruby/libzstd/compress/zstd_ldm.c +9 -7
- 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 +249 -148
- data/ext/zstdruby/libzstd/compress/zstdmt_compress.c +76 -38
- data/ext/zstdruby/libzstd/compress/zstdmt_compress.h +4 -1
- data/ext/zstdruby/libzstd/decompress/huf_decompress.c +727 -189
- data/ext/zstdruby/libzstd/decompress/huf_decompress_amd64.S +585 -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 +101 -30
- 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 +203 -0
- data/ext/zstdruby/libzstd/libzstd.pc.in +1 -0
- data/ext/zstdruby/libzstd/module.modulemap +25 -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 +11 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3c33df57662a35d3eae35eb7b82afecf5e91191152edcef555b88aab4b803a3a
|
4
|
+
data.tar.gz: e3d5d34ff446b9a280bcb4e0fc103b4f6cb3312c37756145a578a05bfc237672
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3f0f2cab5053a1bd6ffc3af753aae2ba2d61c20623738e8c4214a9b67dedd6a76df1fdec888b1fe21fbc3334457d8fe4ed03c9ff17dcfbe19f55022846291ea3
|
7
|
+
data.tar.gz: 59ee08ebad25d6c1f21d3b611f7352db6b4cb219a047fe0d9782c9eaae17aa6972bc70e4818c91289e8f7c03cab0dea9db7ac06ce372295c718fa0dae5046c94
|
data/.github/workflows/ruby.yml
CHANGED
@@ -15,7 +15,7 @@ jobs:
|
|
15
15
|
runs-on: ubuntu-latest
|
16
16
|
strategy:
|
17
17
|
matrix:
|
18
|
-
ruby-version: ['2.
|
18
|
+
ruby-version: ['2.6', '2.7', '3.0', '3.1']
|
19
19
|
|
20
20
|
steps:
|
21
21
|
- uses: actions/checkout@v2
|
@@ -23,7 +23,7 @@ jobs:
|
|
23
23
|
# To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
|
24
24
|
# change this to (see https://github.com/ruby/setup-ruby#versioning):
|
25
25
|
# uses: ruby/setup-ruby@v1
|
26
|
-
uses: ruby/setup-ruby@
|
26
|
+
uses: ruby/setup-ruby@168d6a54b412713c0ed60998a78093a270ca8d84
|
27
27
|
with:
|
28
28
|
ruby-version: ${{ matrix.ruby-version }}
|
29
29
|
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
data/README.md
CHANGED
data/ext/zstdruby/extconf.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
require "mkmf"
|
2
2
|
|
3
3
|
$CFLAGS = '-I. -O3 -std=c99'
|
4
|
+
$CPPFLAGS += " -fdeclspec" if CONFIG['CXX'] =~ /clang/
|
4
5
|
|
5
6
|
Dir.chdir File.expand_path('..', __FILE__) do
|
6
|
-
|
7
|
+
$srcs = Dir['**/*.c', '**/*.S']
|
7
8
|
|
8
9
|
Dir.glob('libzstd/*') do |path|
|
9
10
|
if Dir.exist?(path)
|
@@ -8,110 +8,13 @@
|
|
8
8
|
# You may select, at your option, one of the above-listed licenses.
|
9
9
|
# ################################################################
|
10
10
|
|
11
|
-
# Note: by default, the static library is built single-threaded and dynamic library is built
|
12
|
-
# multi-threaded. It is possible to force multi or single threaded builds by appending
|
13
|
-
# -mt or -nomt to the build target (like lib-mt for multi-threaded, lib-nomt for single-threaded).
|
14
|
-
.PHONY: default
|
15
|
-
default: lib-release
|
16
|
-
|
17
|
-
# define silent mode as default (verbose mode with V=1 or VERBOSE=1)
|
18
|
-
$(V)$(VERBOSE).SILENT:
|
19
|
-
|
20
|
-
# When cross-compiling from linux to windows,
|
21
|
-
# one might need to specify TARGET_SYSTEM as "Windows."
|
22
|
-
# Building from Fedora fails without it.
|
23
|
-
# (but Ubuntu and Debian don't need to set anything)
|
24
|
-
TARGET_SYSTEM ?= $(OS)
|
25
|
-
|
26
|
-
# Version numbers
|
27
|
-
LIBVER_MAJOR_SCRIPT:=`sed -n '/define ZSTD_VERSION_MAJOR/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < ./zstd.h`
|
28
|
-
LIBVER_MINOR_SCRIPT:=`sed -n '/define ZSTD_VERSION_MINOR/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < ./zstd.h`
|
29
|
-
LIBVER_PATCH_SCRIPT:=`sed -n '/define ZSTD_VERSION_RELEASE/s/.*[[:blank:]]\([0-9][0-9]*\).*/\1/p' < ./zstd.h`
|
30
|
-
LIBVER_SCRIPT:= $(LIBVER_MAJOR_SCRIPT).$(LIBVER_MINOR_SCRIPT).$(LIBVER_PATCH_SCRIPT)
|
31
|
-
LIBVER_MAJOR := $(shell echo $(LIBVER_MAJOR_SCRIPT))
|
32
|
-
LIBVER_MINOR := $(shell echo $(LIBVER_MINOR_SCRIPT))
|
33
|
-
LIBVER_PATCH := $(shell echo $(LIBVER_PATCH_SCRIPT))
|
34
|
-
LIBVER := $(shell echo $(LIBVER_SCRIPT))
|
35
|
-
VERSION?= $(LIBVER)
|
36
|
-
CCVER := $(shell $(CC) --version)
|
37
|
-
|
38
|
-
# ZSTD_LIB_MINIFY is a helper variable that
|
39
|
-
# configures a bunch of other variables to space-optimized defaults.
|
40
|
-
ZSTD_LIB_MINIFY ?= 0
|
41
|
-
ifneq ($(ZSTD_LIB_MINIFY), 0)
|
42
|
-
HAVE_CC_OZ ?= $(shell echo "" | $(CC) -Oz -x c -c - -o /dev/null 2> /dev/null && echo 1 || echo 0)
|
43
|
-
ZSTD_LEGACY_SUPPORT ?= 0
|
44
|
-
ZSTD_LIB_DEPRECATED ?= 0
|
45
|
-
HUF_FORCE_DECOMPRESS_X1 ?= 1
|
46
|
-
ZSTD_FORCE_DECOMPRESS_SHORT ?= 1
|
47
|
-
ZSTD_NO_INLINE ?= 1
|
48
|
-
ZSTD_STRIP_ERROR_STRINGS ?= 1
|
49
|
-
ifneq ($(HAVE_CC_OZ), 0)
|
50
|
-
# Some compilers (clang) support an even more space-optimized setting.
|
51
|
-
CFLAGS += -Oz
|
52
|
-
else
|
53
|
-
CFLAGS += -Os
|
54
|
-
endif
|
55
|
-
CFLAGS += -fno-stack-protector -fomit-frame-pointer -fno-ident \
|
56
|
-
-DDYNAMIC_BMI2=0 -DNDEBUG
|
57
|
-
else
|
58
|
-
CFLAGS += -O3
|
59
|
-
endif
|
60
|
-
|
61
|
-
DEBUGLEVEL ?= 0
|
62
|
-
CPPFLAGS += -DXXH_NAMESPACE=ZSTD_ -DDEBUGLEVEL=$(DEBUGLEVEL)
|
63
|
-
ifeq ($(TARGET_SYSTEM),Windows_NT) # MinGW assumed
|
64
|
-
CPPFLAGS += -D__USE_MINGW_ANSI_STDIO # compatibility with %zu formatting
|
65
|
-
endif
|
66
|
-
DEBUGFLAGS= -Wall -Wextra -Wcast-qual -Wcast-align -Wshadow \
|
67
|
-
-Wstrict-aliasing=1 -Wswitch-enum -Wdeclaration-after-statement \
|
68
|
-
-Wstrict-prototypes -Wundef -Wpointer-arith \
|
69
|
-
-Wvla -Wformat=2 -Winit-self -Wfloat-equal -Wwrite-strings \
|
70
|
-
-Wredundant-decls -Wmissing-prototypes -Wc++-compat
|
71
|
-
CFLAGS += $(DEBUGFLAGS) $(MOREFLAGS)
|
72
|
-
FLAGS = $(CPPFLAGS) $(CFLAGS)
|
73
|
-
|
74
|
-
CPPFLAGS_DYNLIB = -DZSTD_MULTITHREAD # dynamic library build defaults to multi-threaded
|
75
|
-
LDFLAGS_DYNLIB = -pthread
|
76
|
-
CPPFLAGS_STATLIB = # static library build defaults to single-threaded
|
77
|
-
|
78
|
-
HAVE_COLORNEVER = $(shell echo a | grep --color=never a > /dev/null 2> /dev/null && echo 1 || echo 0)
|
79
|
-
GREP_OPTIONS ?=
|
80
|
-
ifeq ($HAVE_COLORNEVER, 1)
|
81
|
-
GREP_OPTIONS += --color=never
|
82
|
-
endif
|
83
|
-
GREP = grep $(GREP_OPTIONS)
|
84
|
-
SED_ERE_OPT ?= -E
|
85
|
-
|
86
|
-
ZSTDCOMMON_FILES := $(sort $(wildcard common/*.c))
|
87
|
-
ZSTDCOMP_FILES := $(sort $(wildcard compress/*.c))
|
88
|
-
ZSTDDECOMP_FILES := $(sort $(wildcard decompress/*.c))
|
89
|
-
ZDICT_FILES := $(sort $(wildcard dictBuilder/*.c))
|
90
|
-
ZDEPR_FILES := $(sort $(wildcard deprecated/*.c))
|
91
|
-
ZSTD_FILES := $(ZSTDCOMMON_FILES)
|
92
|
-
|
93
|
-
ifeq ($(findstring GCC,$(CCVER)),GCC)
|
94
|
-
decompress/zstd_decompress_block.o : CFLAGS+=-fno-tree-vectorize
|
95
|
-
endif
|
96
|
-
|
97
11
|
# Modules
|
98
12
|
ZSTD_LIB_COMPRESSION ?= 1
|
99
13
|
ZSTD_LIB_DECOMPRESSION ?= 1
|
100
14
|
ZSTD_LIB_DICTBUILDER ?= 1
|
101
15
|
ZSTD_LIB_DEPRECATED ?= 0
|
102
16
|
|
103
|
-
#
|
104
|
-
ZSTD_LEGACY_SUPPORT ?= 5
|
105
|
-
ZSTD_LEGACY_MULTITHREADED_API ?= 0
|
106
|
-
|
107
|
-
# Build size optimizations
|
108
|
-
HUF_FORCE_DECOMPRESS_X1 ?= 0
|
109
|
-
HUF_FORCE_DECOMPRESS_X2 ?= 0
|
110
|
-
ZSTD_FORCE_DECOMPRESS_SHORT ?= 0
|
111
|
-
ZSTD_FORCE_DECOMPRESS_LONG ?= 0
|
112
|
-
ZSTD_NO_INLINE ?= 0
|
113
|
-
ZSTD_STRIP_ERROR_STRINGS ?= 0
|
114
|
-
|
17
|
+
# Input variables for libzstd.mk
|
115
18
|
ifeq ($(ZSTD_LIB_COMPRESSION), 0)
|
116
19
|
ZSTD_LIB_DICTBUILDER = 0
|
117
20
|
ZSTD_LIB_DEPRECATED = 0
|
@@ -122,86 +25,46 @@ ifeq ($(ZSTD_LIB_DECOMPRESSION), 0)
|
|
122
25
|
ZSTD_LIB_DEPRECATED = 0
|
123
26
|
endif
|
124
27
|
|
28
|
+
include libzstd.mk
|
29
|
+
|
30
|
+
ZSTD_FILES := $(ZSTD_COMMON_FILES) $(ZSTD_LEGACY_FILES)
|
31
|
+
|
125
32
|
ifneq ($(ZSTD_LIB_COMPRESSION), 0)
|
126
|
-
ZSTD_FILES += $(
|
33
|
+
ZSTD_FILES += $(ZSTD_COMPRESS_FILES)
|
127
34
|
endif
|
128
35
|
|
129
36
|
ifneq ($(ZSTD_LIB_DECOMPRESSION), 0)
|
130
|
-
ZSTD_FILES += $(
|
37
|
+
ZSTD_FILES += $(ZSTD_DECOMPRESS_FILES)
|
131
38
|
endif
|
132
39
|
|
133
40
|
ifneq ($(ZSTD_LIB_DEPRECATED), 0)
|
134
|
-
ZSTD_FILES += $(
|
41
|
+
ZSTD_FILES += $(ZSTD_DEPRECATED_FILES)
|
135
42
|
endif
|
136
43
|
|
137
44
|
ifneq ($(ZSTD_LIB_DICTBUILDER), 0)
|
138
|
-
ZSTD_FILES += $(
|
139
|
-
endif
|
140
|
-
|
141
|
-
ifneq ($(HUF_FORCE_DECOMPRESS_X1), 0)
|
142
|
-
CFLAGS += -DHUF_FORCE_DECOMPRESS_X1
|
143
|
-
endif
|
144
|
-
|
145
|
-
ifneq ($(HUF_FORCE_DECOMPRESS_X2), 0)
|
146
|
-
CFLAGS += -DHUF_FORCE_DECOMPRESS_X2
|
147
|
-
endif
|
148
|
-
|
149
|
-
ifneq ($(ZSTD_FORCE_DECOMPRESS_SHORT), 0)
|
150
|
-
CFLAGS += -DZSTD_FORCE_DECOMPRESS_SHORT
|
151
|
-
endif
|
152
|
-
|
153
|
-
ifneq ($(ZSTD_FORCE_DECOMPRESS_LONG), 0)
|
154
|
-
CFLAGS += -DZSTD_FORCE_DECOMPRESS_LONG
|
155
|
-
endif
|
156
|
-
|
157
|
-
ifneq ($(ZSTD_NO_INLINE), 0)
|
158
|
-
CFLAGS += -DZSTD_NO_INLINE
|
159
|
-
endif
|
160
|
-
|
161
|
-
ifneq ($(ZSTD_STRIP_ERROR_STRINGS), 0)
|
162
|
-
CFLAGS += -DZSTD_STRIP_ERROR_STRINGS
|
45
|
+
ZSTD_FILES += $(ZSTD_DICTBUILDER_FILES)
|
163
46
|
endif
|
164
47
|
|
165
|
-
ifneq ($(ZSTD_LEGACY_MULTITHREADED_API), 0)
|
166
|
-
CFLAGS += -DZSTD_LEGACY_MULTITHREADED_API
|
167
|
-
endif
|
168
|
-
|
169
|
-
ifneq ($(ZSTD_LEGACY_SUPPORT), 0)
|
170
|
-
ifeq ($(shell test $(ZSTD_LEGACY_SUPPORT) -lt 8; echo $$?), 0)
|
171
|
-
ZSTD_FILES += $(shell ls legacy/*.c | $(GREP) 'v0[$(ZSTD_LEGACY_SUPPORT)-7]')
|
172
|
-
endif
|
173
|
-
endif
|
174
|
-
CPPFLAGS += -DZSTD_LEGACY_SUPPORT=$(ZSTD_LEGACY_SUPPORT)
|
175
|
-
|
176
48
|
ZSTD_LOCAL_SRC := $(notdir $(ZSTD_FILES))
|
177
|
-
|
49
|
+
ZSTD_LOCAL_OBJ0 := $(ZSTD_LOCAL_SRC:.c=.o)
|
50
|
+
ZSTD_LOCAL_OBJ := $(ZSTD_LOCAL_OBJ0:.S=.o)
|
178
51
|
|
179
|
-
|
180
|
-
vpath %.c $(ZSTD_SUBDIR)
|
52
|
+
VERSION := $(ZSTD_VERSION)
|
181
53
|
|
182
|
-
|
54
|
+
# Note: by default, the static library is built single-threaded and dynamic library is built
|
55
|
+
# multi-threaded. It is possible to force multi or single threaded builds by appending
|
56
|
+
# -mt or -nomt to the build target (like lib-mt for multi-threaded, lib-nomt for single-threaded).
|
57
|
+
.PHONY: default
|
58
|
+
default: lib-release
|
59
|
+
|
60
|
+
CPPFLAGS_DYNLIB += -DZSTD_MULTITHREAD # dynamic library build defaults to multi-threaded
|
61
|
+
LDFLAGS_DYNLIB += -pthread
|
62
|
+
CPPFLAGS_STATLIB += # static library build defaults to single-threaded
|
183
63
|
|
184
|
-
ifndef BUILD_DIR
|
185
|
-
ifeq ($(UNAME), Darwin)
|
186
|
-
ifeq ($(shell md5 < /dev/null > /dev/null; echo $$?), 0)
|
187
|
-
HASH ?= md5
|
188
|
-
endif
|
189
|
-
else ifeq ($(UNAME), FreeBSD)
|
190
|
-
HASH ?= gmd5sum
|
191
|
-
else ifeq ($(UNAME), NetBSD)
|
192
|
-
HASH ?= md5 -n
|
193
|
-
else ifeq ($(UNAME), OpenBSD)
|
194
|
-
HASH ?= md5
|
195
|
-
endif
|
196
|
-
HASH ?= md5sum
|
197
64
|
|
198
|
-
|
199
|
-
|
200
|
-
ifeq ($(HAVE_HASH),0)
|
201
|
-
$(info warning : could not find HASH ($(HASH)), needed to differentiate builds using different flags)
|
202
|
-
BUILD_DIR := obj/generic_noconf
|
65
|
+
ifeq ($(findstring GCC,$(CCVER)),GCC)
|
66
|
+
decompress/zstd_decompress_block.o : CFLAGS+=-fno-tree-vectorize
|
203
67
|
endif
|
204
|
-
endif # BUILD_DIR
|
205
68
|
|
206
69
|
|
207
70
|
# macOS linker doesn't support -soname, and use different extension
|
@@ -212,19 +75,16 @@ ifeq ($(UNAME), Darwin)
|
|
212
75
|
SHARED_EXT_VER = $(LIBVER).$(SHARED_EXT)
|
213
76
|
SONAME_FLAGS = -install_name $(LIBDIR)/libzstd.$(SHARED_EXT_MAJOR) -compatibility_version $(LIBVER_MAJOR) -current_version $(LIBVER)
|
214
77
|
else
|
215
|
-
|
78
|
+
ifeq ($(UNAME), AIX)
|
79
|
+
SONAME_FLAGS =
|
80
|
+
else
|
81
|
+
SONAME_FLAGS = -Wl,-soname=libzstd.$(SHARED_EXT).$(LIBVER_MAJOR)
|
82
|
+
endif
|
216
83
|
SHARED_EXT = so
|
217
84
|
SHARED_EXT_MAJOR = $(SHARED_EXT).$(LIBVER_MAJOR)
|
218
85
|
SHARED_EXT_VER = $(SHARED_EXT).$(LIBVER)
|
219
86
|
endif
|
220
87
|
|
221
|
-
SET_CACHE_DIRECTORY = \
|
222
|
-
+$(MAKE) --no-print-directory $@ \
|
223
|
-
BUILD_DIR=obj/$(HASH_DIR) \
|
224
|
-
CPPFLAGS="$(CPPFLAGS)" \
|
225
|
-
CFLAGS="$(CFLAGS)" \
|
226
|
-
LDFLAGS="$(LDFLAGS)"
|
227
|
-
|
228
88
|
|
229
89
|
.PHONY: all
|
230
90
|
all: lib
|
@@ -233,6 +93,13 @@ all: lib
|
|
233
93
|
.PHONY: libzstd.a # must be run every time
|
234
94
|
libzstd.a: CPPFLAGS += $(CPPFLAGS_STATLIB)
|
235
95
|
|
96
|
+
SET_CACHE_DIRECTORY = \
|
97
|
+
+$(MAKE) --no-print-directory $@ \
|
98
|
+
BUILD_DIR=obj/$(HASH_DIR) \
|
99
|
+
CPPFLAGS="$(CPPFLAGS)" \
|
100
|
+
CFLAGS="$(CFLAGS)" \
|
101
|
+
LDFLAGS="$(LDFLAGS)"
|
102
|
+
|
236
103
|
ifndef BUILD_DIR
|
237
104
|
# determine BUILD_DIR from compilation flags
|
238
105
|
|
@@ -343,6 +210,14 @@ $(ZSTD_STATLIB_DIR)/%.o : %.c $(ZSTD_STATLIB_DIR)/%.d | $(ZSTD_STATLIB_DIR)
|
|
343
210
|
@echo CC $@
|
344
211
|
$(COMPILE.c) $(DEPFLAGS) $(ZSTD_STATLIB_DIR)/$*.d $(OUTPUT_OPTION) $<
|
345
212
|
|
213
|
+
$(ZSTD_DYNLIB_DIR)/%.o : %.S | $(ZSTD_DYNLIB_DIR)
|
214
|
+
@echo AS $@
|
215
|
+
$(COMPILE.S) $(OUTPUT_OPTION) $<
|
216
|
+
|
217
|
+
$(ZSTD_STATLIB_DIR)/%.o : %.S | $(ZSTD_STATLIB_DIR)
|
218
|
+
@echo AS $@
|
219
|
+
$(COMPILE.S) $(OUTPUT_OPTION) $<
|
220
|
+
|
346
221
|
MKDIR ?= mkdir
|
347
222
|
$(BUILD_DIR) $(ZSTD_DYNLIB_DIR) $(ZSTD_STATLIB_DIR):
|
348
223
|
$(MKDIR) -p $@
|
@@ -374,9 +249,9 @@ clean:
|
|
374
249
|
#-----------------------------------------------------------------------------
|
375
250
|
# make install is validated only for below listed environments
|
376
251
|
#-----------------------------------------------------------------------------
|
377
|
-
ifneq (,$(filter $(UNAME),Linux Darwin GNU/kFreeBSD GNU OpenBSD FreeBSD NetBSD DragonFly SunOS Haiku))
|
252
|
+
ifneq (,$(filter $(UNAME),Linux Darwin GNU/kFreeBSD GNU OpenBSD FreeBSD NetBSD DragonFly SunOS Haiku AIX))
|
378
253
|
|
379
|
-
|
254
|
+
lib: libzstd.pc
|
380
255
|
|
381
256
|
HAS_EXPLICIT_EXEC_PREFIX := $(if $(or $(EXEC_PREFIX),$(exec_prefix)),1,)
|
382
257
|
|
@@ -421,16 +296,16 @@ INSTALL_PROGRAM ?= $(INSTALL)
|
|
421
296
|
INSTALL_DATA ?= $(INSTALL) -m 644
|
422
297
|
|
423
298
|
|
424
|
-
libzstd.pc:
|
425
299
|
libzstd.pc: libzstd.pc.in
|
426
300
|
@echo creating pkgconfig
|
427
301
|
@sed $(SED_ERE_OPT) \
|
428
302
|
-e 's|@PREFIX@|$(PREFIX)|' \
|
429
303
|
-e 's|@EXEC_PREFIX@|$(PCEXEC_PREFIX)|' \
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
304
|
+
-e 's|@INCLUDEDIR@|$(PCINCPREFIX)$(PCINCDIR)|' \
|
305
|
+
-e 's|@LIBDIR@|$(PCLIBPREFIX)$(PCLIBDIR)|' \
|
306
|
+
-e 's|@VERSION@|$(VERSION)|' \
|
307
|
+
-e 's|@LIBS_PRIVATE@|$(LDFLAGS_DYNLIB)|' \
|
308
|
+
$< >$@
|
434
309
|
|
435
310
|
.PHONY: install
|
436
311
|
install: install-pc install-static install-shared install-includes
|
@@ -125,7 +125,7 @@ The file structure is designed to make this selection manually achievable for an
|
|
125
125
|
`ZSTD_getErrorName` (implied by `ZSTD_LIB_MINIFY`).
|
126
126
|
|
127
127
|
Finally, when integrating into your application, make sure you're doing link-
|
128
|
-
time
|
128
|
+
time optimization and unused symbol garbage collection (via some combination of,
|
129
129
|
e.g., `-flto`, `-ffat-lto-objects`, `-fuse-linker-plugin`,
|
130
130
|
`-ffunction-sections`, `-fdata-sections`, `-fmerge-all-constants`,
|
131
131
|
`-Wl,--gc-sections`, `-Wl,-z,norelro`, and an archiver that understands
|
@@ -155,6 +155,12 @@ The file structure is designed to make this selection manually achievable for an
|
|
155
155
|
- The build macro `ZSTD_NO_INTRINSICS` can be defined to disable all explicit intrinsics.
|
156
156
|
Compiler builtins are still used.
|
157
157
|
|
158
|
+
- The build macro `ZSTD_DECODER_INTERNAL_BUFFER` can be set to control
|
159
|
+
the amount of extra memory used during decompression to store literals.
|
160
|
+
This defaults to 64kB. Reducing this value reduces the memory footprint of
|
161
|
+
`ZSTD_DCtx` decompression contexts,
|
162
|
+
but might also result in a small decompression speed cost.
|
163
|
+
|
158
164
|
|
159
165
|
#### Windows : using MinGW+MSYS to create DLL
|
160
166
|
|
@@ -143,10 +143,16 @@ MEM_STATIC unsigned BIT_highbit32 (U32 val)
|
|
143
143
|
{
|
144
144
|
# if defined(_MSC_VER) /* Visual */
|
145
145
|
# if STATIC_BMI2 == 1
|
146
|
-
|
146
|
+
return _lzcnt_u32(val) ^ 31;
|
147
147
|
# else
|
148
|
-
|
149
|
-
|
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
|
+
}
|
150
156
|
# endif
|
151
157
|
# elif defined(__GNUC__) && (__GNUC__ >= 3) /* Use GCC Intrinsic */
|
152
158
|
return __builtin_clz (val) ^ 31;
|
@@ -293,22 +299,22 @@ MEM_STATIC size_t BIT_initDStream(BIT_DStream_t* bitD, const void* srcBuffer, si
|
|
293
299
|
switch(srcSize)
|
294
300
|
{
|
295
301
|
case 7: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[6]) << (sizeof(bitD->bitContainer)*8 - 16);
|
296
|
-
|
302
|
+
ZSTD_FALLTHROUGH;
|
297
303
|
|
298
304
|
case 6: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[5]) << (sizeof(bitD->bitContainer)*8 - 24);
|
299
|
-
|
305
|
+
ZSTD_FALLTHROUGH;
|
300
306
|
|
301
307
|
case 5: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[4]) << (sizeof(bitD->bitContainer)*8 - 32);
|
302
|
-
|
308
|
+
ZSTD_FALLTHROUGH;
|
303
309
|
|
304
310
|
case 4: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[3]) << 24;
|
305
|
-
|
311
|
+
ZSTD_FALLTHROUGH;
|
306
312
|
|
307
313
|
case 3: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[2]) << 16;
|
308
|
-
|
314
|
+
ZSTD_FALLTHROUGH;
|
309
315
|
|
310
316
|
case 2: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[1]) << 8;
|
311
|
-
|
317
|
+
ZSTD_FALLTHROUGH;
|
312
318
|
|
313
319
|
default: break;
|
314
320
|
}
|
@@ -332,7 +338,16 @@ MEM_STATIC FORCE_INLINE_ATTR size_t BIT_getMiddleBits(size_t bitContainer, U32 c
|
|
332
338
|
U32 const regMask = sizeof(bitContainer)*8 - 1;
|
333
339
|
/* if start > regMask, bitstream is corrupted, and result is undefined */
|
334
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
|
335
349
|
return (bitContainer >> (start & regMask)) & BIT_mask[nbBits];
|
350
|
+
#endif
|
336
351
|
}
|
337
352
|
|
338
353
|
MEM_STATIC FORCE_INLINE_ATTR size_t BIT_getLowerBits(size_t bitContainer, U32 const nbBits)
|
@@ -11,6 +11,8 @@
|
|
11
11
|
#ifndef ZSTD_COMPILER_H
|
12
12
|
#define ZSTD_COMPILER_H
|
13
13
|
|
14
|
+
#include "portability_macros.h"
|
15
|
+
|
14
16
|
/*-*******************************************************
|
15
17
|
* Compiler specifics
|
16
18
|
*********************************************************/
|
@@ -40,7 +42,7 @@
|
|
40
42
|
|
41
43
|
/**
|
42
44
|
On MSVC qsort requires that functions passed into it use the __cdecl calling conversion(CC).
|
43
|
-
This
|
45
|
+
This explicitly marks such functions as __cdecl so that the code will still compile
|
44
46
|
if a CC other than __cdecl has been made the default.
|
45
47
|
*/
|
46
48
|
#if defined(_MSC_VER)
|
@@ -92,29 +94,17 @@
|
|
92
94
|
|
93
95
|
|
94
96
|
/* target attribute */
|
95
|
-
#ifndef __has_attribute
|
96
|
-
#define __has_attribute(x) 0 /* Compatibility with non-clang compilers. */
|
97
|
-
#endif
|
98
97
|
#if defined(__GNUC__) || defined(__ICCARM__)
|
99
98
|
# define TARGET_ATTRIBUTE(target) __attribute__((__target__(target)))
|
100
99
|
#else
|
101
100
|
# define TARGET_ATTRIBUTE(target)
|
102
101
|
#endif
|
103
102
|
|
104
|
-
/*
|
105
|
-
*
|
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
106
|
*/
|
107
|
-
#
|
108
|
-
#if ((defined(__clang__) && __has_attribute(__target__)) \
|
109
|
-
|| (defined(__GNUC__) \
|
110
|
-
&& (__GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)))) \
|
111
|
-
&& (defined(__x86_64__) || defined(_M_X86)) \
|
112
|
-
&& !defined(__BMI2__)
|
113
|
-
# define DYNAMIC_BMI2 1
|
114
|
-
#else
|
115
|
-
# define DYNAMIC_BMI2 0
|
116
|
-
#endif
|
117
|
-
#endif
|
107
|
+
#define BMI2_TARGET_ATTRIBUTE TARGET_ATTRIBUTE("lzcnt,bmi,bmi2")
|
118
108
|
|
119
109
|
/* prefetch
|
120
110
|
* can be disabled, by declaring NO_PREFETCH build macro */
|
@@ -150,8 +140,9 @@
|
|
150
140
|
}
|
151
141
|
|
152
142
|
/* vectorization
|
153
|
-
* older GCC (pre gcc-4.3 picked as the cutoff) uses a different syntax
|
154
|
-
|
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__)
|
155
146
|
# if (__GNUC__ == 4 && __GNUC_MINOR__ > 3) || (__GNUC__ >= 5)
|
156
147
|
# define DONT_VECTORIZE __attribute__((optimize("no-tree-vectorize")))
|
157
148
|
# else
|
@@ -197,25 +188,91 @@
|
|
197
188
|
#define STATIC_BMI2 0
|
198
189
|
#endif
|
199
190
|
|
200
|
-
/*
|
201
|
-
#
|
202
|
-
#
|
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
|
203
205
|
#endif
|
204
206
|
|
205
|
-
/*
|
206
|
-
#
|
207
|
-
#
|
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
|
208
212
|
#endif
|
209
213
|
|
210
|
-
/*
|
211
|
-
|
212
|
-
|
213
|
-
#
|
214
|
-
#
|
215
|
-
#
|
216
|
-
#
|
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
|
217
221
|
#endif
|
218
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
|
+
|
219
276
|
#if ZSTD_MEMORY_SANITIZER
|
220
277
|
/* Not all platforms that support msan provide sanitizers/msan_interface.h.
|
221
278
|
* We therefore declare the functions we need ourselves, rather than trying to
|
@@ -237,17 +294,6 @@ void __msan_poison(const volatile void *a, size_t size);
|
|
237
294
|
intptr_t __msan_test_shadow(const volatile void *x, size_t size);
|
238
295
|
#endif
|
239
296
|
|
240
|
-
/* detects whether we are being compiled under asan */
|
241
|
-
#ifndef ZSTD_ADDRESS_SANITIZER
|
242
|
-
# if __has_feature(address_sanitizer)
|
243
|
-
# define ZSTD_ADDRESS_SANITIZER 1
|
244
|
-
# elif defined(__SANITIZE_ADDRESS__)
|
245
|
-
# define ZSTD_ADDRESS_SANITIZER 1
|
246
|
-
# else
|
247
|
-
# define ZSTD_ADDRESS_SANITIZER 0
|
248
|
-
# endif
|
249
|
-
#endif
|
250
|
-
|
251
297
|
#if ZSTD_ADDRESS_SANITIZER
|
252
298
|
/* Not all platforms that support asan provide sanitizers/asan_interface.h.
|
253
299
|
* We therefore declare the functions we need ourselves, rather than trying to
|
@@ -43,8 +43,14 @@ static U32 FSE_ctz(U32 val)
|
|
43
43
|
assert(val != 0);
|
44
44
|
{
|
45
45
|
# if defined(_MSC_VER) /* Visual */
|
46
|
-
|
47
|
-
|
46
|
+
if (val != 0) {
|
47
|
+
unsigned long r;
|
48
|
+
_BitScanForward(&r, val);
|
49
|
+
return (unsigned)r;
|
50
|
+
} else {
|
51
|
+
/* Should not reach this code path */
|
52
|
+
__assume(0);
|
53
|
+
}
|
48
54
|
# elif defined(__GNUC__) && (__GNUC__ >= 3) /* GCC Intrinsic */
|
49
55
|
return __builtin_ctz(val);
|
50
56
|
# elif defined(__ICCARM__) /* IAR Intrinsic */
|
@@ -217,7 +223,7 @@ static size_t FSE_readNCount_body_default(
|
|
217
223
|
}
|
218
224
|
|
219
225
|
#if DYNAMIC_BMI2
|
220
|
-
|
226
|
+
BMI2_TARGET_ATTRIBUTE static size_t FSE_readNCount_body_bmi2(
|
221
227
|
short* normalizedCounter, unsigned* maxSVPtr, unsigned* tableLogPtr,
|
222
228
|
const void* headerBuffer, size_t hbSize)
|
223
229
|
{
|
@@ -299,7 +305,7 @@ HUF_readStats_body(BYTE* huffWeight, size_t hwSize, U32* rankStats,
|
|
299
305
|
ZSTD_memset(rankStats, 0, (HUF_TABLELOG_MAX + 1) * sizeof(U32));
|
300
306
|
weightTotal = 0;
|
301
307
|
{ U32 n; for (n=0; n<oSize; n++) {
|
302
|
-
if (huffWeight[n]
|
308
|
+
if (huffWeight[n] > HUF_TABLELOG_MAX) return ERROR(corruption_detected);
|
303
309
|
rankStats[huffWeight[n]]++;
|
304
310
|
weightTotal += (1 << huffWeight[n]) >> 1;
|
305
311
|
} }
|
@@ -337,7 +343,7 @@ static size_t HUF_readStats_body_default(BYTE* huffWeight, size_t hwSize, U32* r
|
|
337
343
|
}
|
338
344
|
|
339
345
|
#if DYNAMIC_BMI2
|
340
|
-
static
|
346
|
+
static BMI2_TARGET_ATTRIBUTE size_t HUF_readStats_body_bmi2(BYTE* huffWeight, size_t hwSize, U32* rankStats,
|
341
347
|
U32* nbSymbolsPtr, U32* tableLogPtr,
|
342
348
|
const void* src, size_t srcSize,
|
343
349
|
void* workSpace, size_t wkspSize)
|