From f0c2324f6be1a3b91b88412354e7c80e19cd03e7 Mon Sep 17 00:00:00 2001 From: Jeffrey Walton Date: Sun, 17 Sep 2017 20:07:53 -0400 Subject: [PATCH] Fix armeabi and armv7-a for Android (GH #509) --- GNUmakefile-cross | 51 ++++++++++++++++++++++++++++++++++++++++++++--- aria-simd.cpp | 4 ++++ blake2-simd.cpp | 4 ++++ config.h | 7 ++++--- crc-simd.cpp | 15 +++++++------- crc.cpp | 7 +++++++ gcm-simd.cpp | 2 +- neon-simd.cpp | 4 ++++ rijndael-simd.cpp | 7 +++---- sha-simd.cpp | 9 ++++----- shacal2-simd.cpp | 7 +++---- 11 files changed, 90 insertions(+), 27 deletions(-) diff --git a/GNUmakefile-cross b/GNUmakefile-cross index e27d89de..eab8ada6 100755 --- a/GNUmakefile-cross +++ b/GNUmakefile-cross @@ -13,12 +13,19 @@ LN ?= ln -sf IS_i686 := $(shell $(CXX) -dumpmachine 2>&1 | $(EGREP) -i -c 'i.86') IS_x86_64 := $(shell $(CXX) -dumpmachine 2>&1 | $(EGREP) -i -c 'x86_64|amd64') +IS_ARM := $(shell $(CXX) -dumpmachine 2>&1 | $(EGREP) -i -c 'arm') IS_ARMv8 := $(shell $(CXX) -dumpmachine 2>&1 | $(EGREP) -i -c 'aarch32|aarch64') CLANG_COMPILER := $(shell $(CXX) --version 2>&1 | $(EGREP) -i -c "clang") IS_IOS ?= 0 IS_ANDROID ?= 0 IS_ARM_EMBEDDED ?= 0 +IS_NEON ?= 0 + +# Fixup ARM +ifeq ($(IS_ARMv8),1) + IS_ARM := 0 +endif # Can be used by Android and Embeeded cross-compiles. Disable by default because # Android and embedded users typically don't run this configuration. @@ -179,10 +186,48 @@ ifeq ($(findstring lean,$(MAKECMDGOALS)),lean) endif # MAKECMDGOALS endif # Dead code stripping +# Pickup ARMv7 and NEON. Do it after Android, iOS and Embedded flags have been set. +ifeq ($(IS_ARM),1) + IS_ARMv7 := $(shell echo | $(CXX) -x c++ $(CXXFLAGS) -dM -E - 2>/dev/null | $(EGREP) -i -c '__ARM_ARCH 7') + ifeq ($(IS_ARMv7),1) + IS_NEON := 1 + else + IS_NEON := $(shell echo | $(CXX) -x c++ $(CXXFLAGS) -dM -E - 2>/dev/null | $(EGREP) -i -c -E '\<__ARM_NEON\>') + endif +endif + +# ARMv7-a +ifeq ($(IS_ARMv7),1) + ifeq ($(findstring -march=armv7-a,$(CXXFLAGS)),) + NEON_FLAG = -march=armv7-a + GCM_FLAG = -march=armv7-a + ARIA_FLAG = -march=armv7-a + BLAKE2_FLAG = -march=armv7-a + endif +endif + +# NEON +ifeq ($(IS_NEON),1) + ifeq ($(findstring -mfpu=neon,$(CXXFLAGS)),) + NEON_FLAG += -mfpu=neon + GCM_FLAG += -mfpu=neon + ARIA_FLAG += -mfpu=neon + BLAKE2_FLAG += -mfpu=neon + ifeq ($(IS_ANDROID),1) + ifeq ($(findstring -mfloat-abi=softfp,$(CXXFLAGS)),) + NEON_FLAG += -mfloat-abi=softfp + GCM_FLAG += -mfloat-abi=softfp + ARIA_FLAG += -mfloat-abi=softfp + BLAKE2_FLAG += -mfloat-abi=softfp + endif + endif + endif +endif + # ARMv8-a -ifeq ($(IS_ARMv8),1) - HAVE_NEON := $(shell echo | $(CXX) -x c++ $(CXXFLAGS) -march=armv8-a -dM -E - 2>/dev/null | $(EGREP) -i -c __ARM_NEON) - ifeq ($(HAVE_NEON),1) +ifneq ($(IS_ARMv8),0) + IS_NEON := $(shell echo | $(CXX) -x c++ $(CXXFLAGS) -march=armv8-a -dM -E - 2>/dev/null | $(EGREP) -i -c __ARM_NEON) + ifeq ($(IS_NEON),1) ARIA_FLAG = -march=armv8-a BLAKE2_FLAG = -march=armv8-a NEON_FLAG = -march=armv8-a diff --git a/aria-simd.cpp b/aria-simd.cpp index 0d89b049..cc401b27 100644 --- a/aria-simd.cpp +++ b/aria-simd.cpp @@ -10,6 +10,10 @@ #include "config.h" #include "misc.h" +#if !(defined(__ARM_NEON) || defined(_MSC_VER)) +# undef CRYPTOPP_ARM_NEON_AVAILABLE +#endif + #if (CRYPTOPP_ARM_NEON_AVAILABLE) # include #endif diff --git a/blake2-simd.cpp b/blake2-simd.cpp index 45834c85..46008665 100644 --- a/blake2-simd.cpp +++ b/blake2-simd.cpp @@ -11,6 +11,10 @@ #include "misc.h" #include "blake2.h" +#if !(defined(__ARM_NEON) || defined(_MSC_VER)) +# undef CRYPTOPP_ARM_NEON_AVAILABLE +#endif + #if (CRYPTOPP_SSE42_AVAILABLE) # include # include diff --git a/config.h b/config.h index 56526ebf..092edbd6 100644 --- a/config.h +++ b/config.h @@ -541,9 +541,10 @@ NAMESPACE_END #if (CRYPTOPP_BOOL_ARM32 || CRYPTOPP_BOOL_ARM64) // Requires ARMv7 and ACLE 1.0. Testing shows ARMv7 is really ARMv7a under most toolchains. +// Android still uses ARMv5 and ARMv6 so we have to be conservative when enabling NEON. #if !defined(CRYPTOPP_ARM_NEON_AVAILABLE) && !defined(CRYPTOPP_DISABLE_ASM) -# if defined(__ARM_NEON__) || defined(__ARM_FEATURE_NEON) || (CRYPTOPP_MSC_VERSION >= 1700) || \ - (CRYPTOPP_GCC_VERSION >= 40800) || (CRYPTOPP_LLVM_CLANG_VERSION >= 30500) +# if defined(__ARM_NEON__) || defined(__ARM_FEATURE_NEON) || \ + (__ARM_ARCH >= 7) || (CRYPTOPP_MSC_VERSION >= 1700) # define CRYPTOPP_ARM_NEON_AVAILABLE 1 # endif #endif @@ -564,7 +565,7 @@ NAMESPACE_END // TODO: Add MSC_VER and ARM-64 platform define when available #if !defined(CRYPTOPP_ARM_CRC32_AVAILABLE) && !defined(CRYPTOPP_DISABLE_ASM) && !defined(__apple_build_version__) # if (defined(__ARM_FEATURE_CRC32) || (CRYPTOPP_MSC_VERSION >= 1910) || \ - defined(__aarch32__) || defined(__aarch64__)) && !defined(__ANDROID__) + defined(__aarch32__) || defined(__aarch64__)) # define CRYPTOPP_ARM_CRC32_AVAILABLE 1 # endif #endif diff --git a/crc-simd.cpp b/crc-simd.cpp index fe287279..67ab460f 100644 --- a/crc-simd.cpp +++ b/crc-simd.cpp @@ -11,8 +11,10 @@ #include "misc.h" // We set CRYPTOPP_ARM_CRC32_AVAILABLE based on compiler version. -// If the crypto is not available, then we have to disable it here. -#if !(defined(__ARM_FEATURE_CRC32) || defined(_MSC_VER)) +// If the crc is not available, then we have to disable it here. +// Android does not provide -march=armv8-a+crc or -march=armv8.1-a+crc, so +// it looks like we will have to disable CRC acceleration of their devices. +#if !(defined(__ARM_FEATURE_CRC32) || defined(_MSC_VER)) || defined(__ANDROID__) # undef CRYPTOPP_ARM_CRC32_AVAILABLE #endif @@ -20,12 +22,11 @@ # include #endif -#if (CRYPTOPP_ARM_NEON_AVAILABLE) +#if (CRYPTOPP_ARM_CRC32_AVAILABLE) # include -#endif - -#if defined(CRYPTOPP_ARM_ACLE_AVAILABLE) -# include +# if defined(CRYPTOPP_ARM_ACLE_AVAILABLE) +# include +# endif #endif #ifdef CRYPTOPP_GNU_STYLE_INLINE_ASSEMBLY diff --git a/crc.cpp b/crc.cpp index 21153d3d..89df19fa 100644 --- a/crc.cpp +++ b/crc.cpp @@ -8,6 +8,13 @@ NAMESPACE_BEGIN(CryptoPP) +// We set CRYPTOPP_ARM_CRC32_AVAILABLE based on compiler version. +// Android does not provide -march=armv8-a+crc or -march=armv8.1-a+crc, so +// it looks like we will have to disable CRC acceleration of their devices. +#if defined(__ANDROID__) +# undef CRYPTOPP_ARM_CRC32_AVAILABLE +#endif + // crc-simd.cpp #if (CRYPTOPP_ARM_CRC32_AVAILABLE) extern void CRC32_Update_ARMV8(const byte *s, size_t n, word32& c); diff --git a/gcm-simd.cpp b/gcm-simd.cpp index 5e200087..d7a23b05 100644 --- a/gcm-simd.cpp +++ b/gcm-simd.cpp @@ -35,7 +35,7 @@ # include #endif -#if (CRYPTOPP_ARM_NEON_AVAILABLE) +#if (CRYPTOPP_ARM_NEON_AVAILABLE || CRYPTOPP_ARM_PMULL_AVAILABLE) # include #endif diff --git a/neon-simd.cpp b/neon-simd.cpp index 88d06cce..c723351d 100644 --- a/neon-simd.cpp +++ b/neon-simd.cpp @@ -10,6 +10,10 @@ #include "config.h" #include "stdcpp.h" +#if !(defined(__ARM_NEON) || defined(_MSC_VER)) +# undef CRYPTOPP_ARM_NEON_AVAILABLE +#endif + #if (CRYPTOPP_ARM_NEON_AVAILABLE) # include #endif diff --git a/rijndael-simd.cpp b/rijndael-simd.cpp index 0cb7bc81..e1bda7b4 100644 --- a/rijndael-simd.cpp +++ b/rijndael-simd.cpp @@ -41,10 +41,9 @@ #if (CRYPTOPP_ARM_AES_AVAILABLE) # include -#endif - -#if defined(CRYPTOPP_ARM_ACLE_AVAILABLE) -# include +# if defined(CRYPTOPP_ARM_ACLE_AVAILABLE) +# include +# endif #endif #if defined(CRYPTOPP_ALTIVEC_AVAILABLE) diff --git a/sha-simd.cpp b/sha-simd.cpp index d3a869d6..4cf144c8 100644 --- a/sha-simd.cpp +++ b/sha-simd.cpp @@ -22,12 +22,11 @@ # include #endif -#if (CRYPTOPP_ARM_NEON_AVAILABLE) +#if (CRYPTOPP_ARM_SHA_AVAILABLE) # include -#endif - -#if defined(CRYPTOPP_ARM_ACLE_AVAILABLE) -# include +# if defined(CRYPTOPP_ARM_ACLE_AVAILABLE) +# include +# endif #endif #ifdef CRYPTOPP_GNU_STYLE_INLINE_ASSEMBLY diff --git a/shacal2-simd.cpp b/shacal2-simd.cpp index 0eb18d3a..93cb6e07 100644 --- a/shacal2-simd.cpp +++ b/shacal2-simd.cpp @@ -29,10 +29,9 @@ #if (CRYPTOPP_ARM_SHA_AVAILABLE) # include -#endif - -#if defined(CRYPTOPP_ARM_ACLE_AVAILABLE) -# include +# if defined(CRYPTOPP_ARM_ACLE_AVAILABLE) +# include +# endif #endif // Clang __m128i casts, http://bugs.llvm.org/show_bug.cgi?id=20670