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
parent
6acbbf1849
commit
02baab2307
19
GNUmakefile
19
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) $<
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue