Enable Cryptogams AES on ARM using Clang

It looks like AES needed -mthumb for Clang. SHA must not use -mthumb under Clang due to a crash.
pull/853/head
Jeffrey Walton 2019-05-21 04:23:40 -04:00
parent 6acbbf1849
commit 02baab2307
No known key found for this signature in database
GPG Key ID: B36AB348921B1838
3 changed files with 26 additions and 22 deletions

View File

@ -1057,8 +1057,13 @@ endif
# Cryptogams AES for ARMv4 and above. We couple to ARMv7. # Cryptogams AES for ARMv4 and above. We couple to ARMv7.
# Avoid iOS. It cannot consume the assembly. # Avoid iOS. It cannot consume the assembly.
ifeq ($(IS_ARM32),1) ifeq ($(IS_ARM32),1)
CRYPTOGAMS_ARCH_FLAG = -march=armv7-a ifeq ($(CLANG_COMPILER),1)
CRYPTOGAMS_ARCH_FLAG += -Wa,--noexecstack CRYPTOGAMS_ARMV7_FLAG = -march=armv7-a -Wa,--noexecstack
CRYPTOGAMS_ARMV7_THUMB_FLAG = -march=armv7-a -mthumb -Wa,--noexecstack
else
CRYPTOGAMS_ARMV7_FLAG = -march=armv7-a -Wa,--noexecstack
CRYPTOGAMS_ARMV7_THUMB_FLAG = -march=armv7-a -Wa,--noexecstack
endif
SRCS += aes_armv4.S sha1_armv4.S sha256_armv4.S sha512_armv4.S SRCS += aes_armv4.S sha1_armv4.S sha256_armv4.S sha512_armv4.S
endif endif
@ -1421,9 +1426,9 @@ ifeq ($(wildcard GNUmakefile.deps),GNUmakefile.deps)
-include GNUmakefile.deps -include GNUmakefile.deps
endif # Dependencies endif # Dependencies
# Cryptogams ARM asm implementation. # Cryptogams ARM asm implementation. AES needs -mthumb for Clang
aes_armv4.o : aes_armv4.S aes_armv4.o : aes_armv4.S
$(CC) $(strip $(CXXFLAGS) $(CRYPTOGAMS_ARCH_FLAG) -c) $< $(CC) $(strip $(CXXFLAGS) $(CRYPTOGAMS_ARMV7_THUMB_FLAG) -c) $<
# SSSE3 or NEON available # SSSE3 or NEON available
aria_simd.o : aria_simd.cpp aria_simd.o : aria_simd.cpp
@ -1507,15 +1512,15 @@ sha_simd.o : sha_simd.cpp
# Cryptogams ARM asm implementation. # Cryptogams ARM asm implementation.
sha1_armv4.o : sha1_armv4.S sha1_armv4.o : sha1_armv4.S
$(CC) $(strip $(CXXFLAGS) $(CRYPTOGAMS_ARCH_FLAG) -c) $< $(CC) $(strip $(CXXFLAGS) $(CRYPTOGAMS_ARMV7_FLAG) -c) $<
# Cryptogams ARM asm implementation. # Cryptogams ARM asm implementation.
sha256_armv4.o : sha256_armv4.S sha256_armv4.o : sha256_armv4.S
$(CC) $(strip $(CXXFLAGS) $(CRYPTOGAMS_ARCH_FLAG) -c) $< $(CC) $(strip $(CXXFLAGS) $(CRYPTOGAMS_ARMV7_FLAG) -c) $<
# Cryptogams ARM asm implementation. # Cryptogams ARM asm implementation.
sha512_armv4.o : sha512_armv4.S sha512_armv4.o : sha512_armv4.S
$(CC) $(strip $(CXXFLAGS) $(CRYPTOGAMS_ARCH_FLAG) -c) $< $(CC) $(strip $(CXXFLAGS) $(CRYPTOGAMS_ARMV7_FLAG) -c) $<
sha3_simd.o : sha3_simd.cpp sha3_simd.o : sha3_simd.cpp
$(CXX) $(strip $(CXXFLAGS) $(SHA3_FLAG) -c) $< $(CXX) $(strip $(CXXFLAGS) $(SHA3_FLAG) -c) $<

View File

@ -589,13 +589,15 @@ SRCS := cryptlib.cpp cpu.cpp integer.cpp $(filter-out cryptlib.cpp cpu.cpp integ
INCL := $(filter-out resource.h,$(sort $(wildcard *.h))) INCL := $(filter-out resource.h,$(sort $(wildcard *.h)))
# Cryptogams AES for ARMv4 and above. We couple to ARMv7. # Cryptogams AES for ARMv4 and above. We couple to ARMv7.
# Avoid iOS. It cannot consume the assembly.
ifeq ($(IS_ARM32),1) ifeq ($(IS_ARM32),1)
ifneq ($(IS_IOS),1) ifeq ($(CLANG_COMPILER),1)
CRYPTOGAMS_ARCH_FLAG = -march=armv7-a CRYPTOGAMS_ARMV7_FLAG = -march=armv7-a -Wa,--noexecstack
CRYPTOGAMS_ARCH_FLAG += -Wa,--noexecstack CRYPTOGAMS_ARMV7_THUMB_FLAG = -march=armv7-a -mthumb -Wa,--noexecstack
SRCS += aes_armv4.S sha1_armv4.S sha256_armv4.S sha512_armv4.S else
CRYPTOGAMS_ARMV7_FLAG = -march=armv7-a -Wa,--noexecstack
CRYPTOGAMS_ARMV7_THUMB_FLAG = -march=armv7-a -Wa,--noexecstack
endif endif
SRCS += aes_armv4.S sha1_armv4.S sha256_armv4.S sha512_armv4.S
endif endif
# List cryptlib.cpp first, then cpu.cpp, then integer.cpp to tame C++ static initialization problems. # List cryptlib.cpp first, then cpu.cpp, then integer.cpp to tame C++ static initialization problems.
@ -798,9 +800,9 @@ ifeq ($(wildcard GNUmakefile.deps),GNUmakefile.deps)
-include GNUmakefile.deps -include GNUmakefile.deps
endif # Dependencies endif # Dependencies
# Cryptogams ARM asm implementation. # Cryptogams ARM asm implementation. AES needs -mthumb for Clang
aes_armv4.o : aes_armv4.S aes_armv4.o : aes_armv4.S
$(CXX) $(strip $(CXXFLAGS) -fpermissive $(CRYPTOGAMS_ARCH_FLAG) -c) $< $(CC) $(strip $(CXXFLAGS) $(CRYPTOGAMS_ARMV7_THUMB_FLAG) -c) $<
cpu-features.o: cpu-features.h cpu-features.c cpu-features.o: cpu-features.h cpu-features.c
$(CXX) $(strip $(CXXFLAGS) -fpermissive -c) cpu-features.c $(CXX) $(strip $(CXXFLAGS) -fpermissive -c) cpu-features.c
@ -867,15 +869,15 @@ sha_simd.o : sha_simd.cpp
# Cryptogams ARM asm implementation. # Cryptogams ARM asm implementation.
sha1_armv4.o : sha1_armv4.S sha1_armv4.o : sha1_armv4.S
$(CC) $(strip $(CXXFLAGS) $(CRYPTOGAMS_ARCH_FLAG) -c) $< $(CC) $(strip $(CXXFLAGS) $(CRYPTOGAMS_ARMV7_FLAG) -c) $<
# Cryptogams ARM asm implementation. # Cryptogams ARM asm implementation.
sha256_armv4.o : sha256_armv4.S sha256_armv4.o : sha256_armv4.S
$(CC) $(strip $(CXXFLAGS) $(CRYPTOGAMS_ARCH_FLAG) -c) $< $(CC) $(strip $(CXXFLAGS) $(CRYPTOGAMS_ARMV7_FLAG) -c) $<
# Cryptogams ARM asm implementation. # Cryptogams ARM asm implementation.
sha512_armv4.o : sha512_armv4.S sha512_armv4.o : sha512_armv4.S
$(CC) $(strip $(CXXFLAGS) $(CRYPTOGAMS_ARCH_FLAG) -c) $< $(CC) $(strip $(CXXFLAGS) $(CRYPTOGAMS_ARMV7_FLAG) -c) $<
# SSE4.2/SHA-NI or ARMv8a available # SSE4.2/SHA-NI or ARMv8a available
shacal2_simd.o : shacal2_simd.cpp shacal2_simd.o : shacal2_simd.cpp

View File

@ -359,13 +359,10 @@
// about 50% faster than C/C++, and SHA implementation is about 30% faster // about 50% faster than C/C++, and SHA implementation is about 30% faster
// than C/C++. Define this to use the Cryptogams AES and SHA implementations // than C/C++. Define this to use the Cryptogams AES and SHA implementations
// on GNU Linux systems. When defined, Crypto++ will use aes_armv4.S, // on GNU Linux systems. When defined, Crypto++ will use aes_armv4.S,
// sha1_armv4.S and sha256_armv4.S. LLVM miscompiles aes_armv4.S so disable // sha1_armv4.S and sha256_armv4.S.
// under Clang. Also see https://bugs.llvm.org/show_bug.cgi?id=38133.
#if !defined(CRYPTOPP_DISABLE_ASM) && defined(__arm__) #if !defined(CRYPTOPP_DISABLE_ASM) && defined(__arm__)
# if defined(__GNUC__) && !defined(__clang__)
# define CRYPTOGAMS_ARM_AES 1
# endif
# if defined(__GNUC__) || defined(__clang__) # if defined(__GNUC__) || defined(__clang__)
# define CRYPTOGAMS_ARM_AES 1
# define CRYPTOGAMS_ARM_SHA1 1 # define CRYPTOGAMS_ARM_SHA1 1
# define CRYPTOGAMS_ARM_SHA256 1 # define CRYPTOGAMS_ARM_SHA256 1
# define CRYPTOGAMS_ARM_SHA512 1 # define CRYPTOGAMS_ARM_SHA512 1