Workaround for compiler bug (GCC 4.8 and 4.9 when targetting 32-bit x86).
authorThomas Pornin <pornin@bolet.org>
Mon, 17 Apr 2017 13:36:06 +0000 (13:36 +0000)
committerThomas Pornin <pornin@bolet.org>
Mon, 17 Apr 2017 13:36:06 +0000 (13:36 +0000)
src/hash/ghash_pclmul.c
src/inner.h

index 7ec9823..7c8f2fa 100644 (file)
 #if BR_AES_X86NI_GCC_OLD
 #pragma GCC push_options
 #pragma GCC target("sse2,ssse3,pclmul")
+#pragma GCC diagnostic ignored "-Wpsabi"
 #endif
 #include <tmmintrin.h>
 #include <wmmintrin.h>
 #include <cpuid.h>
-#if BR_AES_X86NI_GCC_OLD
-#pragma GCC pop_options
-#endif
 #endif
 
 #if BR_AES_X86NI_MSC
@@ -349,6 +347,10 @@ br_ghash_pclmul_get(void)
        return pclmul_supported() ? &br_ghash_pclmul : 0;
 }
 
+#if BR_AES_X86NI_GCC && BR_AES_X86NI_GCC_OLD
+#pragma GCC pop_options
+#endif
+
 #else
 
 /* see bearssl_hash.h */
index 3cafa42..3830c7c 100644 (file)
  * GCC versions from 4.4 to 4.8 (inclusive) must use a special #pragma
  * to activate extra opcodes before including the relevant intrinsic
  * 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 __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
 #endif
 #endif