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.
|
# 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) $<
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue