From d6d50c69554ac25897fc988d671e8e39780bab92 Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Sat, 8 Dec 2018 10:11:11 -0800 Subject: [PATCH] Fix stack alignment in 32-bit Windows builds Resolves https://github.com/ebiggers/libdeflate/issues/35 --- libdeflate.h | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/libdeflate.h b/libdeflate.h index ba9e9b2..678f472 100644 --- a/libdeflate.h +++ b/libdeflate.h @@ -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 */ /* ========================================================================== */