From: Thomas Pornin Date: Thu, 9 Mar 2017 20:13:23 +0000 (+0000) Subject: Fixed compilation for GCC 4.4 to 4.8 (AES-NI opcodes; intrinsics headers require... X-Git-Tag: v0.4~7 X-Git-Url: https://bearssl.org/gitweb//home/git/?p=BearSSL;a=commitdiff_plain;h=2f88a673049d1e183d1a8f78e2030bf02362b8bf;ds=sidebyside Fixed compilation for GCC 4.4 to 4.8 (AES-NI opcodes; intrinsics headers require target options to be set). --- diff --git a/src/hash/ghash_pclmul.c b/src/hash/ghash_pclmul.c index 67ab252..7ec9823 100644 --- a/src/hash/ghash_pclmul.c +++ b/src/hash/ghash_pclmul.c @@ -32,10 +32,16 @@ #if BR_AES_X86NI #if BR_AES_X86NI_GCC -/* #pragma GCC target "sse2,ssse3,pclmul" */ +#if BR_AES_X86NI_GCC_OLD +#pragma GCC push_options +#pragma GCC target("sse2,ssse3,pclmul") +#endif #include #include #include +#if BR_AES_X86NI_GCC_OLD +#pragma GCC pop_options +#endif #endif #if BR_AES_X86NI_MSC diff --git a/src/inner.h b/src/inner.h index b03f043..47431c0 100644 --- a/src/inner.h +++ b/src/inner.h @@ -154,6 +154,18 @@ #define BR_TARGET(x) #endif +/* + * 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). + */ +#if BR_AES_X86NI_GCC && !defined BR_AES_X86NI_GCC_OLD +#if __GNUC__ == 4 && __GNUC_MINOR__ >= 4 && __GNUC_MINOR__ <= 8 && !__clang__ +#define BR_AES_X86NI_GCC_OLD 1 +#endif +#endif + /* * POWER8 crypto support. We rely on compiler macros for the * architecture, since we do not have a reliable, simple way to detect diff --git a/src/symcipher/aes_x86ni.c b/src/symcipher/aes_x86ni.c index dcc3952..d2d6369 100644 --- a/src/symcipher/aes_x86ni.c +++ b/src/symcipher/aes_x86ni.c @@ -32,8 +32,15 @@ #if BR_AES_X86NI #if BR_AES_X86NI_GCC +#if BR_AES_X86NI_GCC_OLD +#pragma GCC push_options +#pragma GCC target("sse2,sse4.1,aes,pclmul") +#endif #include #include +#if BR_AES_X86NI_GCC_OLD +#pragma GCC pop_options +#endif #endif #if BR_AES_X86NI_MSC @@ -71,6 +78,14 @@ br_aes_x86ni_supported(void) #undef MASK } +/* + * Per-function attributes appear unreliable on old GCC, so we use the + * pragma for all remaining functions in this file. + */ +#if BR_AES_X86NI_GCC_OLD +#pragma GCC target("sse2,sse4.1,aes,pclmul") +#endif + BR_TARGET("sse2,aes") static inline __m128i expand_step128(__m128i k, __m128i k2) diff --git a/src/symcipher/aes_x86ni_cbcdec.c b/src/symcipher/aes_x86ni_cbcdec.c index 6f75348..e140b9f 100644 --- a/src/symcipher/aes_x86ni_cbcdec.c +++ b/src/symcipher/aes_x86ni_cbcdec.c @@ -27,6 +27,9 @@ #if BR_AES_X86NI #if BR_AES_X86NI_GCC +#if BR_AES_X86NI_GCC_OLD +#pragma GCC target("sse2,sse4.1,aes,pclmul") +#endif #include #endif diff --git a/src/symcipher/aes_x86ni_cbcenc.c b/src/symcipher/aes_x86ni_cbcenc.c index f1c473e..2addfb6 100644 --- a/src/symcipher/aes_x86ni_cbcenc.c +++ b/src/symcipher/aes_x86ni_cbcenc.c @@ -27,6 +27,9 @@ #if BR_AES_X86NI #if BR_AES_X86NI_GCC +#if BR_AES_X86NI_GCC_OLD +#pragma GCC target("sse2,sse4.1,aes,pclmul") +#endif #include #endif diff --git a/src/symcipher/aes_x86ni_ctr.c b/src/symcipher/aes_x86ni_ctr.c index a476843..41c31b2 100644 --- a/src/symcipher/aes_x86ni_ctr.c +++ b/src/symcipher/aes_x86ni_ctr.c @@ -27,6 +27,9 @@ #if BR_AES_X86NI #if BR_AES_X86NI_GCC +#if BR_AES_X86NI_GCC_OLD +#pragma GCC target("sse2,sse4.1,aes,pclmul") +#endif #include #include #define bswap32 __builtin_bswap32