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.
This commit is contained in:
Eric Biggers 2019-12-28 13:20:50 -06:00
parent 91e972e864
commit 3acda56db0
9 changed files with 42 additions and 43 deletions

View File

@ -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 */

View File

@ -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 */

View File

@ -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)
{

View File

@ -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);

View File

@ -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)
{

View File

@ -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,

View File

@ -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)
{

View File

@ -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,

View File

@ -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__)
#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