diff --git a/GNUmakefile b/GNUmakefile index cf068d27..5541cc10 100755 --- a/GNUmakefile +++ b/GNUmakefile @@ -1057,8 +1057,13 @@ endif # Cryptogams AES for ARMv4 and above. We couple to ARMv7. # Avoid iOS. It cannot consume the assembly. ifeq ($(IS_ARM32),1) - CRYPTOGAMS_ARCH_FLAG = -march=armv7-a - CRYPTOGAMS_ARCH_FLAG += -Wa,--noexecstack + ifeq ($(CLANG_COMPILER),1) + 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 endif @@ -1421,9 +1426,9 @@ ifeq ($(wildcard GNUmakefile.deps),GNUmakefile.deps) -include GNUmakefile.deps endif # Dependencies -# Cryptogams ARM asm implementation. +# Cryptogams ARM asm implementation. AES needs -mthumb for Clang 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 aria_simd.o : aria_simd.cpp @@ -1507,15 +1512,15 @@ sha_simd.o : sha_simd.cpp # Cryptogams ARM asm implementation. sha1_armv4.o : sha1_armv4.S - $(CC) $(strip $(CXXFLAGS) $(CRYPTOGAMS_ARCH_FLAG) -c) $< + $(CC) $(strip $(CXXFLAGS) $(CRYPTOGAMS_ARMV7_FLAG) -c) $< # Cryptogams ARM asm implementation. sha256_armv4.o : sha256_armv4.S - $(CC) $(strip $(CXXFLAGS) $(CRYPTOGAMS_ARCH_FLAG) -c) $< + $(CC) $(strip $(CXXFLAGS) $(CRYPTOGAMS_ARMV7_FLAG) -c) $< # Cryptogams ARM asm implementation. 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 $(CXX) $(strip $(CXXFLAGS) $(SHA3_FLAG) -c) $< diff --git a/GNUmakefile-cross b/GNUmakefile-cross index dd6237e3..ccf8edd3 100755 --- a/GNUmakefile-cross +++ b/GNUmakefile-cross @@ -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))) # Cryptogams AES for ARMv4 and above. We couple to ARMv7. -# Avoid iOS. It cannot consume the assembly. ifeq ($(IS_ARM32),1) - ifneq ($(IS_IOS),1) - CRYPTOGAMS_ARCH_FLAG = -march=armv7-a - CRYPTOGAMS_ARCH_FLAG += -Wa,--noexecstack - SRCS += aes_armv4.S sha1_armv4.S sha256_armv4.S sha512_armv4.S + ifeq ($(CLANG_COMPILER),1) + 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 endif # 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 endif # Dependencies -# Cryptogams ARM asm implementation. +# Cryptogams ARM asm implementation. AES needs -mthumb for Clang 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 $(CXX) $(strip $(CXXFLAGS) -fpermissive -c) cpu-features.c @@ -867,15 +869,15 @@ sha_simd.o : sha_simd.cpp # Cryptogams ARM asm implementation. sha1_armv4.o : sha1_armv4.S - $(CC) $(strip $(CXXFLAGS) $(CRYPTOGAMS_ARCH_FLAG) -c) $< + $(CC) $(strip $(CXXFLAGS) $(CRYPTOGAMS_ARMV7_FLAG) -c) $< # Cryptogams ARM asm implementation. sha256_armv4.o : sha256_armv4.S - $(CC) $(strip $(CXXFLAGS) $(CRYPTOGAMS_ARCH_FLAG) -c) $< + $(CC) $(strip $(CXXFLAGS) $(CRYPTOGAMS_ARMV7_FLAG) -c) $< # Cryptogams ARM asm implementation. 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 shacal2_simd.o : shacal2_simd.cpp diff --git a/config_asm.h b/config_asm.h index 6a001078..cba714a3 100644 --- a/config_asm.h +++ b/config_asm.h @@ -359,13 +359,10 @@ // 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 // 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 -// under Clang. Also see https://bugs.llvm.org/show_bug.cgi?id=38133. +// sha1_armv4.S and sha256_armv4.S. #if !defined(CRYPTOPP_DISABLE_ASM) && defined(__arm__) -# if defined(__GNUC__) && !defined(__clang__) -# define CRYPTOGAMS_ARM_AES 1 -# endif # if defined(__GNUC__) || defined(__clang__) +# define CRYPTOGAMS_ARM_AES 1 # define CRYPTOGAMS_ARM_SHA1 1 # define CRYPTOGAMS_ARM_SHA256 1 # define CRYPTOGAMS_ARM_SHA512 1