Promote adler32 and crc32 to use size_t len.
Add Symver to provide old functions to temporarily remain ABI compatible with older zlib-ng versions.
Implement proper Configure/CMake tests for new-style symver support.
add_definitions(-DHAVE_ATTRIBUTE_ALIGNED)
endif()
+#
+# Check for __attribute__((__symver__(x))) support in the compiler
+#
+if (UNIX AND NOT ZLIB_COMPAT AND NOT APPLE AND NOT CMAKE_SYSTEM_NAME STREQUAL AIX)
+ check_c_source_compiles(
+ "
+ void foo(void);
+ __attribute__((__symver__(\"foo@VERS_1.0\"))) void foo(void) {}
+ int main(void) {
+ return 0;
+ }"
+ HAVE_ATTRIBUTE_SYMVER FAIL_REGEX "symver")
+ if(HAVE_ATTRIBUTE_SYMVER)
+ add_definitions(-DHAVE_SYMVER)
+ else()
+ message(WARNING "Unable to provide support for deprecated functions without '__attribute__((__symver__(x)))'")
+ endif()
+endif()
+
#
# Check for __builtin_assume_aligned(x,n) support in the compiler
#
set_target_properties(zlib-ng PROPERTIES COMPILE_FLAGS "-fno-semantic-interposition")
endif()
if(NOT APPLE AND NOT CMAKE_SYSTEM_NAME STREQUAL AIX)
- if(NOT ZLIB_COMPAT)
- add_definitions(-DHAVE_SYMVER)
- endif()
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/zlib${SUFFIX}.map.in
${CMAKE_CURRENT_BINARY_DIR}/zlib${SUFFIX}.map @ONLY)
set_target_properties(zlib-ng PROPERTIES LINK_FLAGS
#include "adler32_p.h"
#ifdef ZLIB_COMPAT
-unsigned long Z_EXPORT PREFIX(adler32_z)(unsigned long adler, const unsigned char *buf, size_t len) {
+unsigned long Z_EXPORT adler32_z(unsigned long adler, const unsigned char *buf, size_t len) {
if (buf == NULL)
return ADLER32_INITIAL_VALUE;
return (unsigned long)FUNCTABLE_CALL(adler32)((uint32_t)adler, buf, len);
}
-#else
-uint32_t Z_EXPORT PREFIX(adler32_z)(uint32_t adler, const unsigned char *buf, size_t len) {
+unsigned long Z_EXPORT adler32(unsigned long adler, const unsigned char *buf, unsigned int len) {
if (buf == NULL)
return ADLER32_INITIAL_VALUE;
- return FUNCTABLE_CALL(adler32)(adler, buf, len);
+ return (unsigned long)FUNCTABLE_CALL(adler32)((uint32_t)adler, buf, len);
}
#endif
-/* ========================================================================= */
-#ifdef ZLIB_COMPAT
-unsigned long Z_EXPORT PREFIX(adler32)(unsigned long adler, const unsigned char *buf, unsigned int len) {
+#ifndef ZLIB_COMPAT
+# if defined(HAVE_SYMVER)
+// Preferred function
+ZSYMVER_DEF("zng_adler32", "ZLIB_NG_2.4.0")
+uint32_t Z_EXPORT zng_adler32_sizet(uint32_t adler, const unsigned char *buf, size_t len) {
if (buf == NULL)
return ADLER32_INITIAL_VALUE;
- return (unsigned long)FUNCTABLE_CALL(adler32)((uint32_t)adler, buf, len);
+ return FUNCTABLE_CALL(adler32)(adler, buf, len);
}
-#else
-uint32_t Z_EXPORT PREFIX(adler32)(uint32_t adler, const unsigned char *buf, uint32_t len) {
+// Deprecated function
+ZSYMVER("zng_adler32", "ZLIB_NG_2.0.0")
+uint32_t Z_EXPORT zng_adler32_uint32(uint32_t adler, const unsigned char *buf, uint32_t len) {
+ if (buf == NULL)
+ return ADLER32_INITIAL_VALUE;
+ return FUNCTABLE_CALL(adler32)(adler, buf, len);
+}
+
+# else
+//Fallback to preferred function
+uint32_t Z_EXPORT zng_adler32(uint32_t adler, const unsigned char *buf, size_t len) {
+ if (buf == NULL)
+ return ADLER32_INITIAL_VALUE;
+ return FUNCTABLE_CALL(adler32)(adler, buf, len);
+}
+# endif
+
+# ifdef zng_adler32_z
+# undef zng_adler32_z
+# endif
+// Deprecated function
+uint32_t Z_EXPORT zng_adler32_z(uint32_t adler, const unsigned char *buf, size_t len) {
if (buf == NULL)
return ADLER32_INITIAL_VALUE;
return FUNCTABLE_CALL(adler32)(adler, buf, len);
esac
fi
-# Symbol versioning
-case "$uname" in
- CYGWIN* | Cygwin* | cygwin* | MINGW* | mingw* | MSYS* | msys* | Darwin* | darwin*)
- echo "Checking for Symbol versioning... No."
- ;;
- *)
- if test $shared -eq 1; then
- echo "Checking for Symbol versioning... Yes."
- CFLAGS="${CFLAGS} -DHAVE_SYMVER"
- SFLAGS="${SFLAGS} -DHAVE_SYMVER"
- else
- echo "Checking for Symbol versioning... No."
- fi
- ;;
-esac
-
# Simplify some later conditionals
LINUX=0
FREEBSD=0
echo "Checking for attribute(aligned) ... No." | tee -a configure.log
fi
+# Check for attribute(symver) support in compiler
+cat > $test.c << EOF
+void foo(void);
+__attribute__((__symver__("foo@VERS_1.0"))) void foo(void) {}
+int main(void) {
+ return 0;
+}
+EOF
+if try ${CC} ${CFLAGS} $test.c $LDSHAREDLIBC; then
+ echo "Checking for attribute(symver) ... Yes." | tee -a configure.log
+ CFLAGS="$CFLAGS -DHAVE_SYMVER"
+ SFLAGS="$SFLAGS -DHAVE_SYMVER"
+else
+ echo "Checking for attribute(symver) ... No." | tee -a configure.log
+ echo "Warning: Unable to provide support for deprecated functions without '__attribute__((__symver__(x)))'" | tee -a configure.log
+
+fi
+
# Check for __builtin_assume_aligned(x,n) support in compiler
cat > $test.c << EOF
char *test(char *buffer) {
/* ========================================================================= */
-const uint32_t * Z_EXPORT PREFIX(get_crc_table)(void) {
+Z_EXPORT const uint32_t * PREFIX(get_crc_table)(void) {
return (const uint32_t *)crc_table;
}
return ~crc32_copy_small(~crc, NULL, buf, len, 32, 0);
}
+
#ifdef ZLIB_COMPAT
-unsigned long Z_EXPORT PREFIX(crc32_z)(unsigned long crc, const unsigned char *buf, size_t len) {
+Z_EXPORT unsigned long crc32_z(unsigned long crc, const unsigned char *buf, size_t len) {
if (buf == NULL)
return CRC32_INITIAL_VALUE;
return (unsigned long)FUNCTABLE_CALL(crc32)((uint32_t)crc, buf, len);
}
-#else
-uint32_t Z_EXPORT PREFIX(crc32_z)(uint32_t crc, const unsigned char *buf, size_t len) {
+Z_EXPORT unsigned long crc32(unsigned long crc, const unsigned char *buf, unsigned int len) {
if (buf == NULL)
return CRC32_INITIAL_VALUE;
- return FUNCTABLE_CALL(crc32)(crc, buf, len);
+ return (unsigned long)FUNCTABLE_CALL(crc32)((uint32_t)crc, buf, len);
}
#endif
-#ifdef ZLIB_COMPAT
-unsigned long Z_EXPORT PREFIX(crc32)(unsigned long crc, const unsigned char *buf, unsigned int len) {
+#ifndef ZLIB_COMPAT
+# if defined(HAVE_SYMVER)
+// Preferred function
+ZSYMVER_DEF("zng_crc32", "ZLIB_NG_2.4.0")
+Z_EXPORT uint32_t zng_crc32_sizet(uint32_t crc, const unsigned char *buf, size_t len) {
if (buf == NULL)
return CRC32_INITIAL_VALUE;
- return (unsigned long)FUNCTABLE_CALL(crc32)((uint32_t)crc, buf, len);
+ return FUNCTABLE_CALL(crc32)(crc, buf, len);
+}
+// Deprecated function
+ZSYMVER("zng_crc32", "ZLIB_NG_2.0.0")
+Z_EXPORT uint32_t zng_crc32_uint32(uint32_t crc, const unsigned char *buf, uint32_t len) {
+ if (buf == NULL)
+ return CRC32_INITIAL_VALUE;
+ return FUNCTABLE_CALL(crc32)(crc, buf, len);
+}
+
+# else
+// Fallback to preferred function
+Z_EXPORT uint32_t zng_crc32(uint32_t crc, const unsigned char *buf, size_t len) {
+ if (buf == NULL)
+ return CRC32_INITIAL_VALUE;
+ return FUNCTABLE_CALL(crc32)(crc, buf, len);
}
-#else
-uint32_t Z_EXPORT PREFIX(crc32)(uint32_t crc, const unsigned char *buf, uint32_t len) {
+# endif
+
+# ifdef zng_crc32_z
+# undef zng_crc32_z
+# endif
+// Deprecated function
+Z_EXPORT uint32_t zng_crc32_z(uint32_t crc, const unsigned char *buf, size_t len) {
if (buf == NULL)
return CRC32_INITIAL_VALUE;
return FUNCTABLE_CALL(crc32)(crc, buf, len);
* This is only used for Zlib-ng native API, and only on platforms supporting this.
*/
#if defined(HAVE_SYMVER)
-# define ZSYMVER(func,alias,ver) __asm__(".symver " func ", " alias "@ZLIB_NG_" ver);
-# define ZSYMVER_DEF(func,alias,ver) __asm__(".symver " func ", " alias "@@ZLIB_NG_" ver);
+# define ZSYMVER(alias,ver) __attribute__((__symver__(alias "@" ver)))
+# define ZSYMVER_DEF(alias,ver) __attribute__((__symver__(alias "@@" ver)))
#else
-# define ZSYMVER(func,alias,ver)
-# define ZSYMVER_DEF(func,alias,ver)
+# define ZSYMVER(alias,ver)
+# define ZSYMVER_DEF(alias,ver)
#endif
#ifndef __cplusplus
*/
Z_EXTERN Z_EXPORT
-uint32_t zng_adler32(uint32_t adler, const uint8_t *buf, uint32_t len);
+uint32_t zng_adler32(uint32_t adler, const uint8_t *buf, size_t len);
/*
Update a running Adler-32 checksum with the bytes buf[0..len-1] and
return the updated checksum. An Adler-32 value is in the range of a 32-bit
if (adler != original_adler) error();
*/
-Z_EXTERN Z_EXPORT
-uint32_t zng_adler32_z(uint32_t adler, const uint8_t *buf, size_t len);
-/*
- Same as adler32(), but with a size_t length.
-*/
-
Z_EXTERN Z_EXPORT
uint32_t zng_adler32_combine(uint32_t adler1, uint32_t adler2, z_off64_t len2);
/*
*/
Z_EXTERN Z_EXPORT
-uint32_t zng_crc32(uint32_t crc, const uint8_t *buf, uint32_t len);
+uint32_t zng_crc32(uint32_t crc, const uint8_t *buf, size_t len);
/*
Update a running CRC-32 with the bytes buf[0..len-1] and return the
updated CRC-32. A CRC-32 value is in the range of a 32-bit unsigned integer.
if (crc != original_crc) error();
*/
-Z_EXTERN Z_EXPORT
-uint32_t zng_crc32_z(uint32_t crc, const uint8_t *buf, size_t len);
-/*
- Same as crc32(), but with a size_t length.
-*/
-
Z_EXTERN Z_EXPORT
uint32_t zng_crc32_combine(uint32_t crc1, uint32_t crc2, z_off64_t len2);
Z_EXTERN Z_EXPORTVA int32_t zng_gzvprintf(gzFile file, const char *format, va_list va);
#endif
+/* Aliases for backwards compatibility */
+#define zng_crc32_z @ZLIB_SYMBOL_PREFIX@zng_crc32
+#define zng_adler32_z @ZLIB_SYMBOL_PREFIX@zng_adler32
+
#ifdef __cplusplus
}
#endif
+ZLIB_NG_2.4.0 {
+ @ZLIB_SYMBOL_PREFIX@zng_adler32;
+ @ZLIB_SYMBOL_PREFIX@zng_crc32;
+};
+
ZLIB_NG_2.1.0 {
global:
@ZLIB_SYMBOL_PREFIX@zng_deflateInit;
#define zng_adler32 @ZLIB_SYMBOL_PREFIX@zng_adler32
#define zng_adler32_combine @ZLIB_SYMBOL_PREFIX@zng_adler32_combine
#define zng_adler32_combine64 @ZLIB_SYMBOL_PREFIX@zng_adler32_combine64
-#define zng_adler32_z @ZLIB_SYMBOL_PREFIX@zng_adler32_z
#define zng_compress @ZLIB_SYMBOL_PREFIX@zng_compress
#define zng_compress2 @ZLIB_SYMBOL_PREFIX@zng_compress2
#define zng_compressBound @ZLIB_SYMBOL_PREFIX@zng_compressBound
#define zng_crc32_combine_gen @ZLIB_SYMBOL_PREFIX@zng_crc32_combine_gen
#define zng_crc32_combine_gen64 @ZLIB_SYMBOL_PREFIX@zng_crc32_combine_gen64
#define zng_crc32_combine_op @ZLIB_SYMBOL_PREFIX@zng_crc32_combine_op
-#define zng_crc32_z @ZLIB_SYMBOL_PREFIX@zng_crc32_z
#define zng_deflate @ZLIB_SYMBOL_PREFIX@zng_deflate
#define zng_deflateBound @ZLIB_SYMBOL_PREFIX@zng_deflateBound
#define zng_deflateCopy @ZLIB_SYMBOL_PREFIX@zng_deflateCopy