From 3acda56db09a016b11a0f3b08b5fa5716fae0b35 Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Sat, 28 Dec 2019 13:20:50 -0600 Subject: [PATCH] Declare __stdcall correctly for MSVC Unfortunately, MSVC only accepts __stdcall after the return type, while gcc only accepts __attribute__((visibility("default"))) before the return type. So we need a macro in each location. Also, MSVC doesn't define __i386__; that's gcc specific. So instead use '_WIN32 && !_WIN64' to detect 32-bit Windows. --- lib/adler32.c | 2 +- lib/crc32.c | 2 +- lib/deflate_compress.c | 8 +++---- lib/deflate_decompress.c | 8 +++---- lib/gzip_compress.c | 4 ++-- lib/gzip_decompress.c | 4 ++-- lib/zlib_compress.c | 4 ++-- lib/zlib_decompress.c | 2 +- libdeflate.h | 51 ++++++++++++++++++++-------------------- 9 files changed, 42 insertions(+), 43 deletions(-) diff --git a/lib/adler32.c b/lib/adler32.c index 185575a..32ab0ce 100644 --- a/lib/adler32.c +++ b/lib/adler32.c @@ -121,7 +121,7 @@ static u32 dispatch(u32 adler, const u8 *buffer, size_t size) # define adler32_impl DEFAULT_IMPL /* only one implementation, use it */ #endif -LIBDEFLATEAPI u32 +LIBDEFLATEEXPORT u32 LIBDEFLATEAPI libdeflate_adler32(u32 adler, const void *buffer, size_t size) { if (buffer == NULL) /* return initial value */ diff --git a/lib/crc32.c b/lib/crc32.c index 129149a..6adacc5 100644 --- a/lib/crc32.c +++ b/lib/crc32.c @@ -304,7 +304,7 @@ static u32 dispatch(u32 remainder, const u8 *buffer, size_t size) # define crc32_impl DEFAULT_IMPL /* only one implementation, use it */ #endif -LIBDEFLATEAPI u32 +LIBDEFLATEEXPORT u32 LIBDEFLATEAPI libdeflate_crc32(u32 remainder, const void *buffer, size_t size) { if (buffer == NULL) /* return initial value */ diff --git a/lib/deflate_compress.c b/lib/deflate_compress.c index 9ecb8b6..6618e29 100644 --- a/lib/deflate_compress.c +++ b/lib/deflate_compress.c @@ -2669,7 +2669,7 @@ deflate_init_offset_slot_fast(struct libdeflate_compressor *c) } } -LIBDEFLATEAPI struct libdeflate_compressor * +LIBDEFLATEEXPORT struct libdeflate_compressor * LIBDEFLATEAPI libdeflate_alloc_compressor(int compression_level) { struct libdeflate_compressor *c; @@ -2778,7 +2778,7 @@ libdeflate_alloc_compressor(int compression_level) return c; } -LIBDEFLATEAPI size_t +LIBDEFLATEEXPORT size_t LIBDEFLATEAPI libdeflate_deflate_compress(struct libdeflate_compressor *c, const void *in, size_t in_nbytes, void *out, size_t out_nbytes_avail) @@ -2799,7 +2799,7 @@ libdeflate_deflate_compress(struct libdeflate_compressor *c, return (*c->impl)(c, in, in_nbytes, out, out_nbytes_avail); } -LIBDEFLATEAPI void +LIBDEFLATEEXPORT void LIBDEFLATEAPI libdeflate_free_compressor(struct libdeflate_compressor *c) { aligned_free(c); @@ -2811,7 +2811,7 @@ deflate_get_compression_level(struct libdeflate_compressor *c) return c->compression_level; } -LIBDEFLATEAPI size_t +LIBDEFLATEEXPORT size_t LIBDEFLATEAPI libdeflate_deflate_compress_bound(struct libdeflate_compressor *c, size_t in_nbytes) { diff --git a/lib/deflate_decompress.c b/lib/deflate_decompress.c index 0031075..de0c420 100644 --- a/lib/deflate_decompress.c +++ b/lib/deflate_decompress.c @@ -947,7 +947,7 @@ dispatch(struct libdeflate_decompressor * restrict d, * handles calling the appropriate implementation depending on the CPU features * at runtime. */ -LIBDEFLATEAPI enum libdeflate_result +LIBDEFLATEEXPORT enum libdeflate_result LIBDEFLATEAPI libdeflate_deflate_decompress_ex(struct libdeflate_decompressor * restrict d, const void * restrict in, size_t in_nbytes, void * restrict out, size_t out_nbytes_avail, @@ -958,7 +958,7 @@ libdeflate_deflate_decompress_ex(struct libdeflate_decompressor * restrict d, actual_in_nbytes_ret, actual_out_nbytes_ret); } -LIBDEFLATEAPI enum libdeflate_result +LIBDEFLATEEXPORT enum libdeflate_result LIBDEFLATEAPI libdeflate_deflate_decompress(struct libdeflate_decompressor * restrict d, const void * restrict in, size_t in_nbytes, void * restrict out, size_t out_nbytes_avail, @@ -969,7 +969,7 @@ libdeflate_deflate_decompress(struct libdeflate_decompressor * restrict d, NULL, actual_out_nbytes_ret); } -LIBDEFLATEAPI struct libdeflate_decompressor * +LIBDEFLATEEXPORT struct libdeflate_decompressor * LIBDEFLATEAPI libdeflate_alloc_decompressor(void) { /* @@ -990,7 +990,7 @@ libdeflate_alloc_decompressor(void) return calloc(1, sizeof(struct libdeflate_decompressor)); } -LIBDEFLATEAPI void +LIBDEFLATEEXPORT void LIBDEFLATEAPI libdeflate_free_decompressor(struct libdeflate_decompressor *d) { free(d); diff --git a/lib/gzip_compress.c b/lib/gzip_compress.c index bfc75e2..d124dd8 100644 --- a/lib/gzip_compress.c +++ b/lib/gzip_compress.c @@ -33,7 +33,7 @@ #include "libdeflate.h" -LIBDEFLATEAPI size_t +LIBDEFLATEEXPORT size_t LIBDEFLATEAPI libdeflate_gzip_compress(struct libdeflate_compressor *c, const void *in, size_t in_size, void *out, size_t out_nbytes_avail) @@ -86,7 +86,7 @@ libdeflate_gzip_compress(struct libdeflate_compressor *c, return out_next - (u8 *)out; } -LIBDEFLATEAPI size_t +LIBDEFLATEEXPORT size_t LIBDEFLATEAPI libdeflate_gzip_compress_bound(struct libdeflate_compressor *c, size_t in_nbytes) { diff --git a/lib/gzip_decompress.c b/lib/gzip_decompress.c index 5703093..1b31d8a 100644 --- a/lib/gzip_decompress.c +++ b/lib/gzip_decompress.c @@ -32,7 +32,7 @@ #include "libdeflate.h" -LIBDEFLATEAPI enum libdeflate_result +LIBDEFLATEEXPORT enum libdeflate_result LIBDEFLATEAPI libdeflate_gzip_decompress_ex(struct libdeflate_decompressor *d, const void *in, size_t in_nbytes, void *out, size_t out_nbytes_avail, @@ -136,7 +136,7 @@ libdeflate_gzip_decompress_ex(struct libdeflate_decompressor *d, return LIBDEFLATE_SUCCESS; } -LIBDEFLATEAPI enum libdeflate_result +LIBDEFLATEEXPORT enum libdeflate_result LIBDEFLATEAPI libdeflate_gzip_decompress(struct libdeflate_decompressor *d, const void *in, size_t in_nbytes, void *out, size_t out_nbytes_avail, diff --git a/lib/zlib_compress.c b/lib/zlib_compress.c index b4cebaf..182abc0 100644 --- a/lib/zlib_compress.c +++ b/lib/zlib_compress.c @@ -33,7 +33,7 @@ #include "libdeflate.h" -LIBDEFLATEAPI size_t +LIBDEFLATEEXPORT size_t LIBDEFLATEAPI libdeflate_zlib_compress(struct libdeflate_compressor *c, const void *in, size_t in_size, void *out, size_t out_nbytes_avail) @@ -78,7 +78,7 @@ libdeflate_zlib_compress(struct libdeflate_compressor *c, return out_next - (u8 *)out; } -LIBDEFLATEAPI size_t +LIBDEFLATEEXPORT size_t LIBDEFLATEAPI libdeflate_zlib_compress_bound(struct libdeflate_compressor *c, size_t in_nbytes) { diff --git a/lib/zlib_decompress.c b/lib/zlib_decompress.c index c5a15ca..621197e 100644 --- a/lib/zlib_decompress.c +++ b/lib/zlib_decompress.c @@ -32,7 +32,7 @@ #include "libdeflate.h" -LIBDEFLATEAPI enum libdeflate_result +LIBDEFLATEEXPORT enum libdeflate_result LIBDEFLATEAPI libdeflate_zlib_decompress(struct libdeflate_decompressor *d, const void *in, size_t in_nbytes, void *out, size_t out_nbytes_avail, diff --git a/libdeflate.h b/libdeflate.h index 3ed1120..32cc375 100644 --- a/libdeflate.h +++ b/libdeflate.h @@ -22,23 +22,23 @@ extern "C" { */ #ifdef LIBDEFLATE_DLL # ifdef BUILDING_LIBDEFLATE -# define LIBDEFLATEAPI_SYM_VISIBILITY LIBEXPORT +# define LIBDEFLATEEXPORT LIBEXPORT # elif defined(_WIN32) || defined(__CYGWIN__) -# define LIBDEFLATEAPI_SYM_VISIBILITY __declspec(dllimport) +# define LIBDEFLATEEXPORT __declspec(dllimport) # endif #endif -#ifndef LIBDEFLATEAPI_SYM_VISIBILITY -# define LIBDEFLATEAPI_SYM_VISIBILITY +#ifndef LIBDEFLATEEXPORT +# define LIBDEFLATEEXPORT #endif -#if defined(_WIN32) && defined(__i386__) -# define LIBDEFLATEAPI_ABI __stdcall +#if defined(_WIN32) && !defined(_WIN64) +# define LIBDEFLATEAPI_ABI __stdcall #else # define LIBDEFLATEAPI_ABI #endif #if defined(BUILDING_LIBDEFLATE) && defined(__GNUC__) && \ - defined(_WIN32) && defined(__i386__) + defined(_WIN32) && !defined(_WIN64) /* * On 32-bit Windows, gcc assumes 16-byte stack alignment but MSVC only 4. * Realign the stack when entering libdeflate to avoid crashing in SSE/AVX @@ -49,8 +49,7 @@ extern "C" { # define LIBDEFLATEAPI_STACKALIGN #endif -#define LIBDEFLATEAPI LIBDEFLATEAPI_SYM_VISIBILITY LIBDEFLATEAPI_ABI \ - LIBDEFLATEAPI_STACKALIGN +#define LIBDEFLATEAPI LIBDEFLATEAPI_ABI LIBDEFLATEAPI_STACKALIGN /* ========================================================================== */ /* Compression */ @@ -72,7 +71,7 @@ struct libdeflate_compressor; * A single compressor is not safe to use by multiple threads concurrently. * However, different threads may use different compressors concurrently. */ -LIBDEFLATEAPI struct libdeflate_compressor * +LIBDEFLATEEXPORT struct libdeflate_compressor * LIBDEFLATEAPI libdeflate_alloc_compressor(int compression_level); /* @@ -82,7 +81,7 @@ libdeflate_alloc_compressor(int compression_level); * bytes. The return value is the compressed size in bytes, or 0 if the data * could not be compressed to 'out_nbytes_avail' bytes or fewer. */ -LIBDEFLATEAPI size_t +LIBDEFLATEEXPORT size_t LIBDEFLATEAPI libdeflate_deflate_compress(struct libdeflate_compressor *compressor, const void *in, size_t in_nbytes, void *out, size_t out_nbytes_avail); @@ -112,7 +111,7 @@ libdeflate_deflate_compress(struct libdeflate_compressor *compressor, * libdeflate_deflate_compress() returns 0, indicating that the compressed data * did not fit into the provided output buffer. */ -LIBDEFLATEAPI size_t +LIBDEFLATEEXPORT size_t LIBDEFLATEAPI libdeflate_deflate_compress_bound(struct libdeflate_compressor *compressor, size_t in_nbytes); @@ -120,7 +119,7 @@ libdeflate_deflate_compress_bound(struct libdeflate_compressor *compressor, * Like libdeflate_deflate_compress(), but stores the data in the zlib wrapper * format. */ -LIBDEFLATEAPI size_t +LIBDEFLATEEXPORT size_t LIBDEFLATEAPI libdeflate_zlib_compress(struct libdeflate_compressor *compressor, const void *in, size_t in_nbytes, void *out, size_t out_nbytes_avail); @@ -130,7 +129,7 @@ libdeflate_zlib_compress(struct libdeflate_compressor *compressor, * compressed with libdeflate_zlib_compress() rather than with * libdeflate_deflate_compress(). */ -LIBDEFLATEAPI size_t +LIBDEFLATEEXPORT size_t LIBDEFLATEAPI libdeflate_zlib_compress_bound(struct libdeflate_compressor *compressor, size_t in_nbytes); @@ -138,7 +137,7 @@ libdeflate_zlib_compress_bound(struct libdeflate_compressor *compressor, * Like libdeflate_deflate_compress(), but stores the data in the gzip wrapper * format. */ -LIBDEFLATEAPI size_t +LIBDEFLATEEXPORT size_t LIBDEFLATEAPI libdeflate_gzip_compress(struct libdeflate_compressor *compressor, const void *in, size_t in_nbytes, void *out, size_t out_nbytes_avail); @@ -148,7 +147,7 @@ libdeflate_gzip_compress(struct libdeflate_compressor *compressor, * compressed with libdeflate_gzip_compress() rather than with * libdeflate_deflate_compress(). */ -LIBDEFLATEAPI size_t +LIBDEFLATEEXPORT size_t LIBDEFLATEAPI libdeflate_gzip_compress_bound(struct libdeflate_compressor *compressor, size_t in_nbytes); @@ -157,7 +156,7 @@ libdeflate_gzip_compress_bound(struct libdeflate_compressor *compressor, * libdeflate_alloc_compressor(). If a NULL pointer is passed in, no action is * taken. */ -LIBDEFLATEAPI void +LIBDEFLATEEXPORT void LIBDEFLATEAPI libdeflate_free_compressor(struct libdeflate_compressor *compressor); /* ========================================================================== */ @@ -178,7 +177,7 @@ struct libdeflate_decompressor; * A single decompressor is not safe to use by multiple threads concurrently. * However, different threads may use different decompressors concurrently. */ -LIBDEFLATEAPI struct libdeflate_decompressor * +LIBDEFLATEEXPORT struct libdeflate_decompressor * LIBDEFLATEAPI libdeflate_alloc_decompressor(void); /* @@ -234,7 +233,7 @@ enum libdeflate_result { * not large enough but no other problems were encountered, or another * nonzero result code if decompression failed for another reason. */ -LIBDEFLATEAPI enum libdeflate_result +LIBDEFLATEEXPORT enum libdeflate_result LIBDEFLATEAPI libdeflate_deflate_decompress(struct libdeflate_decompressor *decompressor, const void *in, size_t in_nbytes, void *out, size_t out_nbytes_avail, @@ -246,7 +245,7 @@ libdeflate_deflate_decompress(struct libdeflate_decompressor *decompressor, * then the actual compressed size of the DEFLATE stream (aligned to the next * byte boundary) is written to *actual_in_nbytes_ret. */ -LIBDEFLATEAPI enum libdeflate_result +LIBDEFLATEEXPORT enum libdeflate_result LIBDEFLATEAPI libdeflate_deflate_decompress_ex(struct libdeflate_decompressor *decompressor, const void *in, size_t in_nbytes, void *out, size_t out_nbytes_avail, @@ -257,7 +256,7 @@ libdeflate_deflate_decompress_ex(struct libdeflate_decompressor *decompressor, * Like libdeflate_deflate_decompress(), but assumes the zlib wrapper format * instead of raw DEFLATE. */ -LIBDEFLATEAPI enum libdeflate_result +LIBDEFLATEEXPORT enum libdeflate_result LIBDEFLATEAPI libdeflate_zlib_decompress(struct libdeflate_decompressor *decompressor, const void *in, size_t in_nbytes, void *out, size_t out_nbytes_avail, @@ -271,7 +270,7 @@ libdeflate_zlib_decompress(struct libdeflate_decompressor *decompressor, * will be decompressed. Use libdeflate_gzip_decompress_ex() if you need * multi-member support. */ -LIBDEFLATEAPI enum libdeflate_result +LIBDEFLATEEXPORT enum libdeflate_result LIBDEFLATEAPI libdeflate_gzip_decompress(struct libdeflate_decompressor *decompressor, const void *in, size_t in_nbytes, void *out, size_t out_nbytes_avail, @@ -284,7 +283,7 @@ libdeflate_gzip_decompress(struct libdeflate_decompressor *decompressor, * buffer was decompressed), then the actual number of input bytes consumed is * written to *actual_in_nbytes_ret. */ -LIBDEFLATEAPI enum libdeflate_result +LIBDEFLATEEXPORT enum libdeflate_result LIBDEFLATEAPI libdeflate_gzip_decompress_ex(struct libdeflate_decompressor *decompressor, const void *in, size_t in_nbytes, void *out, size_t out_nbytes_avail, @@ -296,7 +295,7 @@ libdeflate_gzip_decompress_ex(struct libdeflate_decompressor *decompressor, * libdeflate_alloc_decompressor(). If a NULL pointer is passed in, no action * is taken. */ -LIBDEFLATEAPI void +LIBDEFLATEEXPORT void LIBDEFLATEAPI libdeflate_free_decompressor(struct libdeflate_decompressor *decompressor); /* ========================================================================== */ @@ -309,7 +308,7 @@ libdeflate_free_decompressor(struct libdeflate_decompressor *decompressor); * required initial value for 'adler' is 1. This value is also returned when * 'buffer' is specified as NULL. */ -LIBDEFLATEAPI uint32_t +LIBDEFLATEEXPORT uint32_t LIBDEFLATEAPI libdeflate_adler32(uint32_t adler32, const void *buffer, size_t len); @@ -319,7 +318,7 @@ libdeflate_adler32(uint32_t adler32, const void *buffer, size_t len); * initial value for 'crc' is 0. This value is also returned when 'buffer' is * specified as NULL. */ -LIBDEFLATEAPI uint32_t +LIBDEFLATEEXPORT uint32_t LIBDEFLATEAPI libdeflate_crc32(uint32_t crc, const void *buffer, size_t len); #ifdef __cplusplus