Fix stack alignment in 32-bit Windows builds

Resolves https://github.com/ebiggers/libdeflate/issues/35
This commit is contained in:
Eric Biggers 2018-12-08 10:11:11 -08:00
parent 906c54c16f
commit d6d50c6955

View File

@ -22,15 +22,30 @@ extern "C" {
*/
#ifdef LIBDEFLATE_DLL
# ifdef BUILDING_LIBDEFLATE
# define LIBDEFLATEAPI LIBEXPORT
# define LIBDEFLATEAPI_SYM_VISIBILITY LIBEXPORT
# elif defined(_WIN32) || defined(__CYGWIN__)
# define LIBDEFLATEAPI __declspec(dllimport)
# define LIBDEFLATEAPI_SYM_VISIBILITY __declspec(dllimport)
# endif
#endif
#ifndef LIBDEFLATEAPI
# define LIBDEFLATEAPI
#ifndef LIBDEFLATEAPI_SYM_VISIBILITY
# define LIBDEFLATEAPI_SYM_VISIBILITY
#endif
#if defined(BUILDING_LIBDEFLATE) && defined(__GNUC__) && \
defined(_WIN32) && defined(__i386__)
/*
* 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
* code when called from an MSVC-compiled application.
*/
# define LIBDEFLATEAPI_STACKALIGN __attribute__((force_align_arg_pointer))
#endif
#ifndef LIBDEFLATEAPI_STACKALIGN
# define LIBDEFLATEAPI_STACKALIGN
#endif
#define LIBDEFLATEAPI LIBDEFLATEAPI_SYM_VISIBILITY LIBDEFLATEAPI_STACKALIGN
/* ========================================================================== */
/* Compression */
/* ========================================================================== */