brotli 0.4.0 → 0.5.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/main.yml +6 -3
- data/.github/workflows/publish.yml +7 -17
- data/.gitmodules +1 -1
- data/README.md +2 -2
- data/ext/brotli/brotli.c +1 -0
- data/ext/brotli/extconf.rb +6 -0
- data/lib/brotli/version.rb +1 -1
- data/test/brotli_test.rb +4 -1
- data/vendor/brotli/c/common/constants.c +1 -1
- data/vendor/brotli/c/common/constants.h +2 -1
- data/vendor/brotli/c/common/context.c +1 -1
- data/vendor/brotli/c/common/dictionary.c +5 -3
- data/vendor/brotli/c/common/platform.c +2 -1
- data/vendor/brotli/c/common/platform.h +60 -113
- data/vendor/brotli/c/common/shared_dictionary.c +521 -0
- data/vendor/brotli/c/common/shared_dictionary_internal.h +75 -0
- data/vendor/brotli/c/common/transform.c +1 -1
- data/vendor/brotli/c/common/version.h +31 -6
- data/vendor/brotli/c/dec/bit_reader.c +10 -8
- data/vendor/brotli/c/dec/bit_reader.h +172 -100
- data/vendor/brotli/c/dec/decode.c +467 -200
- data/vendor/brotli/c/dec/huffman.c +7 -4
- data/vendor/brotli/c/dec/huffman.h +2 -1
- data/vendor/brotli/c/dec/prefix.h +2 -1
- data/vendor/brotli/c/dec/state.c +33 -9
- data/vendor/brotli/c/dec/state.h +70 -35
- data/vendor/brotli/c/enc/backward_references.c +81 -19
- data/vendor/brotli/c/enc/backward_references.h +5 -4
- data/vendor/brotli/c/enc/backward_references_hq.c +148 -52
- data/vendor/brotli/c/enc/backward_references_hq.h +6 -5
- data/vendor/brotli/c/enc/backward_references_inc.h +31 -5
- data/vendor/brotli/c/enc/bit_cost.c +8 -7
- data/vendor/brotli/c/enc/bit_cost.h +5 -4
- data/vendor/brotli/c/enc/block_splitter.c +37 -14
- data/vendor/brotli/c/enc/block_splitter.h +5 -4
- data/vendor/brotli/c/enc/block_splitter_inc.h +86 -45
- data/vendor/brotli/c/enc/brotli_bit_stream.c +132 -110
- data/vendor/brotli/c/enc/brotli_bit_stream.h +11 -6
- data/vendor/brotli/c/enc/cluster.c +10 -9
- data/vendor/brotli/c/enc/cluster.h +7 -6
- data/vendor/brotli/c/enc/cluster_inc.h +25 -20
- data/vendor/brotli/c/enc/command.c +1 -1
- data/vendor/brotli/c/enc/command.h +5 -4
- data/vendor/brotli/c/enc/compound_dictionary.c +207 -0
- data/vendor/brotli/c/enc/compound_dictionary.h +74 -0
- data/vendor/brotli/c/enc/compress_fragment.c +93 -83
- data/vendor/brotli/c/enc/compress_fragment.h +32 -7
- data/vendor/brotli/c/enc/compress_fragment_two_pass.c +99 -87
- data/vendor/brotli/c/enc/compress_fragment_two_pass.h +21 -3
- data/vendor/brotli/c/enc/dictionary_hash.c +3 -1
- data/vendor/brotli/c/enc/encode.c +473 -404
- data/vendor/brotli/c/enc/encoder_dict.c +611 -4
- data/vendor/brotli/c/enc/encoder_dict.h +117 -3
- data/vendor/brotli/c/enc/entropy_encode.c +3 -2
- data/vendor/brotli/c/enc/entropy_encode.h +2 -1
- data/vendor/brotli/c/enc/entropy_encode_static.h +5 -2
- data/vendor/brotli/c/enc/fast_log.c +1 -1
- data/vendor/brotli/c/enc/fast_log.h +2 -1
- data/vendor/brotli/c/enc/find_match_length.h +15 -22
- data/vendor/brotli/c/enc/hash.h +285 -45
- data/vendor/brotli/c/enc/hash_composite_inc.h +26 -11
- data/vendor/brotli/c/enc/hash_forgetful_chain_inc.h +20 -18
- data/vendor/brotli/c/enc/hash_longest_match64_inc.h +34 -39
- data/vendor/brotli/c/enc/hash_longest_match_inc.h +6 -10
- data/vendor/brotli/c/enc/hash_longest_match_quickly_inc.h +4 -4
- data/vendor/brotli/c/enc/hash_rolling_inc.h +4 -4
- data/vendor/brotli/c/enc/hash_to_binary_tree_inc.h +6 -5
- data/vendor/brotli/c/enc/histogram.c +4 -4
- data/vendor/brotli/c/enc/histogram.h +7 -6
- data/vendor/brotli/c/enc/literal_cost.c +20 -15
- data/vendor/brotli/c/enc/literal_cost.h +4 -2
- data/vendor/brotli/c/enc/memory.c +29 -5
- data/vendor/brotli/c/enc/memory.h +19 -2
- data/vendor/brotli/c/enc/metablock.c +72 -58
- data/vendor/brotli/c/enc/metablock.h +9 -8
- data/vendor/brotli/c/enc/metablock_inc.h +8 -6
- data/vendor/brotli/c/enc/params.h +4 -3
- data/vendor/brotli/c/enc/prefix.h +3 -2
- data/vendor/brotli/c/enc/quality.h +40 -3
- data/vendor/brotli/c/enc/ringbuffer.h +4 -3
- data/vendor/brotli/c/enc/state.h +104 -0
- data/vendor/brotli/c/enc/static_dict.c +60 -4
- data/vendor/brotli/c/enc/static_dict.h +3 -2
- data/vendor/brotli/c/enc/static_dict_lut.h +2 -0
- data/vendor/brotli/c/enc/utf8_util.c +1 -1
- data/vendor/brotli/c/enc/utf8_util.h +2 -1
- data/vendor/brotli/c/enc/write_bits.h +2 -1
- data/vendor/brotli/c/include/brotli/decode.h +67 -2
- data/vendor/brotli/c/include/brotli/encode.h +55 -2
- data/vendor/brotli/c/include/brotli/port.h +28 -11
- data/vendor/brotli/c/include/brotli/shared_dictionary.h +100 -0
- metadata +9 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 97953895465e26d5937e5959f86954aa58de2d2221301bc64ff639e682565605
|
4
|
+
data.tar.gz: 4f26bccb546a19c743eea5b0fd9207f8e623bfd73f05e08f3dae275b76c51482
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b5e79aee2804a948da509247c56b1f79e9248927ec6430319b1d2b6202973ed41bca1ceba215f8d4954ad98a52637a91e49bfa316af4ab3d35fcb779f0e94aa3
|
7
|
+
data.tar.gz: 46d42e9297f79aef7481b068e43da47c60d45b0f781a0ceb1fc7626cdb9c59bc306feaab0b05321cba17e23256e492814f340725db8fb21dc9e4c84198507bf5
|
data/.github/workflows/main.yml
CHANGED
@@ -7,10 +7,10 @@ jobs:
|
|
7
7
|
strategy:
|
8
8
|
fail-fast: false
|
9
9
|
matrix:
|
10
|
-
ruby: [2.
|
10
|
+
ruby: [2.7, 3.1, 3.2, 3.3]
|
11
11
|
runs-on: ubuntu-latest
|
12
12
|
steps:
|
13
|
-
- uses: actions/checkout@
|
13
|
+
- uses: actions/checkout@v4
|
14
14
|
with:
|
15
15
|
submodules: true
|
16
16
|
- name: Set up Ruby
|
@@ -20,7 +20,10 @@ jobs:
|
|
20
20
|
bundler-cache: true
|
21
21
|
- name: Run the default task
|
22
22
|
run: |
|
23
|
-
bundle exec rake clobber
|
23
|
+
bundle exec rake clobber
|
24
|
+
bundle exec rake compile -- --enable-vendor
|
25
|
+
bundle exec rake test
|
26
|
+
bundle exec rake build
|
24
27
|
gem install --no-document "$(ls pkg/brotli-*.gem)"
|
25
28
|
cat <<EOF | ruby
|
26
29
|
require "brotli"
|
@@ -7,28 +7,18 @@ on:
|
|
7
7
|
|
8
8
|
jobs:
|
9
9
|
build:
|
10
|
-
|
11
|
-
fail-fast: false
|
12
|
-
matrix:
|
13
|
-
ruby: [2.7]
|
10
|
+
if: github.repository == 'miyucy/brotli'
|
14
11
|
runs-on: ubuntu-latest
|
12
|
+
permissions:
|
13
|
+
contents: write
|
14
|
+
id-token: write
|
15
15
|
steps:
|
16
|
-
- uses: actions/checkout@
|
16
|
+
- uses: actions/checkout@v4
|
17
17
|
with:
|
18
18
|
submodules: true
|
19
19
|
- name: Set up Ruby
|
20
20
|
uses: ruby/setup-ruby@v1
|
21
21
|
with:
|
22
|
-
ruby-version:
|
22
|
+
ruby-version: ruby
|
23
23
|
bundler-cache: true
|
24
|
-
-
|
25
|
-
run: |
|
26
|
-
mkdir -p ~/.gem
|
27
|
-
cat << EOF > ~/.gem/credentials
|
28
|
-
---
|
29
|
-
:github: Bearer ${{secrets.GITHUB_TOKEN}}
|
30
|
-
:rubygems_api_key: ${{secrets.RUBYGEMS_API_KEY}}
|
31
|
-
EOF
|
32
|
-
chmod 600 ~/.gem/credentials
|
33
|
-
bundle exec rake release[remote]
|
34
|
-
rm -f ~/.gem/credentials
|
24
|
+
- uses: rubygems/release-gem@v1
|
data/.gitmodules
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Brotli
|
1
|
+
# Brotli
|
2
2
|
|
3
3
|
Brotli is a Ruby implementation of the Brotli generic-purpose lossless
|
4
4
|
compression algorithm that compresses data using a combination of a modern
|
@@ -31,7 +31,7 @@ compressed = Brotli.deflate(string)
|
|
31
31
|
decompressed = Brotli.inflate(compressed)
|
32
32
|
```
|
33
33
|
|
34
|
-
See
|
34
|
+
See test/brotli_test.rb
|
35
35
|
|
36
36
|
## Development
|
37
37
|
|
data/ext/brotli/brotli.c
CHANGED
@@ -183,6 +183,7 @@ static BrotliEncoderState*
|
|
183
183
|
brotli_deflate_parse_options(BrotliEncoderState* s, VALUE opts)
|
184
184
|
{
|
185
185
|
if (!NIL_P(opts)) {
|
186
|
+
Check_Type(opts, T_HASH);
|
186
187
|
brotli_deflate_set_mode(s, rb_hash_aref(opts, CSTR2SYM("mode")));
|
187
188
|
brotli_deflate_set_quality(s, rb_hash_aref(opts, CSTR2SYM("quality")));
|
188
189
|
brotli_deflate_set_lgwin(s, rb_hash_aref(opts, CSTR2SYM("lgwin")));
|
data/ext/brotli/extconf.rb
CHANGED
@@ -13,6 +13,11 @@ have_dev_pkg = [
|
|
13
13
|
pkg_config("libbrotlienc")
|
14
14
|
].all? { |e| e }
|
15
15
|
|
16
|
+
if enable_config("vendor")
|
17
|
+
have_dev_pkg = false
|
18
|
+
Logging::message "Use vendor brotli\n"
|
19
|
+
end
|
20
|
+
|
16
21
|
$CPPFLAGS << " -DOS_MACOSX" if RbConfig::CONFIG["host_os"] =~ /darwin|mac os/
|
17
22
|
$INCFLAGS << " -I$(srcdir)/enc -I$(srcdir)/dec -I$(srcdir)/common -I$(srcdir)/include" unless have_dev_pkg
|
18
23
|
|
@@ -22,6 +27,7 @@ unless have_dev_pkg
|
|
22
27
|
__DIR__ = File.expand_path(File.dirname(__FILE__))
|
23
28
|
|
24
29
|
%w[enc dec common include].each do |dirname|
|
30
|
+
FileUtils.rm_rf dirname
|
25
31
|
FileUtils.mkdir_p dirname
|
26
32
|
FileUtils.cp_r(
|
27
33
|
File.expand_path(File.join(__DIR__, "..", "..", "vendor", "brotli", "c", dirname), __DIR__),
|
data/lib/brotli/version.rb
CHANGED
data/test/brotli_test.rb
CHANGED
@@ -23,7 +23,7 @@ class BrotliTest < Test::Unit::TestCase
|
|
23
23
|
|
24
24
|
sub_test_case ".version" do
|
25
25
|
test "returns string" do
|
26
|
-
assert_equal "1.0
|
26
|
+
assert_equal "1.1.0", Brotli.version
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
@@ -60,6 +60,9 @@ class BrotliTest < Test::Unit::TestCase
|
|
60
60
|
assert_raise ArgumentError do
|
61
61
|
Brotli.deflate(testdata, lgblock: 25)
|
62
62
|
end
|
63
|
+
assert_raise TypeError do
|
64
|
+
Brotli.deflate(testdata, 42)
|
65
|
+
end
|
63
66
|
end
|
64
67
|
end
|
65
68
|
|
@@ -12,10 +12,11 @@
|
|
12
12
|
#ifndef BROTLI_COMMON_CONSTANTS_H_
|
13
13
|
#define BROTLI_COMMON_CONSTANTS_H_
|
14
14
|
|
15
|
-
#include "./platform.h"
|
16
15
|
#include <brotli/port.h>
|
17
16
|
#include <brotli/types.h>
|
18
17
|
|
18
|
+
#include "platform.h"
|
19
|
+
|
19
20
|
/* Specification: 7.3. Encoding of the context map */
|
20
21
|
#define BROTLI_CONTEXT_MAP_MAX_RLE 16
|
21
22
|
|
@@ -4,8 +4,8 @@
|
|
4
4
|
See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
|
5
5
|
*/
|
6
6
|
|
7
|
-
#include "
|
8
|
-
#include "
|
7
|
+
#include "dictionary.h"
|
8
|
+
#include "platform.h"
|
9
9
|
|
10
10
|
#if defined(__cplusplus) || defined(c_plusplus)
|
11
11
|
extern "C" {
|
@@ -13,6 +13,7 @@ extern "C" {
|
|
13
13
|
|
14
14
|
#if !defined(BROTLI_EXTERNAL_DICTIONARY_DATA)
|
15
15
|
static const uint8_t kBrotliDictionaryData[] =
|
16
|
+
/* GENERATED CODE START */
|
16
17
|
{
|
17
18
|
116,105,109,101,100,111,119,110,108,105,102,101,108,101,102,116,98,97,99,107,99,
|
18
19
|
111,100,101,100,97,116,97,115,104,111,119,111,110,108,121,115,105,116,101,99,105
|
@@ -5860,6 +5861,7 @@ static const uint8_t kBrotliDictionaryData[] =
|
|
5860
5861
|
,164,181,224,164,190,224,164,136,224,164,184,224,164,149,224,165,141,224,164,176
|
5861
5862
|
,224,164,191,224,164,175,224,164,164,224,164,190
|
5862
5863
|
}
|
5864
|
+
/* GENERATED CODE END */
|
5863
5865
|
;
|
5864
5866
|
#endif /* !BROTLI_EXTERNAL_DICTIONARY_DATA */
|
5865
5867
|
|
@@ -5895,7 +5897,7 @@ static BrotliDictionary kBrotliDictionary = {
|
|
5895
5897
|
#endif
|
5896
5898
|
};
|
5897
5899
|
|
5898
|
-
const BrotliDictionary* BrotliGetDictionary() {
|
5900
|
+
const BrotliDictionary* BrotliGetDictionary(void) {
|
5899
5901
|
return &kBrotliDictionary;
|
5900
5902
|
}
|
5901
5903
|
|
@@ -12,12 +12,13 @@
|
|
12
12
|
* BROTLI_BUILD_BIG_ENDIAN forces to use big-endian optimizations
|
13
13
|
* BROTLI_BUILD_ENDIAN_NEUTRAL disables endian-aware optimizations
|
14
14
|
* BROTLI_BUILD_LITTLE_ENDIAN forces to use little-endian optimizations
|
15
|
-
* BROTLI_BUILD_PORTABLE disables dangerous optimizations, like unaligned
|
16
|
-
read and overlapping memcpy; this reduces decompression speed by 5%
|
17
15
|
* BROTLI_BUILD_NO_RBIT disables "rbit" optimization for ARM CPUs
|
16
|
+
* BROTLI_BUILD_NO_UNALIGNED_READ_FAST forces off the fast-unaligned-read
|
17
|
+
optimizations (mainly for testing purposes)
|
18
18
|
* BROTLI_DEBUG dumps file name and line number when decoder detects stream
|
19
19
|
or memory error
|
20
20
|
* BROTLI_ENABLE_LOG enables asserts and dumps various state information
|
21
|
+
* BROTLI_ENABLE_DUMP overrides default "dump" behaviour
|
21
22
|
*/
|
22
23
|
|
23
24
|
#ifndef BROTLI_COMMON_PLATFORM_H_
|
@@ -40,7 +41,7 @@
|
|
40
41
|
#define BROTLI_X_BIG_ENDIAN BIG_ENDIAN
|
41
42
|
#endif
|
42
43
|
|
43
|
-
#if BROTLI_MSVC_VERSION_CHECK(
|
44
|
+
#if BROTLI_MSVC_VERSION_CHECK(18, 0, 0)
|
44
45
|
#include <intrin.h>
|
45
46
|
#endif
|
46
47
|
|
@@ -156,24 +157,6 @@ OR:
|
|
156
157
|
#define BROTLI_NOINLINE
|
157
158
|
#endif
|
158
159
|
|
159
|
-
/* BROTLI_INTERNAL could be defined to override visibility, e.g. for tests. */
|
160
|
-
#if !defined(BROTLI_INTERNAL)
|
161
|
-
#if defined(_WIN32) || defined(__CYGWIN__)
|
162
|
-
#define BROTLI_INTERNAL
|
163
|
-
#elif BROTLI_GNUC_VERSION_CHECK(3, 3, 0) || \
|
164
|
-
BROTLI_TI_VERSION_CHECK(8, 0, 0) || \
|
165
|
-
BROTLI_INTEL_VERSION_CHECK(16, 0, 0) || \
|
166
|
-
BROTLI_ARM_VERSION_CHECK(4, 1, 0) || \
|
167
|
-
BROTLI_IBM_VERSION_CHECK(13, 1, 0) || \
|
168
|
-
BROTLI_SUNPRO_VERSION_CHECK(5, 11, 0) || \
|
169
|
-
(BROTLI_TI_VERSION_CHECK(7, 3, 0) && \
|
170
|
-
defined(__TI_GNU_ATTRIBUTE_SUPPORT__) && defined(__TI_EABI__))
|
171
|
-
#define BROTLI_INTERNAL __attribute__ ((visibility ("hidden")))
|
172
|
-
#else
|
173
|
-
#define BROTLI_INTERNAL
|
174
|
-
#endif
|
175
|
-
#endif
|
176
|
-
|
177
160
|
/* <<< <<< <<< end of hedley macros. */
|
178
161
|
|
179
162
|
#if BROTLI_GNUC_HAS_ATTRIBUTE(unused, 2, 7, 0) || \
|
@@ -226,15 +209,24 @@ OR:
|
|
226
209
|
#define BROTLI_TARGET_RISCV64
|
227
210
|
#endif
|
228
211
|
|
212
|
+
#if defined(__loongarch_lp64)
|
213
|
+
#define BROTLI_TARGET_LOONGARCH64
|
214
|
+
#endif
|
215
|
+
|
216
|
+
#if defined(BROTLI_TARGET_X64) || defined(BROTLI_TARGET_ARMV8_64) || \
|
217
|
+
defined(BROTLI_TARGET_POWERPC64) || defined(BROTLI_TARGET_RISCV64) || \
|
218
|
+
defined(BROTLI_TARGET_LOONGARCH64)
|
219
|
+
#define BROTLI_TARGET_64_BITS 1
|
220
|
+
#else
|
221
|
+
#define BROTLI_TARGET_64_BITS 0
|
222
|
+
#endif
|
223
|
+
|
229
224
|
#if defined(BROTLI_BUILD_64_BIT)
|
230
225
|
#define BROTLI_64_BITS 1
|
231
226
|
#elif defined(BROTLI_BUILD_32_BIT)
|
232
227
|
#define BROTLI_64_BITS 0
|
233
|
-
#elif defined(BROTLI_TARGET_X64) || defined(BROTLI_TARGET_ARMV8_64) || \
|
234
|
-
defined(BROTLI_TARGET_POWERPC64) || defined(BROTLI_TARGET_RISCV64)
|
235
|
-
#define BROTLI_64_BITS 1
|
236
228
|
#else
|
237
|
-
#define BROTLI_64_BITS
|
229
|
+
#define BROTLI_64_BITS BROTLI_TARGET_64_BITS
|
238
230
|
#endif
|
239
231
|
|
240
232
|
#if (BROTLI_64_BITS)
|
@@ -278,18 +270,19 @@ OR:
|
|
278
270
|
#undef BROTLI_X_BIG_ENDIAN
|
279
271
|
#endif
|
280
272
|
|
281
|
-
#if defined(
|
282
|
-
#define
|
283
|
-
#elif defined(BROTLI_TARGET_X86) || defined(BROTLI_TARGET_X64) ||
|
273
|
+
#if defined(BROTLI_BUILD_NO_UNALIGNED_READ_FAST)
|
274
|
+
#define BROTLI_UNALIGNED_READ_FAST (!!0)
|
275
|
+
#elif defined(BROTLI_TARGET_X86) || defined(BROTLI_TARGET_X64) || \
|
284
276
|
defined(BROTLI_TARGET_ARMV7) || defined(BROTLI_TARGET_ARMV8_ANY) || \
|
285
|
-
defined(BROTLI_TARGET_RISCV64)
|
286
|
-
/*
|
287
|
-
|
277
|
+
defined(BROTLI_TARGET_RISCV64) || defined(BROTLI_TARGET_LOONGARCH64)
|
278
|
+
/* These targets are known to generate efficient code for unaligned reads
|
279
|
+
* (e.g. a single instruction, not multiple 1-byte loads, shifted and or'd
|
280
|
+
* together). */
|
281
|
+
#define BROTLI_UNALIGNED_READ_FAST (!!1)
|
288
282
|
#else
|
289
|
-
#define
|
283
|
+
#define BROTLI_UNALIGNED_READ_FAST (!!0)
|
290
284
|
#endif
|
291
285
|
|
292
|
-
#if BROTLI_ALIGNED_READ
|
293
286
|
/* Portable unaligned memory access: read / write values via memcpy. */
|
294
287
|
static BROTLI_INLINE uint16_t BrotliUnalignedRead16(const void* p) {
|
295
288
|
uint16_t t;
|
@@ -309,75 +302,6 @@ static BROTLI_INLINE uint64_t BrotliUnalignedRead64(const void* p) {
|
|
309
302
|
static BROTLI_INLINE void BrotliUnalignedWrite64(void* p, uint64_t v) {
|
310
303
|
memcpy(p, &v, sizeof v);
|
311
304
|
}
|
312
|
-
#else /* BROTLI_ALIGNED_READ */
|
313
|
-
/* Unaligned memory access is allowed: just cast pointer to requested type. */
|
314
|
-
#if BROTLI_SANITIZED
|
315
|
-
/* Consider we have an unaligned load/store of 4 bytes from address 0x...05.
|
316
|
-
AddressSanitizer will treat it as a 3-byte access to the range 05:07 and
|
317
|
-
will miss a bug if 08 is the first unaddressable byte.
|
318
|
-
ThreadSanitizer will also treat this as a 3-byte access to 05:07 and will
|
319
|
-
miss a race between this access and some other accesses to 08.
|
320
|
-
MemorySanitizer will correctly propagate the shadow on unaligned stores
|
321
|
-
and correctly report bugs on unaligned loads, but it may not properly
|
322
|
-
update and report the origin of the uninitialized memory.
|
323
|
-
For all three tools, replacing an unaligned access with a tool-specific
|
324
|
-
callback solves the problem. */
|
325
|
-
#if defined(__cplusplus)
|
326
|
-
extern "C" {
|
327
|
-
#endif /* __cplusplus */
|
328
|
-
uint16_t __sanitizer_unaligned_load16(const void* p);
|
329
|
-
uint32_t __sanitizer_unaligned_load32(const void* p);
|
330
|
-
uint64_t __sanitizer_unaligned_load64(const void* p);
|
331
|
-
void __sanitizer_unaligned_store64(void* p, uint64_t v);
|
332
|
-
#if defined(__cplusplus)
|
333
|
-
} /* extern "C" */
|
334
|
-
#endif /* __cplusplus */
|
335
|
-
#define BrotliUnalignedRead16 __sanitizer_unaligned_load16
|
336
|
-
#define BrotliUnalignedRead32 __sanitizer_unaligned_load32
|
337
|
-
#define BrotliUnalignedRead64 __sanitizer_unaligned_load64
|
338
|
-
#define BrotliUnalignedWrite64 __sanitizer_unaligned_store64
|
339
|
-
#else /* BROTLI_SANITIZED */
|
340
|
-
static BROTLI_INLINE uint16_t BrotliUnalignedRead16(const void* p) {
|
341
|
-
return *(const uint16_t*)p;
|
342
|
-
}
|
343
|
-
static BROTLI_INLINE uint32_t BrotliUnalignedRead32(const void* p) {
|
344
|
-
return *(const uint32_t*)p;
|
345
|
-
}
|
346
|
-
#if (BROTLI_64_BITS)
|
347
|
-
static BROTLI_INLINE uint64_t BrotliUnalignedRead64(const void* p) {
|
348
|
-
return *(const uint64_t*)p;
|
349
|
-
}
|
350
|
-
static BROTLI_INLINE void BrotliUnalignedWrite64(void* p, uint64_t v) {
|
351
|
-
*(uint64_t*)p = v;
|
352
|
-
}
|
353
|
-
#else /* BROTLI_64_BITS */
|
354
|
-
/* Avoid emitting LDRD / STRD, which require properly aligned address. */
|
355
|
-
/* If __attribute__(aligned) is available, use that. Otherwise, memcpy. */
|
356
|
-
|
357
|
-
#if BROTLI_GNUC_HAS_ATTRIBUTE(aligned, 2, 7, 0)
|
358
|
-
typedef BROTLI_ALIGNED(1) uint64_t brotli_unaligned_uint64_t;
|
359
|
-
|
360
|
-
static BROTLI_INLINE uint64_t BrotliUnalignedRead64(const void* p) {
|
361
|
-
return (uint64_t) ((const brotli_unaligned_uint64_t*) p)[0];
|
362
|
-
}
|
363
|
-
static BROTLI_INLINE void BrotliUnalignedWrite64(void* p, uint64_t v) {
|
364
|
-
brotli_unaligned_uint64_t* dwords = (brotli_unaligned_uint64_t*) p;
|
365
|
-
dwords[0] = (brotli_unaligned_uint64_t) v;
|
366
|
-
}
|
367
|
-
#else /* BROTLI_GNUC_HAS_ATTRIBUTE(aligned, 2, 7, 0) */
|
368
|
-
static BROTLI_INLINE uint64_t BrotliUnalignedRead64(const void* p) {
|
369
|
-
uint64_t v;
|
370
|
-
memcpy(&v, p, sizeof(uint64_t));
|
371
|
-
return v;
|
372
|
-
}
|
373
|
-
|
374
|
-
static BROTLI_INLINE void BrotliUnalignedWrite64(void* p, uint64_t v) {
|
375
|
-
memcpy(p, &v, sizeof(uint64_t));
|
376
|
-
}
|
377
|
-
#endif /* BROTLI_GNUC_HAS_ATTRIBUTE(aligned, 2, 7, 0) */
|
378
|
-
#endif /* BROTLI_64_BITS */
|
379
|
-
#endif /* BROTLI_SANITIZED */
|
380
|
-
#endif /* BROTLI_ALIGNED_READ */
|
381
305
|
|
382
306
|
#if BROTLI_LITTLE_ENDIAN
|
383
307
|
/* Straight endianness. Just read / write values. */
|
@@ -453,6 +377,16 @@ static BROTLI_INLINE void BROTLI_UNALIGNED_STORE64LE(void* p, uint64_t v) {
|
|
453
377
|
}
|
454
378
|
#endif /* BROTLI_LITTLE_ENDIAN */
|
455
379
|
|
380
|
+
static BROTLI_INLINE void* BROTLI_UNALIGNED_LOAD_PTR(const void* p) {
|
381
|
+
void* v;
|
382
|
+
memcpy(&v, p, sizeof(void*));
|
383
|
+
return v;
|
384
|
+
}
|
385
|
+
|
386
|
+
static BROTLI_INLINE void BROTLI_UNALIGNED_STORE_PTR(void* p, const void* v) {
|
387
|
+
memcpy(p, &v, sizeof(void*));
|
388
|
+
}
|
389
|
+
|
456
390
|
/* BROTLI_IS_CONSTANT macros returns true for compile-time constants. */
|
457
391
|
#if BROTLI_GNUC_HAS_BUILTIN(__builtin_constant_p, 3, 0, 1) || \
|
458
392
|
BROTLI_INTEL_VERSION_CHECK(16, 0, 0)
|
@@ -474,22 +408,34 @@ static BROTLI_INLINE void BROTLI_UNALIGNED_STORE64LE(void* p, uint64_t v) {
|
|
474
408
|
#endif
|
475
409
|
|
476
410
|
#if defined(BROTLI_DEBUG) || defined(BROTLI_ENABLE_LOG)
|
411
|
+
#define BROTLI_ENABLE_DUMP_DEFAULT 1
|
477
412
|
#define BROTLI_DCHECK(x) assert(x)
|
413
|
+
#else
|
414
|
+
#define BROTLI_ENABLE_DUMP_DEFAULT 0
|
415
|
+
#define BROTLI_DCHECK(x)
|
416
|
+
#endif
|
417
|
+
|
418
|
+
#if !defined(BROTLI_ENABLE_DUMP)
|
419
|
+
#define BROTLI_ENABLE_DUMP BROTLI_ENABLE_DUMP_DEFAULT
|
420
|
+
#endif
|
421
|
+
|
422
|
+
#if BROTLI_ENABLE_DUMP
|
478
423
|
static BROTLI_INLINE void BrotliDump(const char* f, int l, const char* fn) {
|
479
424
|
fprintf(stderr, "%s:%d (%s)\n", f, l, fn);
|
480
425
|
fflush(stderr);
|
481
426
|
}
|
482
427
|
#define BROTLI_DUMP() BrotliDump(__FILE__, __LINE__, __FUNCTION__)
|
483
428
|
#else
|
484
|
-
#define BROTLI_DCHECK(x)
|
485
429
|
#define BROTLI_DUMP() (void)(0)
|
486
430
|
#endif
|
487
431
|
|
488
|
-
/*
|
432
|
+
/* BrotliRBit assumes brotli_reg_t fits native CPU register type. */
|
433
|
+
#if (BROTLI_64_BITS == BROTLI_TARGET_64_BITS)
|
434
|
+
/* TODO(eustas): add appropriate icc/sunpro/arm/ibm/ti checks. */
|
489
435
|
#if (BROTLI_GNUC_VERSION_CHECK(3, 0, 0) || defined(__llvm__)) && \
|
490
436
|
!defined(BROTLI_BUILD_NO_RBIT)
|
491
437
|
#if defined(BROTLI_TARGET_ARMV7) || defined(BROTLI_TARGET_ARMV8_ANY)
|
492
|
-
/* TODO: detect ARMv6T2 and enable this code for it. */
|
438
|
+
/* TODO(eustas): detect ARMv6T2 and enable this code for it. */
|
493
439
|
static BROTLI_INLINE brotli_reg_t BrotliRBit(brotli_reg_t input) {
|
494
440
|
brotli_reg_t output;
|
495
441
|
__asm__("rbit %0, %1\n" : "=r"(output) : "r"(input));
|
@@ -498,15 +444,14 @@ static BROTLI_INLINE brotli_reg_t BrotliRBit(brotli_reg_t input) {
|
|
498
444
|
#define BROTLI_RBIT(x) BrotliRBit(x)
|
499
445
|
#endif /* armv7 / armv8 */
|
500
446
|
#endif /* gcc || clang */
|
447
|
+
#endif /* brotli_reg_t is native */
|
501
448
|
#if !defined(BROTLI_RBIT)
|
502
449
|
static BROTLI_INLINE void BrotliRBit(void) { /* Should break build if used. */ }
|
503
450
|
#endif /* BROTLI_RBIT */
|
504
451
|
|
505
|
-
#define
|
506
|
-
|
507
|
-
|
508
|
-
if ((N & 4) != 0) {X; X; X; X;} \
|
509
|
-
}
|
452
|
+
#define BROTLI_REPEAT_4(X) {X; X; X; X;}
|
453
|
+
#define BROTLI_REPEAT_5(X) {X; X; X; X; X;}
|
454
|
+
#define BROTLI_REPEAT_6(X) {X; X; X; X; X; X;}
|
510
455
|
|
511
456
|
#define BROTLI_UNUSED(X) (void)(X)
|
512
457
|
|
@@ -529,7 +474,7 @@ BROTLI_MIN_MAX(size_t) BROTLI_MIN_MAX(uint32_t) BROTLI_MIN_MAX(uint8_t)
|
|
529
474
|
#if BROTLI_GNUC_HAS_BUILTIN(__builtin_ctzll, 3, 4, 0) || \
|
530
475
|
BROTLI_INTEL_VERSION_CHECK(16, 0, 0)
|
531
476
|
#define BROTLI_TZCNT64 __builtin_ctzll
|
532
|
-
#elif BROTLI_MSVC_VERSION_CHECK(
|
477
|
+
#elif BROTLI_MSVC_VERSION_CHECK(18, 0, 0)
|
533
478
|
#if defined(BROTLI_TARGET_X64)
|
534
479
|
#define BROTLI_TZCNT64 _tzcnt_u64
|
535
480
|
#else /* BROTLI_TARGET_X64 */
|
@@ -546,7 +491,7 @@ static BROTLI_INLINE uint32_t BrotliBsf64Msvc(uint64_t x) {
|
|
546
491
|
#if BROTLI_GNUC_HAS_BUILTIN(__builtin_clz, 3, 4, 0) || \
|
547
492
|
BROTLI_INTEL_VERSION_CHECK(16, 0, 0)
|
548
493
|
#define BROTLI_BSR32(x) (31u ^ (uint32_t)__builtin_clz(x))
|
549
|
-
#elif BROTLI_MSVC_VERSION_CHECK(
|
494
|
+
#elif BROTLI_MSVC_VERSION_CHECK(18, 0, 0)
|
550
495
|
static BROTLI_INLINE uint32_t BrotliBsr32Msvc(uint32_t x) {
|
551
496
|
unsigned long msb;
|
552
497
|
_BitScanReverse(&msb, x);
|
@@ -571,6 +516,8 @@ BROTLI_UNUSED_FUNCTION void BrotliSuppressUnusedFunctions(void) {
|
|
571
516
|
BROTLI_UNUSED(&BROTLI_UNALIGNED_LOAD32LE);
|
572
517
|
BROTLI_UNUSED(&BROTLI_UNALIGNED_LOAD64LE);
|
573
518
|
BROTLI_UNUSED(&BROTLI_UNALIGNED_STORE64LE);
|
519
|
+
BROTLI_UNUSED(&BROTLI_UNALIGNED_LOAD_PTR);
|
520
|
+
BROTLI_UNUSED(&BROTLI_UNALIGNED_STORE_PTR);
|
574
521
|
BROTLI_UNUSED(&BrotliRBit);
|
575
522
|
BROTLI_UNUSED(&brotli_min_double);
|
576
523
|
BROTLI_UNUSED(&brotli_max_double);
|
@@ -586,7 +533,7 @@ BROTLI_UNUSED_FUNCTION void BrotliSuppressUnusedFunctions(void) {
|
|
586
533
|
BROTLI_UNUSED(&brotli_max_uint8_t);
|
587
534
|
BROTLI_UNUSED(&BrotliDefaultAllocFunc);
|
588
535
|
BROTLI_UNUSED(&BrotliDefaultFreeFunc);
|
589
|
-
#if
|
536
|
+
#if BROTLI_ENABLE_DUMP
|
590
537
|
BROTLI_UNUSED(&BrotliDump);
|
591
538
|
#endif
|
592
539
|
}
|