zlib replacement with optimizations for "next generation" systems.
Go to file
2023-08-07 08:28:16 +02:00
.github Use endianess-specific built-in function for gcc < 12 on PowerPC64 2023-06-23 19:43:34 +02:00
arch Discard repeated words 2023-08-07 08:28:16 +02:00
cmake Move check_c_source_compile_or_run cmake macro to the only place it is used. 2023-08-06 10:17:24 +02:00
doc Added Intel's Fast CRC Computation for Generic Polynomials Using PCLMULQDQ Instruction paper to docs folder. 2022-06-07 12:43:27 +02:00
test Discard repeated words 2023-08-07 08:28:16 +02:00
tools Fix potential overflow before widening in makecrtc. 2023-04-28 00:28:13 +02:00
win32 Clean up SSE4.2 support, and no longer use asm fallback or gcc builtin. 2023-08-06 10:17:24 +02:00
.codecov.yaml Ignore code coverage for files in _dep directory. 2022-03-13 07:41:12 +01:00
.gitattributes Fix ABI checking... 2023-01-22 21:36:42 +01:00
.gitignore Add temporary cmake build dirs/files to gitignore 2023-02-02 17:33:47 +01:00
.shellcheckrc Import default codecfactor.io .shellcheckrc file. 2020-03-09 14:13:36 +01:00
adler32_fold.c Use size_t instead of uint64_t for len in all adler32 functions 2023-01-22 00:58:12 +01:00
adler32_fold.h Use size_t instead of uint64_t for len in all adler32 functions 2023-01-22 00:58:12 +01:00
adler32_p.h Use size_t instead of uint64_t for len in all adler32 functions 2023-01-22 00:58:12 +01:00
adler32.c Use size_t instead of uint64_t for len in all adler32 functions 2023-01-22 00:58:12 +01:00
chunkset_tpl.h Enable use of _mm_shuffle_epi8 on machines without SSE4.1 2023-04-01 17:27:49 +02:00
chunkset.c Use arch-specific versions of inflate_fast. 2023-02-05 17:51:46 +01:00
CMakeLists.txt relocatable pc files by default, while allowing discouraged absolute paths for CMAKE_INSTALL_[LIB|INCLUDE]DIR 2023-08-06 10:20:03 +02:00
compare256_rle.h Added support for unaligned/intrinsic to deflate_rle. 2023-05-16 10:27:28 +02:00
compare256.c Ensure that unaligned compare256 variants are only used on little endian systems 2023-04-25 12:07:55 +02:00
compress.c Fix definition of z_size_t to match documentation of legacy zlib API. 2023-02-23 12:17:34 +01:00
configure Relative paths CMAKE_INSTALL_*, absolute paths CMAKE_INSTALL_FULL_*; use @rpath/libname as install name on macOS 2023-08-06 10:20:03 +02:00
cpu_features.c Add supporting RISC-V cross compilation workflows 2023-05-12 16:57:32 +02:00
cpu_features.h Optimize adler32 using rvv 2023-07-16 12:44:25 +02:00
crc32_braid_comb_p.h Correct comment for x2nmodp. 2022-05-25 12:04:35 +02:00
crc32_braid_comb.c zlib 1.2.12 2022-06-13 15:58:03 +02:00
crc32_braid_p.h Use size_t instead of uint64_t for len in all crc32 functions 2023-01-22 00:58:12 +01:00
crc32_braid_tbl.h Speed up software CRC-32 computation by a factor of 1.5 to 3. 2022-05-25 12:04:35 +02:00
crc32_braid.c Use size_t instead of uint64_t for len in all crc32 functions 2023-01-22 00:58:12 +01:00
crc32_fold.c Use size_t instead of uint64_t for len in all crc32 functions 2023-01-22 00:58:12 +01:00
crc32_fold.h Use size_t instead of uint64_t for len in all crc32 functions 2023-01-22 00:58:12 +01:00
deflate_fast.c Prefix shared functions to prevent symbol conflict when linking native api against compat api. 2023-01-09 15:10:11 +01:00
deflate_huff.c Prefix shared functions to prevent symbol conflict when linking native api against compat api. 2023-01-09 15:10:11 +01:00
deflate_medium.c Prefix shared functions to prevent symbol conflict when linking native api against compat api. 2023-01-09 15:10:11 +01:00
deflate_p.h Prefix shared functions to prevent symbol conflict when linking native api against compat api. 2023-01-09 15:10:11 +01:00
deflate_quick.c Fix out-of-bound access of zng_length_codes. 2023-05-07 20:36:34 +02:00
deflate_rle.c Added support for unaligned/intrinsic to deflate_rle. 2023-05-16 10:27:28 +02:00
deflate_slow.c Prefix shared functions to prevent symbol conflict when linking native api against compat api. 2023-01-09 15:10:11 +01:00
deflate_stored.c Prefix shared functions to prevent symbol conflict when linking native api against compat api. 2023-01-09 15:10:11 +01:00
deflate.c Simplify deflate stream/state check. 2023-08-06 10:20:43 +02:00
deflate.h Simplify deflate stream/state check. 2023-08-06 10:20:43 +02:00
fallback_builtins.h Move the AVX compatibility functions into a separate file 2023-07-20 08:03:17 +02:00
FAQ.zlib Spelling fixes 2021-05-16 13:20:15 +02:00
functable.c Optimize adler32 using rvv 2023-07-16 12:44:25 +02:00
functable.h Sort functable alphabetically 2023-02-17 15:11:25 +01:00
gzguts.h zlib 1.2.12 2022-06-13 15:58:03 +02:00
gzlib.c zlib 1.2.12 2022-06-13 15:58:03 +02:00
gzread.c.in Use named defines instead of hard coded numbers. 2023-02-18 20:30:55 +01:00
gzwrite.c Fix crash when gzsetparams() attempted for transparent write. 2023-02-03 15:49:02 +01:00
INDEX.md Remove misleading manpage. 2021-03-09 16:44:07 +01:00
infback.c Use named defines instead of hard coded numbers. 2023-02-18 20:30:55 +01:00
inffast_tpl.h Inflate: add fast-path for literals 2023-02-24 13:24:49 +01:00
inffixed_tbl.h Fixed tab indentation for inffixed_tbl.h. 2020-09-24 15:42:02 +02:00
inflate_p.h Handle complete overlap in chunkcopy_safe 2023-06-28 17:22:11 +02:00
inflate.c Assure that inflatePrime() can't shift a 32-bit integer by 32 bits. 2023-04-26 14:01:14 +02:00
inflate.h Prefix shared functions to prevent symbol conflict when linking native api against compat api. 2023-01-09 15:10:11 +01:00
inftrees.c Use named defines instead of hard coded numbers. 2023-02-18 20:30:55 +01:00
inftrees.h Discard repeated words 2023-08-07 08:28:16 +02:00
insert_string_roll.c Added rolling hash functions for hash table. 2021-06-25 20:09:14 +02:00
insert_string_tpl.h Discard repeated words 2023-08-07 08:28:16 +02:00
insert_string.c Added rolling hash functions for hash table. 2021-06-25 20:09:14 +02:00
LICENSE.md Update readme and create LICENSE.md file 2015-04-10 12:26:51 +02:00
Makefile.in Fix distclean target in Makefile.in 2023-07-16 12:41:15 +02:00
match_tpl.h Use memcpy instead of memcmp for unaligned memory comparisons. 2023-02-08 22:12:37 +01:00
PORTING.md Fix definition of z_size_t to match documentation of legacy zlib API. 2023-02-23 12:17:34 +01:00
README.md Optimize compare256 with rvv 2023-06-13 12:25:48 +02:00
slide_hash.c Fixed conversion warnings for wsize in slide_hash_c. 2022-06-13 15:59:06 +02:00
trees_emit.h inttypes.h includes stdint.h, so only include one of them. 2021-12-19 15:40:19 +01:00
trees_tbl.h Separate MIN_MATCH into STD_MIN_MATCH and WANT_MIN_MATCH 2021-06-13 20:55:01 +02:00
trees.c Fix bug in block type selection when Z_FIXED used. 2023-02-03 15:49:02 +01:00
trees.h Renamed trees_p.h to trees.h. 2020-08-27 19:19:30 +02:00
uncompr.c Fix definition of z_size_t to match documentation of legacy zlib API. 2023-02-23 12:17:34 +01:00
zbuild.h Expand support for symbol versioning to also allow multiple functions 2023-07-24 18:33:23 +02:00
zconf-ng.h.in Use named defines instead of hard coded numbers. 2023-02-18 20:30:55 +01:00
zconf.h.in Move defining z_size_t to below including stddef.h and unistd.h in zconf.h. 2023-05-16 21:35:25 +02:00
zendian.h Handle ARM64EC as ARM64. 2023-07-16 12:42:38 +02:00
zlib_name_mangling-ng.h.in Fix various incorrect name mangling 2023-02-09 01:54:19 +01:00
zlib_name_mangling.h.empty Add support for name mangling 2021-10-09 09:19:55 +02:00
zlib_name_mangling.h.in Fix various incorrect name mangling 2023-02-09 01:54:19 +01:00
zlib-ng.h.in 2.1.3 Release 2023-06-29 10:23:11 +02:00
zlib-ng.map Fix wrong names and invalid entries in zlib.map and zlib-ng.map 2023-02-09 01:54:19 +01:00
zlib.h.in Discard repeated words 2023-08-07 08:28:16 +02:00
zlib.map Fix wrong names and invalid entries in zlib.map and zlib-ng.map 2023-02-09 01:54:19 +01:00
zlib.pc.cmakein Add support for name mangling 2021-10-09 09:19:55 +02:00
zlib.pc.in Add support for name mangling 2021-10-09 09:19:55 +02:00
zutil_p.h Use memcpy instead of memcmp for unaligned memory comparisons. 2023-02-08 22:12:37 +01:00
zutil.c 2.1.3 Release 2023-06-29 10:23:11 +02:00
zutil.h Inflate: add fast-path for literals 2023-02-24 13:24:49 +01:00

CI Stable Develop
GitHub Actions Stable Status
Stable Status
Stable Status
Develop Status
Develop Status
Develop Status
CodeFactor CodeFactor CodeFactor
OSS-Fuzz Fuzzing Status Fuzzing Status
Codecov codecov codecov

zlib-ng

zlib data compression library for the next generation systems

Maintained by Hans Kristian Rosbach aka Dead2 (zlib-ng àt circlestorm dót org)

Features

  • Zlib compatible API with support for dual-linking
  • Modernized native API based on zlib API for ease of porting
  • Modern C11 syntax and a clean code layout
  • Deflate medium and quick algorithms based on Intels zlib fork
  • Support for CPU intrinsics when available
    • Adler32 implementation using SSSE3, AVX2, AVX512, AVX512-VNNI, Neon, VMX & VSX
    • CRC32-B implementation using PCLMULQDQ, VPCLMULQDQ, ACLE, & IBM Z
    • Hash table implementation using CRC32-C intrinsics on x86 and ARM
    • Slide hash implementations using SSE2, AVX2, Neon, VMX & VSX
    • Compare256 implementations using SSE2, AVX2, Neon, POWER9 & RVV
    • Inflate chunk copying using SSE2, SSSE3, AVX, Neon & VSX
    • Support for hardware-accelerated deflate using IBM Z DFLTCC
  • Unaligned memory read/writes and large bit buffer improvements
  • Includes improvements from Cloudflare and Intel forks
  • Configure, CMake, and NMake build system support
  • Comprehensive set of CMake unit tests
  • Code sanitizers, fuzzing, and coverage
  • GitHub Actions continuous integration on Windows, macOS, and Linux
    • Emulated CI for ARM, AARCH64, PPC, PPC64, RISCV, SPARC64, S390x using qemu

History

The motivation for this fork was seeing several 3rd party contributions with new optimizations not getting implemented into the official zlib repository.

Mark Adler has been maintaining zlib for a very long time, and he has done a great job and hopefully he will continue for a long time yet. The idea of zlib-ng is not to replace zlib, but to co-exist as a drop-in replacement with a lower threshold for code change.

zlib has a long history and is incredibly portable, even supporting many systems that predate the Internet.
That is great, but it can complicate further development and maintainability. The zlib code contains many workarounds for really old compilers or to accommodate systems with limitations such as operating in a 16-bit environment.

Many of these workarounds are only maintenance burdens, some of them are pretty huge code-wise. With many workarounds cluttered throughout the code, it makes it harder for new programmers with an idea/interest for zlib to contribute.

I decided to make a fork, merge all the Intel optimizations, some of the Cloudflare optimizations, plus a couple other smaller patches. Then started cleaning out workarounds, various dead code, all contrib and example code.
The result is a better performing and easier to maintain zlib-ng.

A lot of improvements have gone into zlib-ng since its start, and numerous people and companies have contributed both small and big improvements, or valuable testing.

Build

Please read LICENSE.md, it is very simple and very liberal.

There are two ways to build zlib-ng:

Cmake

To build zlib-ng using the cross-platform makefile generator cmake.

cmake .
cmake --build . --config Release
ctest --verbose -C Release

Alternatively, you can use the cmake configuration GUI tool ccmake:

ccmake .

Configure

To build zlib-ng using the bash configure script:

./configure
make
make test

Build Options

CMake configure Description Default
ZLIB_COMPAT --zlib-compat Compile with zlib compatible API OFF
ZLIB_ENABLE_TESTS Build test binaries ON
WITH_GZFILEOP --without-gzfileops Compile with support for gzFile related functions ON
WITH_OPTIM --without-optimizations Build with optimisations ON
WITH_NEW_STRATEGIES --without-new-strategies Use new strategies ON
WITH_NATIVE_INSTRUCTIONS --native Compiles with full instruction set supported on this host (gcc/clang -march=native) OFF
WITH_SANITIZER Build with sanitizer (memory, address, undefined) OFF
WITH_GTEST Build gtest_zlib ON
WITH_FUZZERS Build test/fuzz OFF
WITH_BENCHMARKS Build test/benchmarks OFF
WITH_MAINTAINER_WARNINGS Build with project maintainer warnings OFF
WITH_CODE_COVERAGE Enable code coverage reporting OFF

Install

WARNING: We do not recommend manually installing unless you really know what you are doing, because this can potentially override the system default zlib library, and any incompatibility or wrong configuration of zlib-ng can make the whole system unusable, requiring recovery or reinstall. If you still want a manual install, we recommend using the /opt/ path prefix.

For Linux distros, an alternative way to use zlib-ng (if compiled in zlib-compat mode) instead of zlib, is through the use of the LD_PRELOAD environment variable. If the program is dynamically linked with zlib, then the program will temporarily attempt to use zlib-ng instead, without risking system-wide instability.

LD_PRELOAD=/opt/zlib-ng/libz.so.1.2.13.zlib-ng /usr/bin/program

Cmake

To install zlib-ng system-wide using cmake:

cmake --build . --target install

Configure

To install zlib-ng system-wide using the configure script:

make install

Vcpkg

Alternatively, you can build and install zlib-ng using the vcpkg dependency manager:

git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh # "./bootstrap-vcpkg.bat" for powershell
./vcpkg integrate install
./vcpkg install zlib-ng

The zlib-ng port in vcpkg is kept up to date by Microsoft team members and community contributors. If the version is out of date, please create an issue or pull request on the vcpkg repository.

Contributing

Zlib-ng is aiming to be open to contributions, and we would be delighted to receive pull requests on github. Help with testing and reviewing pull requests etc is also very much appreciated.

Please check the Wiki for more info: Contributing

Acknowledgments

Thanks go out to all the people and companies who have taken the time to contribute code reviews, testing and/or patches. Zlib-ng would not have been nearly as good without you.

The deflate format used by zlib was defined by Phil Katz.
The deflate and zlib specifications were written by L. Peter Deutsch.

zlib was originally created by Jean-loup Gailly (compression) and Mark Adler (decompression).

Advanced Build Options

CMake configure Description Default
FORCE_SSE2 --force-sse2 Skip runtime check for SSE2 instructions (Always on for x86_64) OFF (x86)
WITH_AVX2 Build with AVX2 intrinsics ON
WITH_AVX512 Build with AVX512 intrinsics ON
WITH_AVX512VNNI Build with AVX512VNNI intrinsics ON
WITH_SSE2 Build with SSE2 intrinsics ON
WITH_SSSE3 Build with SSSE3 intrinsics ON
WITH_SSE42 Build with SSE42 intrinsics ON
WITH_PCLMULQDQ Build with PCLMULQDQ intrinsics ON
WITH_VPCLMULQDQ --without-vpclmulqdq Build with VPCLMULQDQ intrinsics ON
WITH_ACLE --without-acle Build with ACLE intrinsics ON
WITH_NEON --without-neon Build with NEON intrinsics ON
WITH_ALTIVEC --without-altivec Build with AltiVec (VMX) intrinsics ON
WITH_POWER8 --without-power8 Build with POWER8 optimisations ON
WITH_RVV Build with RVV intrinsics ON
WITH_CRC32_VX --without-crc32-vx Build with vectorized CRC32 on IBM Z ON
WITH_DFLTCC_DEFLATE --with-dfltcc-deflate Build with DFLTCC intrinsics for compression on IBM Z OFF
WITH_DFLTCC_INFLATE --with-dfltcc-inflate Build with DFLTCC intrinsics for decompression on IBM Z OFF
WITH_UNALIGNED --without-unaligned Allow optimizations that use unaligned reads if safe on current arch ON
WITH_INFLATE_STRICT Build with strict inflate distance checking OFF
WITH_INFLATE_ALLOW_INVALID_DIST Build with zero fill for inflate invalid distances OFF
INSTALL_UTILS Copy minigzip and minideflate during install OFF
ZLIBNG_ENABLE_TESTS Test zlib-ng specific API ON