Workaround for compiler bug (GCC 4.8 and 4.9 when targetting 32-bit x86).

This commit is contained in:
Thomas Pornin 2017-04-17 13:36:06 +00:00
parent ad6a51bde3
commit d021b7eb7f
2 changed files with 9 additions and 5 deletions

View File

@ -35,13 +35,11 @@
#if BR_AES_X86NI_GCC_OLD #if BR_AES_X86NI_GCC_OLD
#pragma GCC push_options #pragma GCC push_options
#pragma GCC target("sse2,ssse3,pclmul") #pragma GCC target("sse2,ssse3,pclmul")
#pragma GCC diagnostic ignored "-Wpsabi"
#endif #endif
#include <tmmintrin.h> #include <tmmintrin.h>
#include <wmmintrin.h> #include <wmmintrin.h>
#include <cpuid.h> #include <cpuid.h>
#if BR_AES_X86NI_GCC_OLD
#pragma GCC pop_options
#endif
#endif #endif
#if BR_AES_X86NI_MSC #if BR_AES_X86NI_MSC
@ -349,6 +347,10 @@ br_ghash_pclmul_get(void)
return pclmul_supported() ? &br_ghash_pclmul : 0; return pclmul_supported() ? &br_ghash_pclmul : 0;
} }
#if BR_AES_X86NI_GCC && BR_AES_X86NI_GCC_OLD
#pragma GCC pop_options
#endif
#else #else
/* see bearssl_hash.h */ /* see bearssl_hash.h */

View File

@ -157,10 +157,12 @@
* GCC versions from 4.4 to 4.8 (inclusive) must use a special #pragma * GCC versions from 4.4 to 4.8 (inclusive) must use a special #pragma
* to activate extra opcodes before including the relevant intrinsic * to activate extra opcodes before including the relevant intrinsic
* headers. But these don't work with Clang (which does not need them * headers. But these don't work with Clang (which does not need them
* either). * either). We also need that #pragma for GCC 4.9 in order to work
* around a compiler bug (it tends to blow up on ghash_pclmul code
* otherwise).
*/ */
#if BR_AES_X86NI_GCC && !defined BR_AES_X86NI_GCC_OLD #if BR_AES_X86NI_GCC && !defined BR_AES_X86NI_GCC_OLD
#if __GNUC__ == 4 && __GNUC_MINOR__ >= 4 && __GNUC_MINOR__ <= 8 && !__clang__ #if __GNUC__ == 4 && __GNUC_MINOR__ >= 4 && __GNUC_MINOR__ <= 9 && !__clang__
#define BR_AES_X86NI_GCC_OLD 1 #define BR_AES_X86NI_GCC_OLD 1
#endif #endif
#endif #endif