extzstd 0.3.1 → 0.3.2
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/README.md +28 -14
 - data/contrib/zstd/CHANGELOG +114 -56
 - data/contrib/zstd/CONTRIBUTING.md +14 -0
 - data/contrib/zstd/Makefile +37 -31
 - data/contrib/zstd/README.md +6 -0
 - data/contrib/zstd/appveyor.yml +4 -1
 - data/contrib/zstd/lib/Makefile +231 -134
 - data/contrib/zstd/lib/README.md +28 -0
 - data/contrib/zstd/lib/common/bitstream.h +24 -15
 - data/contrib/zstd/lib/common/compiler.h +116 -3
 - data/contrib/zstd/lib/common/cpu.h +0 -2
 - data/contrib/zstd/lib/common/debug.h +11 -18
 - data/contrib/zstd/lib/common/entropy_common.c +188 -42
 - data/contrib/zstd/lib/common/error_private.c +1 -0
 - data/contrib/zstd/lib/common/error_private.h +1 -1
 - data/contrib/zstd/lib/common/fse.h +38 -11
 - data/contrib/zstd/lib/common/fse_decompress.c +123 -16
 - data/contrib/zstd/lib/common/huf.h +26 -5
 - data/contrib/zstd/lib/common/mem.h +66 -93
 - data/contrib/zstd/lib/common/pool.c +22 -16
 - data/contrib/zstd/lib/common/pool.h +1 -1
 - data/contrib/zstd/lib/common/threading.c +6 -5
 - data/contrib/zstd/lib/common/xxhash.c +18 -56
 - data/contrib/zstd/lib/common/xxhash.h +1 -1
 - data/contrib/zstd/lib/common/zstd_common.c +9 -9
 - data/contrib/zstd/lib/common/zstd_deps.h +111 -0
 - data/contrib/zstd/lib/common/zstd_errors.h +1 -0
 - data/contrib/zstd/lib/common/zstd_internal.h +89 -58
 - data/contrib/zstd/lib/compress/fse_compress.c +30 -23
 - data/contrib/zstd/lib/compress/hist.c +26 -28
 - data/contrib/zstd/lib/compress/hist.h +1 -1
 - data/contrib/zstd/lib/compress/huf_compress.c +210 -95
 - data/contrib/zstd/lib/compress/zstd_compress.c +1339 -409
 - data/contrib/zstd/lib/compress/zstd_compress_internal.h +119 -41
 - data/contrib/zstd/lib/compress/zstd_compress_literals.c +4 -4
 - data/contrib/zstd/lib/compress/zstd_compress_sequences.c +17 -3
 - data/contrib/zstd/lib/compress/zstd_compress_superblock.c +23 -19
 - data/contrib/zstd/lib/compress/zstd_cwksp.h +60 -24
 - data/contrib/zstd/lib/compress/zstd_double_fast.c +22 -22
 - data/contrib/zstd/lib/compress/zstd_fast.c +19 -19
 - data/contrib/zstd/lib/compress/zstd_lazy.c +351 -77
 - data/contrib/zstd/lib/compress/zstd_lazy.h +20 -0
 - data/contrib/zstd/lib/compress/zstd_ldm.c +59 -18
 - data/contrib/zstd/lib/compress/zstd_ldm.h +6 -0
 - data/contrib/zstd/lib/compress/zstd_opt.c +190 -45
 - data/contrib/zstd/lib/compress/zstdmt_compress.c +74 -406
 - data/contrib/zstd/lib/compress/zstdmt_compress.h +26 -108
 - data/contrib/zstd/lib/decompress/huf_decompress.c +302 -200
 - data/contrib/zstd/lib/decompress/zstd_ddict.c +8 -8
 - data/contrib/zstd/lib/decompress/zstd_ddict.h +1 -1
 - data/contrib/zstd/lib/decompress/zstd_decompress.c +125 -80
 - data/contrib/zstd/lib/decompress/zstd_decompress_block.c +145 -37
 - data/contrib/zstd/lib/decompress/zstd_decompress_block.h +5 -2
 - data/contrib/zstd/lib/decompress/zstd_decompress_internal.h +11 -10
 - data/contrib/zstd/lib/dictBuilder/cover.c +29 -20
 - data/contrib/zstd/lib/dictBuilder/cover.h +1 -1
 - data/contrib/zstd/lib/dictBuilder/fastcover.c +20 -19
 - data/contrib/zstd/lib/dictBuilder/zdict.c +15 -16
 - data/contrib/zstd/lib/dictBuilder/zdict.h +1 -1
 - data/contrib/zstd/lib/legacy/zstd_v01.c +5 -1
 - data/contrib/zstd/lib/legacy/zstd_v02.c +5 -1
 - data/contrib/zstd/lib/legacy/zstd_v03.c +5 -1
 - data/contrib/zstd/lib/legacy/zstd_v04.c +6 -2
 - data/contrib/zstd/lib/legacy/zstd_v05.c +5 -1
 - data/contrib/zstd/lib/legacy/zstd_v06.c +5 -1
 - data/contrib/zstd/lib/legacy/zstd_v07.c +5 -1
 - data/contrib/zstd/lib/libzstd.pc.in +3 -3
 - data/contrib/zstd/lib/zstd.h +348 -47
 - data/ext/extzstd.c +6 -0
 - data/ext/extzstd.h +6 -0
 - data/gemstub.rb +3 -21
 - data/lib/extzstd.rb +0 -2
 - data/lib/extzstd/version.rb +6 -1
 - data/test/test_basic.rb +0 -5
 - metadata +5 -4
 
| 
         @@ -14,7 +14,7 @@ 
     | 
|
| 
       14 
14 
     | 
    
         
             
            /*-*******************************************************
         
     | 
| 
       15 
15 
     | 
    
         
             
            *  Dependencies
         
     | 
| 
       16 
16 
     | 
    
         
             
            *********************************************************/
         
     | 
| 
       17 
     | 
    
         
            -
            #include  
     | 
| 
      
 17 
     | 
    
         
            +
            #include "../common/zstd_deps.h"   /* ZSTD_memcpy, ZSTD_memmove, ZSTD_memset */
         
     | 
| 
       18 
18 
     | 
    
         
             
            #include "../common/compiler.h"    /* prefetch */
         
     | 
| 
       19 
19 
     | 
    
         
             
            #include "../common/cpu.h"         /* bmi2 */
         
     | 
| 
       20 
20 
     | 
    
         
             
            #include "../common/mem.h"         /* low level memory routines */
         
     | 
| 
         @@ -44,7 +44,7 @@ 
     | 
|
| 
       44 
44 
     | 
    
         
             
            /*_*******************************************************
         
     | 
| 
       45 
45 
     | 
    
         
             
            *  Memory operations
         
     | 
| 
       46 
46 
     | 
    
         
             
            **********************************************************/
         
     | 
| 
       47 
     | 
    
         
            -
            static void ZSTD_copy4(void* dst, const void* src) {  
     | 
| 
      
 47 
     | 
    
         
            +
            static void ZSTD_copy4(void* dst, const void* src) { ZSTD_memcpy(dst, src, 4); }
         
     | 
| 
       48 
48 
     | 
    
         | 
| 
       49 
49 
     | 
    
         | 
| 
       50 
50 
     | 
    
         
             
            /*-*************************************************************
         
     | 
| 
         @@ -166,7 +166,7 @@ size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx, 
     | 
|
| 
       166 
166 
     | 
    
         
             
                            dctx->litSize = litSize;
         
     | 
| 
       167 
167 
     | 
    
         
             
                            dctx->litEntropy = 1;
         
     | 
| 
       168 
168 
     | 
    
         
             
                            if (litEncType==set_compressed) dctx->HUFptr = dctx->entropy.hufTable;
         
     | 
| 
       169 
     | 
    
         
            -
                             
     | 
| 
      
 169 
     | 
    
         
            +
                            ZSTD_memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH);
         
     | 
| 
       170 
170 
     | 
    
         
             
                            return litCSize + lhSize;
         
     | 
| 
       171 
171 
     | 
    
         
             
                        }
         
     | 
| 
       172 
172 
     | 
    
         | 
| 
         @@ -191,10 +191,10 @@ size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx, 
     | 
|
| 
       191 
191 
     | 
    
         | 
| 
       192 
192 
     | 
    
         
             
                            if (lhSize+litSize+WILDCOPY_OVERLENGTH > srcSize) {  /* risk reading beyond src buffer with wildcopy */
         
     | 
| 
       193 
193 
     | 
    
         
             
                                RETURN_ERROR_IF(litSize+lhSize > srcSize, corruption_detected, "");
         
     | 
| 
       194 
     | 
    
         
            -
                                 
     | 
| 
      
 194 
     | 
    
         
            +
                                ZSTD_memcpy(dctx->litBuffer, istart+lhSize, litSize);
         
     | 
| 
       195 
195 
     | 
    
         
             
                                dctx->litPtr = dctx->litBuffer;
         
     | 
| 
       196 
196 
     | 
    
         
             
                                dctx->litSize = litSize;
         
     | 
| 
       197 
     | 
    
         
            -
                                 
     | 
| 
      
 197 
     | 
    
         
            +
                                ZSTD_memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH);
         
     | 
| 
       198 
198 
     | 
    
         
             
                                return lhSize+litSize;
         
     | 
| 
       199 
199 
     | 
    
         
             
                            }
         
     | 
| 
       200 
200 
     | 
    
         
             
                            /* direct reference into compressed stream */
         
     | 
| 
         @@ -223,7 +223,7 @@ size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx, 
     | 
|
| 
       223 
223 
     | 
    
         
             
                                break;
         
     | 
| 
       224 
224 
     | 
    
         
             
                            }
         
     | 
| 
       225 
225 
     | 
    
         
             
                            RETURN_ERROR_IF(litSize > ZSTD_BLOCKSIZE_MAX, corruption_detected, "");
         
     | 
| 
       226 
     | 
    
         
            -
                             
     | 
| 
      
 226 
     | 
    
         
            +
                            ZSTD_memset(dctx->litBuffer, istart[lhSize], litSize + WILDCOPY_OVERLENGTH);
         
     | 
| 
       227 
227 
     | 
    
         
             
                            dctx->litPtr = dctx->litBuffer;
         
     | 
| 
       228 
228 
     | 
    
         
             
                            dctx->litSize = litSize;
         
     | 
| 
       229 
229 
     | 
    
         
             
                            return lhSize+1;
         
     | 
| 
         @@ -364,23 +364,26 @@ static void ZSTD_buildSeqTable_rle(ZSTD_seqSymbol* dt, U32 baseValue, U32 nbAddB 
     | 
|
| 
       364 
364 
     | 
    
         
             
             * generate FSE decoding table for one symbol (ll, ml or off)
         
     | 
| 
       365 
365 
     | 
    
         
             
             * cannot fail if input is valid =>
         
     | 
| 
       366 
366 
     | 
    
         
             
             * all inputs are presumed validated at this stage */
         
     | 
| 
       367 
     | 
    
         
            -
             
     | 
| 
       368 
     | 
    
         
            -
             
     | 
| 
      
 367 
     | 
    
         
            +
            FORCE_INLINE_TEMPLATE
         
     | 
| 
      
 368 
     | 
    
         
            +
            void ZSTD_buildFSETable_body(ZSTD_seqSymbol* dt,
         
     | 
| 
       369 
369 
     | 
    
         
             
                        const short* normalizedCounter, unsigned maxSymbolValue,
         
     | 
| 
       370 
370 
     | 
    
         
             
                        const U32* baseValue, const U32* nbAdditionalBits,
         
     | 
| 
       371 
     | 
    
         
            -
                        unsigned tableLog)
         
     | 
| 
      
 371 
     | 
    
         
            +
                        unsigned tableLog, void* wksp, size_t wkspSize)
         
     | 
| 
       372 
372 
     | 
    
         
             
            {
         
     | 
| 
       373 
373 
     | 
    
         
             
                ZSTD_seqSymbol* const tableDecode = dt+1;
         
     | 
| 
       374 
     | 
    
         
            -
                U16 symbolNext[MaxSeq+1];
         
     | 
| 
       375 
     | 
    
         
            -
             
     | 
| 
       376 
374 
     | 
    
         
             
                U32 const maxSV1 = maxSymbolValue + 1;
         
     | 
| 
       377 
375 
     | 
    
         
             
                U32 const tableSize = 1 << tableLog;
         
     | 
| 
       378 
     | 
    
         
            -
             
     | 
| 
      
 376 
     | 
    
         
            +
             
     | 
| 
      
 377 
     | 
    
         
            +
                U16* symbolNext = (U16*)wksp;
         
     | 
| 
      
 378 
     | 
    
         
            +
                BYTE* spread = (BYTE*)(symbolNext + MaxSeq + 1);
         
     | 
| 
      
 379 
     | 
    
         
            +
                U32 highThreshold = tableSize - 1;
         
     | 
| 
      
 380 
     | 
    
         
            +
             
     | 
| 
       379 
381 
     | 
    
         | 
| 
       380 
382 
     | 
    
         
             
                /* Sanity Checks */
         
     | 
| 
       381 
383 
     | 
    
         
             
                assert(maxSymbolValue <= MaxSeq);
         
     | 
| 
       382 
384 
     | 
    
         
             
                assert(tableLog <= MaxFSELog);
         
     | 
| 
       383 
     | 
    
         
            -
             
     | 
| 
      
 385 
     | 
    
         
            +
                assert(wkspSize >= ZSTD_BUILD_FSE_TABLE_WKSP_SIZE);
         
     | 
| 
      
 386 
     | 
    
         
            +
                (void)wkspSize;
         
     | 
| 
       384 
387 
     | 
    
         
             
                /* Init, lay down lowprob symbols */
         
     | 
| 
       385 
388 
     | 
    
         
             
                {   ZSTD_seqSymbol_header DTableH;
         
     | 
| 
       386 
389 
     | 
    
         
             
                    DTableH.tableLog = tableLog;
         
     | 
| 
         @@ -396,16 +399,69 @@ ZSTD_buildFSETable(ZSTD_seqSymbol* dt, 
     | 
|
| 
       396 
399 
     | 
    
         
             
                                assert(normalizedCounter[s]>=0);
         
     | 
| 
       397 
400 
     | 
    
         
             
                                symbolNext[s] = (U16)normalizedCounter[s];
         
     | 
| 
       398 
401 
     | 
    
         
             
                    }   }   }
         
     | 
| 
       399 
     | 
    
         
            -
                     
     | 
| 
      
 402 
     | 
    
         
            +
                    ZSTD_memcpy(dt, &DTableH, sizeof(DTableH));
         
     | 
| 
       400 
403 
     | 
    
         
             
                }
         
     | 
| 
       401 
404 
     | 
    
         | 
| 
       402 
405 
     | 
    
         
             
                /* Spread symbols */
         
     | 
| 
       403 
     | 
    
         
            -
                 
     | 
| 
      
 406 
     | 
    
         
            +
                assert(tableSize <= 512);
         
     | 
| 
      
 407 
     | 
    
         
            +
                /* Specialized symbol spreading for the case when there are
         
     | 
| 
      
 408 
     | 
    
         
            +
                 * no low probability (-1 count) symbols. When compressing
         
     | 
| 
      
 409 
     | 
    
         
            +
                 * small blocks we avoid low probability symbols to hit this
         
     | 
| 
      
 410 
     | 
    
         
            +
                 * case, since header decoding speed matters more.
         
     | 
| 
      
 411 
     | 
    
         
            +
                 */
         
     | 
| 
      
 412 
     | 
    
         
            +
                if (highThreshold == tableSize - 1) {
         
     | 
| 
      
 413 
     | 
    
         
            +
                    size_t const tableMask = tableSize-1;
         
     | 
| 
      
 414 
     | 
    
         
            +
                    size_t const step = FSE_TABLESTEP(tableSize);
         
     | 
| 
      
 415 
     | 
    
         
            +
                    /* First lay down the symbols in order.
         
     | 
| 
      
 416 
     | 
    
         
            +
                     * We use a uint64_t to lay down 8 bytes at a time. This reduces branch
         
     | 
| 
      
 417 
     | 
    
         
            +
                     * misses since small blocks generally have small table logs, so nearly
         
     | 
| 
      
 418 
     | 
    
         
            +
                     * all symbols have counts <= 8. We ensure we have 8 bytes at the end of
         
     | 
| 
      
 419 
     | 
    
         
            +
                     * our buffer to handle the over-write.
         
     | 
| 
      
 420 
     | 
    
         
            +
                     */
         
     | 
| 
      
 421 
     | 
    
         
            +
                    {
         
     | 
| 
      
 422 
     | 
    
         
            +
                        U64 const add = 0x0101010101010101ull;
         
     | 
| 
      
 423 
     | 
    
         
            +
                        size_t pos = 0;
         
     | 
| 
      
 424 
     | 
    
         
            +
                        U64 sv = 0;
         
     | 
| 
      
 425 
     | 
    
         
            +
                        U32 s;
         
     | 
| 
      
 426 
     | 
    
         
            +
                        for (s=0; s<maxSV1; ++s, sv += add) {
         
     | 
| 
      
 427 
     | 
    
         
            +
                            int i;
         
     | 
| 
      
 428 
     | 
    
         
            +
                            int const n = normalizedCounter[s];
         
     | 
| 
      
 429 
     | 
    
         
            +
                            MEM_write64(spread + pos, sv);
         
     | 
| 
      
 430 
     | 
    
         
            +
                            for (i = 8; i < n; i += 8) {
         
     | 
| 
      
 431 
     | 
    
         
            +
                                MEM_write64(spread + pos + i, sv);
         
     | 
| 
      
 432 
     | 
    
         
            +
                            }
         
     | 
| 
      
 433 
     | 
    
         
            +
                            pos += n;
         
     | 
| 
      
 434 
     | 
    
         
            +
                        }
         
     | 
| 
      
 435 
     | 
    
         
            +
                    }
         
     | 
| 
      
 436 
     | 
    
         
            +
                    /* Now we spread those positions across the table.
         
     | 
| 
      
 437 
     | 
    
         
            +
                     * The benefit of doing it in two stages is that we avoid the the
         
     | 
| 
      
 438 
     | 
    
         
            +
                     * variable size inner loop, which caused lots of branch misses.
         
     | 
| 
      
 439 
     | 
    
         
            +
                     * Now we can run through all the positions without any branch misses.
         
     | 
| 
      
 440 
     | 
    
         
            +
                     * We unroll the loop twice, since that is what emperically worked best.
         
     | 
| 
      
 441 
     | 
    
         
            +
                     */
         
     | 
| 
      
 442 
     | 
    
         
            +
                    {
         
     | 
| 
      
 443 
     | 
    
         
            +
                        size_t position = 0;
         
     | 
| 
      
 444 
     | 
    
         
            +
                        size_t s;
         
     | 
| 
      
 445 
     | 
    
         
            +
                        size_t const unroll = 2;
         
     | 
| 
      
 446 
     | 
    
         
            +
                        assert(tableSize % unroll == 0); /* FSE_MIN_TABLELOG is 5 */
         
     | 
| 
      
 447 
     | 
    
         
            +
                        for (s = 0; s < (size_t)tableSize; s += unroll) {
         
     | 
| 
      
 448 
     | 
    
         
            +
                            size_t u;
         
     | 
| 
      
 449 
     | 
    
         
            +
                            for (u = 0; u < unroll; ++u) {
         
     | 
| 
      
 450 
     | 
    
         
            +
                                size_t const uPosition = (position + (u * step)) & tableMask;
         
     | 
| 
      
 451 
     | 
    
         
            +
                                tableDecode[uPosition].baseValue = spread[s + u];
         
     | 
| 
      
 452 
     | 
    
         
            +
                            }
         
     | 
| 
      
 453 
     | 
    
         
            +
                            position = (position + (unroll * step)) & tableMask;
         
     | 
| 
      
 454 
     | 
    
         
            +
                        }
         
     | 
| 
      
 455 
     | 
    
         
            +
                        assert(position == 0);
         
     | 
| 
      
 456 
     | 
    
         
            +
                    }
         
     | 
| 
      
 457 
     | 
    
         
            +
                } else {
         
     | 
| 
      
 458 
     | 
    
         
            +
                    U32 const tableMask = tableSize-1;
         
     | 
| 
       404 
459 
     | 
    
         
             
                    U32 const step = FSE_TABLESTEP(tableSize);
         
     | 
| 
       405 
460 
     | 
    
         
             
                    U32 s, position = 0;
         
     | 
| 
       406 
461 
     | 
    
         
             
                    for (s=0; s<maxSV1; s++) {
         
     | 
| 
       407 
462 
     | 
    
         
             
                        int i;
         
     | 
| 
       408 
     | 
    
         
            -
                         
     | 
| 
      
 463 
     | 
    
         
            +
                        int const n = normalizedCounter[s];
         
     | 
| 
      
 464 
     | 
    
         
            +
                        for (i=0; i<n; i++) {
         
     | 
| 
       409 
465 
     | 
    
         
             
                            tableDecode[position].baseValue = s;
         
     | 
| 
       410 
466 
     | 
    
         
             
                            position = (position + step) & tableMask;
         
     | 
| 
       411 
467 
     | 
    
         
             
                            while (position > highThreshold) position = (position + step) & tableMask;   /* lowprob area */
         
     | 
| 
         @@ -414,7 +470,8 @@ ZSTD_buildFSETable(ZSTD_seqSymbol* dt, 
     | 
|
| 
       414 
470 
     | 
    
         
             
                }
         
     | 
| 
       415 
471 
     | 
    
         | 
| 
       416 
472 
     | 
    
         
             
                /* Build Decoding table */
         
     | 
| 
       417 
     | 
    
         
            -
                { 
     | 
| 
      
 473 
     | 
    
         
            +
                {
         
     | 
| 
      
 474 
     | 
    
         
            +
                    U32 u;
         
     | 
| 
       418 
475 
     | 
    
         
             
                    for (u=0; u<tableSize; u++) {
         
     | 
| 
       419 
476 
     | 
    
         
             
                        U32 const symbol = tableDecode[u].baseValue;
         
     | 
| 
       420 
477 
     | 
    
         
             
                        U32 const nextState = symbolNext[symbol]++;
         
     | 
| 
         @@ -423,7 +480,46 @@ ZSTD_buildFSETable(ZSTD_seqSymbol* dt, 
     | 
|
| 
       423 
480 
     | 
    
         
             
                        assert(nbAdditionalBits[symbol] < 255);
         
     | 
| 
       424 
481 
     | 
    
         
             
                        tableDecode[u].nbAdditionalBits = (BYTE)nbAdditionalBits[symbol];
         
     | 
| 
       425 
482 
     | 
    
         
             
                        tableDecode[u].baseValue = baseValue[symbol];
         
     | 
| 
       426 
     | 
    
         
            -
             
     | 
| 
      
 483 
     | 
    
         
            +
                    }
         
     | 
| 
      
 484 
     | 
    
         
            +
                }
         
     | 
| 
      
 485 
     | 
    
         
            +
            }
         
     | 
| 
      
 486 
     | 
    
         
            +
             
     | 
| 
      
 487 
     | 
    
         
            +
            /* Avoids the FORCE_INLINE of the _body() function. */
         
     | 
| 
      
 488 
     | 
    
         
            +
            static void ZSTD_buildFSETable_body_default(ZSTD_seqSymbol* dt,
         
     | 
| 
      
 489 
     | 
    
         
            +
                        const short* normalizedCounter, unsigned maxSymbolValue,
         
     | 
| 
      
 490 
     | 
    
         
            +
                        const U32* baseValue, const U32* nbAdditionalBits,
         
     | 
| 
      
 491 
     | 
    
         
            +
                        unsigned tableLog, void* wksp, size_t wkspSize)
         
     | 
| 
      
 492 
     | 
    
         
            +
            {
         
     | 
| 
      
 493 
     | 
    
         
            +
                ZSTD_buildFSETable_body(dt, normalizedCounter, maxSymbolValue,
         
     | 
| 
      
 494 
     | 
    
         
            +
                        baseValue, nbAdditionalBits, tableLog, wksp, wkspSize);
         
     | 
| 
      
 495 
     | 
    
         
            +
            }
         
     | 
| 
      
 496 
     | 
    
         
            +
             
     | 
| 
      
 497 
     | 
    
         
            +
            #if DYNAMIC_BMI2
         
     | 
| 
      
 498 
     | 
    
         
            +
            TARGET_ATTRIBUTE("bmi2") static void ZSTD_buildFSETable_body_bmi2(ZSTD_seqSymbol* dt,
         
     | 
| 
      
 499 
     | 
    
         
            +
                        const short* normalizedCounter, unsigned maxSymbolValue,
         
     | 
| 
      
 500 
     | 
    
         
            +
                        const U32* baseValue, const U32* nbAdditionalBits,
         
     | 
| 
      
 501 
     | 
    
         
            +
                        unsigned tableLog, void* wksp, size_t wkspSize)
         
     | 
| 
      
 502 
     | 
    
         
            +
            {
         
     | 
| 
      
 503 
     | 
    
         
            +
                ZSTD_buildFSETable_body(dt, normalizedCounter, maxSymbolValue,
         
     | 
| 
      
 504 
     | 
    
         
            +
                        baseValue, nbAdditionalBits, tableLog, wksp, wkspSize);
         
     | 
| 
      
 505 
     | 
    
         
            +
            }
         
     | 
| 
      
 506 
     | 
    
         
            +
            #endif
         
     | 
| 
      
 507 
     | 
    
         
            +
             
     | 
| 
      
 508 
     | 
    
         
            +
            void ZSTD_buildFSETable(ZSTD_seqSymbol* dt,
         
     | 
| 
      
 509 
     | 
    
         
            +
                        const short* normalizedCounter, unsigned maxSymbolValue,
         
     | 
| 
      
 510 
     | 
    
         
            +
                        const U32* baseValue, const U32* nbAdditionalBits,
         
     | 
| 
      
 511 
     | 
    
         
            +
                        unsigned tableLog, void* wksp, size_t wkspSize, int bmi2)
         
     | 
| 
      
 512 
     | 
    
         
            +
            {
         
     | 
| 
      
 513 
     | 
    
         
            +
            #if DYNAMIC_BMI2
         
     | 
| 
      
 514 
     | 
    
         
            +
                if (bmi2) {
         
     | 
| 
      
 515 
     | 
    
         
            +
                    ZSTD_buildFSETable_body_bmi2(dt, normalizedCounter, maxSymbolValue,
         
     | 
| 
      
 516 
     | 
    
         
            +
                            baseValue, nbAdditionalBits, tableLog, wksp, wkspSize);
         
     | 
| 
      
 517 
     | 
    
         
            +
                    return;
         
     | 
| 
      
 518 
     | 
    
         
            +
                }
         
     | 
| 
      
 519 
     | 
    
         
            +
            #endif
         
     | 
| 
      
 520 
     | 
    
         
            +
                (void)bmi2;
         
     | 
| 
      
 521 
     | 
    
         
            +
                ZSTD_buildFSETable_body_default(dt, normalizedCounter, maxSymbolValue,
         
     | 
| 
      
 522 
     | 
    
         
            +
                        baseValue, nbAdditionalBits, tableLog, wksp, wkspSize);
         
     | 
| 
       427 
523 
     | 
    
         
             
            }
         
     | 
| 
       428 
524 
     | 
    
         | 
| 
       429 
525 
     | 
    
         | 
| 
         @@ -435,7 +531,8 @@ static size_t ZSTD_buildSeqTable(ZSTD_seqSymbol* DTableSpace, const ZSTD_seqSymb 
     | 
|
| 
       435 
531 
     | 
    
         
             
                                             const void* src, size_t srcSize,
         
     | 
| 
       436 
532 
     | 
    
         
             
                                             const U32* baseValue, const U32* nbAdditionalBits,
         
     | 
| 
       437 
533 
     | 
    
         
             
                                             const ZSTD_seqSymbol* defaultTable, U32 flagRepeatTable,
         
     | 
| 
       438 
     | 
    
         
            -
                                             int ddictIsCold, int nbSeq 
     | 
| 
      
 534 
     | 
    
         
            +
                                             int ddictIsCold, int nbSeq, U32* wksp, size_t wkspSize,
         
     | 
| 
      
 535 
     | 
    
         
            +
                                             int bmi2)
         
     | 
| 
       439 
536 
     | 
    
         
             
            {
         
     | 
| 
       440 
537 
     | 
    
         
             
                switch(type)
         
     | 
| 
       441 
538 
     | 
    
         
             
                {
         
     | 
| 
         @@ -467,7 +564,7 @@ static size_t ZSTD_buildSeqTable(ZSTD_seqSymbol* DTableSpace, const ZSTD_seqSymb 
     | 
|
| 
       467 
564 
     | 
    
         
             
                        size_t const headerSize = FSE_readNCount(norm, &max, &tableLog, src, srcSize);
         
     | 
| 
       468 
565 
     | 
    
         
             
                        RETURN_ERROR_IF(FSE_isError(headerSize), corruption_detected, "");
         
     | 
| 
       469 
566 
     | 
    
         
             
                        RETURN_ERROR_IF(tableLog > maxLog, corruption_detected, "");
         
     | 
| 
       470 
     | 
    
         
            -
                        ZSTD_buildFSETable(DTableSpace, norm, max, baseValue, nbAdditionalBits, tableLog);
         
     | 
| 
      
 567 
     | 
    
         
            +
                        ZSTD_buildFSETable(DTableSpace, norm, max, baseValue, nbAdditionalBits, tableLog, wksp, wkspSize, bmi2);
         
     | 
| 
       471 
568 
     | 
    
         
             
                        *DTablePtr = DTableSpace;
         
     | 
| 
       472 
569 
     | 
    
         
             
                        return headerSize;
         
     | 
| 
       473 
570 
     | 
    
         
             
                    }
         
     | 
| 
         @@ -499,7 +596,8 @@ size_t ZSTD_decodeSeqHeaders(ZSTD_DCtx* dctx, int* nbSeqPtr, 
     | 
|
| 
       499 
596 
     | 
    
         
             
                if (nbSeq > 0x7F) {
         
     | 
| 
       500 
597 
     | 
    
         
             
                    if (nbSeq == 0xFF) {
         
     | 
| 
       501 
598 
     | 
    
         
             
                        RETURN_ERROR_IF(ip+2 > iend, srcSize_wrong, "");
         
     | 
| 
       502 
     | 
    
         
            -
                        nbSeq = MEM_readLE16(ip) + LONGNBSEQ 
     | 
| 
      
 599 
     | 
    
         
            +
                        nbSeq = MEM_readLE16(ip) + LONGNBSEQ;
         
     | 
| 
      
 600 
     | 
    
         
            +
                        ip+=2;
         
     | 
| 
       503 
601 
     | 
    
         
             
                    } else {
         
     | 
| 
       504 
602 
     | 
    
         
             
                        RETURN_ERROR_IF(ip >= iend, srcSize_wrong, "");
         
     | 
| 
       505 
603 
     | 
    
         
             
                        nbSeq = ((nbSeq-0x80)<<8) + *ip++;
         
     | 
| 
         @@ -520,7 +618,9 @@ size_t ZSTD_decodeSeqHeaders(ZSTD_DCtx* dctx, int* nbSeqPtr, 
     | 
|
| 
       520 
618 
     | 
    
         
             
                                                                  ip, iend-ip,
         
     | 
| 
       521 
619 
     | 
    
         
             
                                                                  LL_base, LL_bits,
         
     | 
| 
       522 
620 
     | 
    
         
             
                                                                  LL_defaultDTable, dctx->fseEntropy,
         
     | 
| 
       523 
     | 
    
         
            -
                                                                  dctx->ddictIsCold, nbSeq 
     | 
| 
      
 621 
     | 
    
         
            +
                                                                  dctx->ddictIsCold, nbSeq,
         
     | 
| 
      
 622 
     | 
    
         
            +
                                                                  dctx->workspace, sizeof(dctx->workspace),
         
     | 
| 
      
 623 
     | 
    
         
            +
                                                                  dctx->bmi2);
         
     | 
| 
       524 
624 
     | 
    
         
             
                        RETURN_ERROR_IF(ZSTD_isError(llhSize), corruption_detected, "ZSTD_buildSeqTable failed");
         
     | 
| 
       525 
625 
     | 
    
         
             
                        ip += llhSize;
         
     | 
| 
       526 
626 
     | 
    
         
             
                    }
         
     | 
| 
         @@ -530,7 +630,9 @@ size_t ZSTD_decodeSeqHeaders(ZSTD_DCtx* dctx, int* nbSeqPtr, 
     | 
|
| 
       530 
630 
     | 
    
         
             
                                                                  ip, iend-ip,
         
     | 
| 
       531 
631 
     | 
    
         
             
                                                                  OF_base, OF_bits,
         
     | 
| 
       532 
632 
     | 
    
         
             
                                                                  OF_defaultDTable, dctx->fseEntropy,
         
     | 
| 
       533 
     | 
    
         
            -
                                                                  dctx->ddictIsCold, nbSeq 
     | 
| 
      
 633 
     | 
    
         
            +
                                                                  dctx->ddictIsCold, nbSeq,
         
     | 
| 
      
 634 
     | 
    
         
            +
                                                                  dctx->workspace, sizeof(dctx->workspace),
         
     | 
| 
      
 635 
     | 
    
         
            +
                                                                  dctx->bmi2);
         
     | 
| 
       534 
636 
     | 
    
         
             
                        RETURN_ERROR_IF(ZSTD_isError(ofhSize), corruption_detected, "ZSTD_buildSeqTable failed");
         
     | 
| 
       535 
637 
     | 
    
         
             
                        ip += ofhSize;
         
     | 
| 
       536 
638 
     | 
    
         
             
                    }
         
     | 
| 
         @@ -540,7 +642,9 @@ size_t ZSTD_decodeSeqHeaders(ZSTD_DCtx* dctx, int* nbSeqPtr, 
     | 
|
| 
       540 
642 
     | 
    
         
             
                                                                  ip, iend-ip,
         
     | 
| 
       541 
643 
     | 
    
         
             
                                                                  ML_base, ML_bits,
         
     | 
| 
       542 
644 
     | 
    
         
             
                                                                  ML_defaultDTable, dctx->fseEntropy,
         
     | 
| 
       543 
     | 
    
         
            -
                                                                  dctx->ddictIsCold, nbSeq 
     | 
| 
      
 645 
     | 
    
         
            +
                                                                  dctx->ddictIsCold, nbSeq,
         
     | 
| 
      
 646 
     | 
    
         
            +
                                                                  dctx->workspace, sizeof(dctx->workspace),
         
     | 
| 
      
 647 
     | 
    
         
            +
                                                                  dctx->bmi2);
         
     | 
| 
       544 
648 
     | 
    
         
             
                        RETURN_ERROR_IF(ZSTD_isError(mlhSize), corruption_detected, "ZSTD_buildSeqTable failed");
         
     | 
| 
       545 
649 
     | 
    
         
             
                        ip += mlhSize;
         
     | 
| 
       546 
650 
     | 
    
         
             
                    }
         
     | 
| 
         @@ -686,12 +790,12 @@ size_t ZSTD_execSequenceEnd(BYTE* op, 
     | 
|
| 
       686 
790 
     | 
    
         
             
                    RETURN_ERROR_IF(sequence.offset > (size_t)(oLitEnd - virtualStart), corruption_detected, "");
         
     | 
| 
       687 
791 
     | 
    
         
             
                    match = dictEnd - (prefixStart-match);
         
     | 
| 
       688 
792 
     | 
    
         
             
                    if (match + sequence.matchLength <= dictEnd) {
         
     | 
| 
       689 
     | 
    
         
            -
                         
     | 
| 
      
 793 
     | 
    
         
            +
                        ZSTD_memmove(oLitEnd, match, sequence.matchLength);
         
     | 
| 
       690 
794 
     | 
    
         
             
                        return sequenceLength;
         
     | 
| 
       691 
795 
     | 
    
         
             
                    }
         
     | 
| 
       692 
796 
     | 
    
         
             
                    /* span extDict & currentPrefixSegment */
         
     | 
| 
       693 
797 
     | 
    
         
             
                    {   size_t const length1 = dictEnd - match;
         
     | 
| 
       694 
     | 
    
         
            -
                         
     | 
| 
      
 798 
     | 
    
         
            +
                        ZSTD_memmove(oLitEnd, match, length1);
         
     | 
| 
       695 
799 
     | 
    
         
             
                        op = oLitEnd + length1;
         
     | 
| 
       696 
800 
     | 
    
         
             
                        sequence.matchLength -= length1;
         
     | 
| 
       697 
801 
     | 
    
         
             
                        match = prefixStart;
         
     | 
| 
         @@ -752,12 +856,12 @@ size_t ZSTD_execSequence(BYTE* op, 
     | 
|
| 
       752 
856 
     | 
    
         
             
                    RETURN_ERROR_IF(UNLIKELY(sequence.offset > (size_t)(oLitEnd - virtualStart)), corruption_detected, "");
         
     | 
| 
       753 
857 
     | 
    
         
             
                    match = dictEnd + (match - prefixStart);
         
     | 
| 
       754 
858 
     | 
    
         
             
                    if (match + sequence.matchLength <= dictEnd) {
         
     | 
| 
       755 
     | 
    
         
            -
                         
     | 
| 
      
 859 
     | 
    
         
            +
                        ZSTD_memmove(oLitEnd, match, sequence.matchLength);
         
     | 
| 
       756 
860 
     | 
    
         
             
                        return sequenceLength;
         
     | 
| 
       757 
861 
     | 
    
         
             
                    }
         
     | 
| 
       758 
862 
     | 
    
         
             
                    /* span extDict & currentPrefixSegment */
         
     | 
| 
       759 
863 
     | 
    
         
             
                    {   size_t const length1 = dictEnd - match;
         
     | 
| 
       760 
     | 
    
         
            -
                         
     | 
| 
      
 864 
     | 
    
         
            +
                        ZSTD_memmove(oLitEnd, match, length1);
         
     | 
| 
       761 
865 
     | 
    
         
             
                        op = oLitEnd + length1;
         
     | 
| 
       762 
866 
     | 
    
         
             
                        sequence.matchLength -= length1;
         
     | 
| 
       763 
867 
     | 
    
         
             
                        match = prefixStart;
         
     | 
| 
         @@ -948,7 +1052,7 @@ ZSTD_decodeSequence(seqState_t* seqState, const ZSTD_longOffset_e longOffsets, c 
     | 
|
| 
       948 
1052 
     | 
    
         
             
            }
         
     | 
| 
       949 
1053 
     | 
    
         | 
| 
       950 
1054 
     | 
    
         
             
            #ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
         
     | 
| 
       951 
     | 
    
         
            -
             
     | 
| 
      
 1055 
     | 
    
         
            +
            MEM_STATIC int ZSTD_dictionaryIsActive(ZSTD_DCtx const* dctx, BYTE const* prefixStart, BYTE const* oLitEnd)
         
     | 
| 
       952 
1056 
     | 
    
         
             
            {
         
     | 
| 
       953 
1057 
     | 
    
         
             
                size_t const windowSize = dctx->fParams.windowSize;
         
     | 
| 
       954 
1058 
     | 
    
         
             
                /* No dictionary used. */
         
     | 
| 
         @@ -969,6 +1073,7 @@ MEM_STATIC void ZSTD_assertValidSequence( 
     | 
|
| 
       969 
1073 
     | 
    
         
             
                    seq_t const seq,
         
     | 
| 
       970 
1074 
     | 
    
         
             
                    BYTE const* prefixStart, BYTE const* virtualStart)
         
     | 
| 
       971 
1075 
     | 
    
         
             
            {
         
     | 
| 
      
 1076 
     | 
    
         
            +
            #if DEBUGLEVEL >= 1
         
     | 
| 
       972 
1077 
     | 
    
         
             
                size_t const windowSize = dctx->fParams.windowSize;
         
     | 
| 
       973 
1078 
     | 
    
         
             
                size_t const sequenceSize = seq.litLength + seq.matchLength;
         
     | 
| 
       974 
1079 
     | 
    
         
             
                BYTE const* const oLitEnd = op + seq.litLength;
         
     | 
| 
         @@ -986,6 +1091,9 @@ MEM_STATIC void ZSTD_assertValidSequence( 
     | 
|
| 
       986 
1091 
     | 
    
         
             
                    /* Offset must be within our window. */
         
     | 
| 
       987 
1092 
     | 
    
         
             
                    assert(seq.offset <= windowSize);
         
     | 
| 
       988 
1093 
     | 
    
         
             
                }
         
     | 
| 
      
 1094 
     | 
    
         
            +
            #else
         
     | 
| 
      
 1095 
     | 
    
         
            +
                (void)dctx, (void)op, (void)oend, (void)seq, (void)prefixStart, (void)virtualStart;
         
     | 
| 
      
 1096 
     | 
    
         
            +
            #endif
         
     | 
| 
       989 
1097 
     | 
    
         
             
            }
         
     | 
| 
       990 
1098 
     | 
    
         
             
            #endif
         
     | 
| 
       991 
1099 
     | 
    
         | 
| 
         @@ -1080,14 +1188,14 @@ ZSTD_decompressSequences_body( ZSTD_DCtx* dctx, 
     | 
|
| 
       1080 
1188 
     | 
    
         
             
            #endif
         
     | 
| 
       1081 
1189 
     | 
    
         
             
                        DEBUGLOG(6, "regenerated sequence size : %u", (U32)oneSeqSize);
         
     | 
| 
       1082 
1190 
     | 
    
         
             
                        BIT_reloadDStream(&(seqState.DStream));
         
     | 
| 
      
 1191 
     | 
    
         
            +
                        op += oneSeqSize;
         
     | 
| 
       1083 
1192 
     | 
    
         
             
                        /* gcc and clang both don't like early returns in this loop.
         
     | 
| 
       1084 
     | 
    
         
            -
                         *  
     | 
| 
       1085 
     | 
    
         
            -
                         * Instead save an error and report it at the end.
         
     | 
| 
       1086 
     | 
    
         
            -
                         * When there is an error, don't increment op, so we don't
         
     | 
| 
       1087 
     | 
    
         
            -
                         * overwrite.
         
     | 
| 
      
 1193 
     | 
    
         
            +
                         * Instead break and check for an error at the end of the loop.
         
     | 
| 
       1088 
1194 
     | 
    
         
             
                         */
         
     | 
| 
       1089 
     | 
    
         
            -
                        if (UNLIKELY(ZSTD_isError(oneSeqSize)))  
     | 
| 
       1090 
     | 
    
         
            -
             
     | 
| 
      
 1195 
     | 
    
         
            +
                        if (UNLIKELY(ZSTD_isError(oneSeqSize))) {
         
     | 
| 
      
 1196 
     | 
    
         
            +
                            error = oneSeqSize;
         
     | 
| 
      
 1197 
     | 
    
         
            +
                            break;
         
     | 
| 
      
 1198 
     | 
    
         
            +
                        }
         
     | 
| 
       1091 
1199 
     | 
    
         
             
                        if (UNLIKELY(!--nbSeq)) break;
         
     | 
| 
       1092 
1200 
     | 
    
         
             
                    }
         
     | 
| 
       1093 
1201 
     | 
    
         | 
| 
         @@ -1104,7 +1212,7 @@ ZSTD_decompressSequences_body( ZSTD_DCtx* dctx, 
     | 
|
| 
       1104 
1212 
     | 
    
         
             
                {   size_t const lastLLSize = litEnd - litPtr;
         
     | 
| 
       1105 
1213 
     | 
    
         
             
                    RETURN_ERROR_IF(lastLLSize > (size_t)(oend-op), dstSize_tooSmall, "");
         
     | 
| 
       1106 
1214 
     | 
    
         
             
                    if (op != NULL) {
         
     | 
| 
       1107 
     | 
    
         
            -
                         
     | 
| 
      
 1215 
     | 
    
         
            +
                        ZSTD_memcpy(op, litPtr, lastLLSize);
         
     | 
| 
       1108 
1216 
     | 
    
         
             
                        op += lastLLSize;
         
     | 
| 
       1109 
1217 
     | 
    
         
             
                    }
         
     | 
| 
       1110 
1218 
     | 
    
         
             
                }
         
     | 
| 
         @@ -1209,7 +1317,7 @@ ZSTD_decompressSequencesLong_body( 
     | 
|
| 
       1209 
1317 
     | 
    
         
             
                {   size_t const lastLLSize = litEnd - litPtr;
         
     | 
| 
       1210 
1318 
     | 
    
         
             
                    RETURN_ERROR_IF(lastLLSize > (size_t)(oend-op), dstSize_tooSmall, "");
         
     | 
| 
       1211 
1319 
     | 
    
         
             
                    if (op != NULL) {
         
     | 
| 
       1212 
     | 
    
         
            -
                         
     | 
| 
      
 1320 
     | 
    
         
            +
                        ZSTD_memcpy(op, litPtr, lastLLSize);
         
     | 
| 
       1213 
1321 
     | 
    
         
             
                        op += lastLLSize;
         
     | 
| 
       1214 
1322 
     | 
    
         
             
                    }
         
     | 
| 
       1215 
1323 
     | 
    
         
             
                }
         
     | 
| 
         @@ -15,7 +15,7 @@ 
     | 
|
| 
       15 
15 
     | 
    
         
             
            /*-*******************************************************
         
     | 
| 
       16 
16 
     | 
    
         
             
             *  Dependencies
         
     | 
| 
       17 
17 
     | 
    
         
             
             *********************************************************/
         
     | 
| 
       18 
     | 
    
         
            -
            #include  
     | 
| 
      
 18 
     | 
    
         
            +
            #include "../common/zstd_deps.h"   /* size_t */
         
     | 
| 
       19 
19 
     | 
    
         
             
            #include "../zstd.h"    /* DCtx, and some public functions */
         
     | 
| 
       20 
20 
     | 
    
         
             
            #include "../common/zstd_internal.h"  /* blockProperties_t, and some public functions */
         
     | 
| 
       21 
21 
     | 
    
         
             
            #include "zstd_decompress_internal.h"  /* ZSTD_seqSymbol */
         
     | 
| 
         @@ -48,12 +48,15 @@ size_t ZSTD_decompressBlock_internal(ZSTD_DCtx* dctx, 
     | 
|
| 
       48 
48 
     | 
    
         
             
             * this function must be called with valid parameters only
         
     | 
| 
       49 
49 
     | 
    
         
             
             * (dt is large enough, normalizedCounter distribution total is a power of 2, max is within range, etc.)
         
     | 
| 
       50 
50 
     | 
    
         
             
             * in which case it cannot fail.
         
     | 
| 
      
 51 
     | 
    
         
            +
             * The workspace must be 4-byte aligned and at least ZSTD_BUILD_FSE_TABLE_WKSP_SIZE bytes, which is
         
     | 
| 
      
 52 
     | 
    
         
            +
             * defined in zstd_decompress_internal.h.
         
     | 
| 
       51 
53 
     | 
    
         
             
             * Internal use only.
         
     | 
| 
       52 
54 
     | 
    
         
             
             */
         
     | 
| 
       53 
55 
     | 
    
         
             
            void ZSTD_buildFSETable(ZSTD_seqSymbol* dt,
         
     | 
| 
       54 
56 
     | 
    
         
             
                         const short* normalizedCounter, unsigned maxSymbolValue,
         
     | 
| 
       55 
57 
     | 
    
         
             
                         const U32* baseValue, const U32* nbAdditionalBits,
         
     | 
| 
       56 
     | 
    
         
            -
                               unsigned tableLog 
     | 
| 
      
 58 
     | 
    
         
            +
                               unsigned tableLog, void* wksp, size_t wkspSize,
         
     | 
| 
      
 59 
     | 
    
         
            +
                               int bmi2);
         
     | 
| 
       57 
60 
     | 
    
         | 
| 
       58 
61 
     | 
    
         | 
| 
       59 
62 
     | 
    
         
             
            #endif /* ZSTD_DEC_BLOCK_H */
         
     | 
| 
         @@ -27,26 +27,26 @@ 
     | 
|
| 
       27 
27 
     | 
    
         
             
            /*-*******************************************************
         
     | 
| 
       28 
28 
     | 
    
         
             
             *  Constants
         
     | 
| 
       29 
29 
     | 
    
         
             
             *********************************************************/
         
     | 
| 
       30 
     | 
    
         
            -
            static const U32 LL_base[MaxLL+1] = {
         
     | 
| 
      
 30 
     | 
    
         
            +
            static UNUSED_ATTR const U32 LL_base[MaxLL+1] = {
         
     | 
| 
       31 
31 
     | 
    
         
             
                             0,    1,    2,     3,     4,     5,     6,      7,
         
     | 
| 
       32 
32 
     | 
    
         
             
                             8,    9,   10,    11,    12,    13,    14,     15,
         
     | 
| 
       33 
33 
     | 
    
         
             
                            16,   18,   20,    22,    24,    28,    32,     40,
         
     | 
| 
       34 
34 
     | 
    
         
             
                            48,   64, 0x80, 0x100, 0x200, 0x400, 0x800, 0x1000,
         
     | 
| 
       35 
35 
     | 
    
         
             
                            0x2000, 0x4000, 0x8000, 0x10000 };
         
     | 
| 
       36 
36 
     | 
    
         | 
| 
       37 
     | 
    
         
            -
            static const U32 OF_base[MaxOff+1] = {
         
     | 
| 
      
 37 
     | 
    
         
            +
            static UNUSED_ATTR const U32 OF_base[MaxOff+1] = {
         
     | 
| 
       38 
38 
     | 
    
         
             
                             0,        1,       1,       5,     0xD,     0x1D,     0x3D,     0x7D,
         
     | 
| 
       39 
39 
     | 
    
         
             
                             0xFD,   0x1FD,   0x3FD,   0x7FD,   0xFFD,   0x1FFD,   0x3FFD,   0x7FFD,
         
     | 
| 
       40 
40 
     | 
    
         
             
                             0xFFFD, 0x1FFFD, 0x3FFFD, 0x7FFFD, 0xFFFFD, 0x1FFFFD, 0x3FFFFD, 0x7FFFFD,
         
     | 
| 
       41 
41 
     | 
    
         
             
                             0xFFFFFD, 0x1FFFFFD, 0x3FFFFFD, 0x7FFFFFD, 0xFFFFFFD, 0x1FFFFFFD, 0x3FFFFFFD, 0x7FFFFFFD };
         
     | 
| 
       42 
42 
     | 
    
         | 
| 
       43 
     | 
    
         
            -
            static const U32 OF_bits[MaxOff+1] = {
         
     | 
| 
      
 43 
     | 
    
         
            +
            static UNUSED_ATTR const U32 OF_bits[MaxOff+1] = {
         
     | 
| 
       44 
44 
     | 
    
         
             
                                 0,  1,  2,  3,  4,  5,  6,  7,
         
     | 
| 
       45 
45 
     | 
    
         
             
                                 8,  9, 10, 11, 12, 13, 14, 15,
         
     | 
| 
       46 
46 
     | 
    
         
             
                                16, 17, 18, 19, 20, 21, 22, 23,
         
     | 
| 
       47 
47 
     | 
    
         
             
                                24, 25, 26, 27, 28, 29, 30, 31 };
         
     | 
| 
       48 
48 
     | 
    
         | 
| 
       49 
     | 
    
         
            -
            static const U32 ML_base[MaxML+1] = {
         
     | 
| 
      
 49 
     | 
    
         
            +
            static UNUSED_ATTR const U32 ML_base[MaxML+1] = {
         
     | 
| 
       50 
50 
     | 
    
         
             
                                 3,  4,  5,    6,     7,     8,     9,    10,
         
     | 
| 
       51 
51 
     | 
    
         
             
                                11, 12, 13,   14,    15,    16,    17,    18,
         
     | 
| 
       52 
52 
     | 
    
         
             
                                19, 20, 21,   22,    23,    24,    25,    26,
         
     | 
| 
         @@ -73,12 +73,16 @@ static const U32 ML_base[MaxML+1] = { 
     | 
|
| 
       73 
73 
     | 
    
         | 
| 
       74 
74 
     | 
    
         
             
             #define SEQSYMBOL_TABLE_SIZE(log)   (1 + (1 << (log)))
         
     | 
| 
       75 
75 
     | 
    
         | 
| 
      
 76 
     | 
    
         
            +
            #define ZSTD_BUILD_FSE_TABLE_WKSP_SIZE (sizeof(S16) * (MaxSeq + 1) + (1u << MaxFSELog) + sizeof(U64))
         
     | 
| 
      
 77 
     | 
    
         
            +
            #define ZSTD_BUILD_FSE_TABLE_WKSP_SIZE_U32 ((ZSTD_BUILD_FSE_TABLE_WKSP_SIZE + sizeof(U32) - 1) / sizeof(U32))
         
     | 
| 
      
 78 
     | 
    
         
            +
             
     | 
| 
       76 
79 
     | 
    
         
             
            typedef struct {
         
     | 
| 
       77 
80 
     | 
    
         
             
                ZSTD_seqSymbol LLTable[SEQSYMBOL_TABLE_SIZE(LLFSELog)];    /* Note : Space reserved for FSE Tables */
         
     | 
| 
       78 
81 
     | 
    
         
             
                ZSTD_seqSymbol OFTable[SEQSYMBOL_TABLE_SIZE(OffFSELog)];   /* is also used as temporary workspace while building hufTable during DDict creation */
         
     | 
| 
       79 
82 
     | 
    
         
             
                ZSTD_seqSymbol MLTable[SEQSYMBOL_TABLE_SIZE(MLFSELog)];    /* and therefore must be at least HUF_DECOMPRESS_WORKSPACE_SIZE large */
         
     | 
| 
       80 
83 
     | 
    
         
             
                HUF_DTable hufTable[HUF_DTABLE_SIZE(HufLog)];  /* can accommodate HUF_decompress4X */
         
     | 
| 
       81 
84 
     | 
    
         
             
                U32 rep[ZSTD_REP_NUM];
         
     | 
| 
      
 85 
     | 
    
         
            +
                U32 workspace[ZSTD_BUILD_FSE_TABLE_WKSP_SIZE_U32];
         
     | 
| 
       82 
86 
     | 
    
         
             
            } ZSTD_entropyDTables_t;
         
     | 
| 
       83 
87 
     | 
    
         | 
| 
       84 
88 
     | 
    
         
             
            typedef enum { ZSTDds_getFrameHeaderSize, ZSTDds_decodeFrameHeader,
         
     | 
| 
         @@ -95,11 +99,6 @@ typedef enum { 
     | 
|
| 
       95 
99 
     | 
    
         
             
                ZSTD_use_once = 1            /* Use the dictionary once and set to ZSTD_dont_use */
         
     | 
| 
       96 
100 
     | 
    
         
             
            } ZSTD_dictUses_e;
         
     | 
| 
       97 
101 
     | 
    
         | 
| 
       98 
     | 
    
         
            -
            typedef enum {
         
     | 
| 
       99 
     | 
    
         
            -
                ZSTD_obm_buffered = 0,  /* Buffer the output */
         
     | 
| 
       100 
     | 
    
         
            -
                ZSTD_obm_stable = 1     /* ZSTD_outBuffer is stable */
         
     | 
| 
       101 
     | 
    
         
            -
            } ZSTD_outBufferMode_e;
         
     | 
| 
       102 
     | 
    
         
            -
             
     | 
| 
       103 
102 
     | 
    
         
             
            struct ZSTD_DCtx_s
         
     | 
| 
       104 
103 
     | 
    
         
             
            {
         
     | 
| 
       105 
104 
     | 
    
         
             
                const ZSTD_seqSymbol* LLTptr;
         
     | 
| 
         @@ -122,6 +121,8 @@ struct ZSTD_DCtx_s 
     | 
|
| 
       122 
121 
     | 
    
         
             
                XXH64_state_t xxhState;
         
     | 
| 
       123 
122 
     | 
    
         
             
                size_t headerSize;
         
     | 
| 
       124 
123 
     | 
    
         
             
                ZSTD_format_e format;
         
     | 
| 
      
 124 
     | 
    
         
            +
                ZSTD_forceIgnoreChecksum_e forceIgnoreChecksum;   /* User specified: if == 1, will ignore checksums in compressed frame. Default == 0 */
         
     | 
| 
      
 125 
     | 
    
         
            +
                U32 validateChecksum;         /* if == 1, will validate checksum. Is == 1 if (fParams.checksumFlag == 1) and (forceIgnoreChecksum == 0). */
         
     | 
| 
       125 
126 
     | 
    
         
             
                const BYTE* litPtr;
         
     | 
| 
       126 
127 
     | 
    
         
             
                ZSTD_customMem customMem;
         
     | 
| 
       127 
128 
     | 
    
         
             
                size_t litSize;
         
     | 
| 
         @@ -152,7 +153,7 @@ struct ZSTD_DCtx_s 
     | 
|
| 
       152 
153 
     | 
    
         
             
                U32 legacyVersion;
         
     | 
| 
       153 
154 
     | 
    
         
             
                U32 hostageByte;
         
     | 
| 
       154 
155 
     | 
    
         
             
                int noForwardProgress;
         
     | 
| 
       155 
     | 
    
         
            -
                 
     | 
| 
      
 156 
     | 
    
         
            +
                ZSTD_bufferMode_e outBufferMode;
         
     | 
| 
       156 
157 
     | 
    
         
             
                ZSTD_outBuffer expectedOutBuffer;
         
     | 
| 
       157 
158 
     | 
    
         | 
| 
       158 
159 
     | 
    
         
             
                /* workspace */
         
     |