Skip to content

Commit 720ec68

Browse files
committed
CRC32C build system integration
1 parent 39c9d0d commit 720ec68

File tree

4 files changed

+128
-2
lines changed

4 files changed

+128
-2
lines changed

configure.ac

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -858,6 +858,50 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <fcntl.h>]],
858858
[ AC_MSG_RESULT(no); HAVE_O_CLOEXEC=0 ]
859859
)
860860

861+
# crc32c platform checks
862+
AC_MSG_CHECKING(for __builtin_prefetch)
863+
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ ]], [[
864+
char data = 0;
865+
const char* address = &data;
866+
__builtin_prefetch(address, 0, 0);
867+
]])],
868+
[ AC_MSG_RESULT(yes); HAVE_BUILTIN_PREFETCH=1 ],
869+
[ AC_MSG_RESULT(no); HAVE_BUILTIN_PREFETCH=0 ]
870+
)
871+
872+
AC_MSG_CHECKING(for _mm_prefetch)
873+
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <xmmintrin.h>]], [[
874+
char data = 0;
875+
const char* address = &data;
876+
_mm_prefetch(address, _MM_HINT_NTA);
877+
]])],
878+
[ AC_MSG_RESULT(yes); HAVE_MM_PREFETCH=1 ],
879+
[ AC_MSG_RESULT(no); HAVE_MM_PREFETCH=0 ]
880+
)
881+
882+
AC_MSG_CHECKING(for strong getauxval support in the system headers)
883+
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
884+
#include <arm_acle.h>
885+
#include <arm_neon.h>
886+
#include <sys/auxv.h>
887+
]], [[
888+
getauxval(AT_HWCAP);
889+
]])],
890+
[ AC_MSG_RESULT(yes); HAVE_STRONG_GETAUXVAL=1 ],
891+
[ AC_MSG_RESULT(no); HAVE_STRONG_GETAUXVAL=0 ]
892+
)
893+
894+
AC_MSG_CHECKING(for weak getauxval support in the compiler)
895+
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
896+
unsigned long getauxval(unsigned long type) __attribute__((weak));
897+
#define AT_HWCAP 16
898+
]], [[
899+
getauxval(AT_HWCAP);
900+
]])],
901+
[ AC_MSG_RESULT(yes); HAVE_WEAK_GETAUXVAL=1 ],
902+
[ AC_MSG_RESULT(no); HAVE_WEAK_GETAUXVAL=0 ]
903+
)
904+
861905
# Check for reduced exports
862906
if test x$use_reduce_exports = xyes; then
863907
AX_CHECK_COMPILE_FLAG([-fvisibility=hidden],[RE_CXXFLAGS="-fvisibility=hidden"],
@@ -1189,6 +1233,7 @@ AC_SUBST(SSE42_CXXFLAGS)
11891233
AC_SUBST(SSE41_CXXFLAGS)
11901234
AC_SUBST(AVX2_CXXFLAGS)
11911235
AC_SUBST(SHANI_CXXFLAGS)
1236+
AC_SUBST(ARM_CRC_CXXFLAGS)
11921237
AC_SUBST(LIBTOOL_APP_LDFLAGS)
11931238
AC_SUBST(USE_UPNP)
11941239
AC_SUBST(USE_QRCODE)
@@ -1208,6 +1253,10 @@ AC_SUBST(QR_LIBS)
12081253
AC_SUBST(HAVE_FDATASYNC)
12091254
AC_SUBST(HAVE_FULLFSYNC)
12101255
AC_SUBST(HAVE_O_CLOEXEC)
1256+
AC_SUBST(HAVE_BUILTIN_PREFETCH)
1257+
AC_SUBST(HAVE_MM_PREFETCH)
1258+
AC_SUBST(HAVE_STRONG_GETAUXVAL)
1259+
AC_SUBST(HAVE_WEAK_GETAUXVAL)
12111260
AC_CONFIG_FILES([Makefile src/Makefile share/setup.nsi share/qt/Info.plist])
12121261
AC_CONFIG_FILES([contrib/devtools/split-debug.sh],[chmod +x contrib/devtools/split-debug.sh])
12131262
AM_COND_IF([HAVE_DOXYGEN], [AC_CONFIG_FILES([doc/Doxyfile])])

src/Makefile.am

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,7 @@ clean-local:
413413
$(AM_V_GEN) $(PROTOC) --cpp_out=$(@D) --proto_path=$(<D) $<
414414

415415
if EMBEDDED_LEVELDB
416+
include Makefile.crc32c.include
416417
include Makefile.leveldb.include
417418
endif
418419

src/Makefile.crc32c.include

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
# Copyright (c) 2019 The Bitcoin Core developers
2+
# Distributed under the MIT software license, see the accompanying
3+
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
4+
5+
LIBCRC32C_INT = crc32c/libcrc32c.a
6+
LIBLEVELDB_SSE42_INT = leveldb/libleveldb_sse42.a
7+
8+
EXTRA_LIBRARIES += $(LIBCRC32C_INT)
9+
10+
LIBCRC32C = $(LIBCRC32C_INT)
11+
12+
CRC32C_CPPFLAGS_INT =
13+
CRC32C_CPPFLAGS_INT += -I$(srcdir)/crc32c/include
14+
CRC32C_CPPFLAGS_INT += -DHAVE_BUILTIN_PREFETCH=@HAVE_BUILTIN_PREFETCH@
15+
CRC32C_CPPFLAGS_INT += -DHAVE_MM_PREFETCH=@HAVE_MM_PREFETCH@
16+
CRC32C_CPPFLAGS_INT += -DHAVE_STRONG_GETAUXVAL=@HAVE_STRONG_GETAUXVAL@
17+
CRC32C_CPPFLAGS_INT += -DHAVE_WEAK_GETAUXVAL=@HAVE_WEAK_GETAUXVAL@
18+
CRC32C_CPPFLAGS_INT += -DCRC32C_TESTS_BUILT_WITH_GLOG=0
19+
20+
if ENABLE_SSE42
21+
CRC32C_CPPFLAGS_INT += -DHAVE_SSE42=1
22+
else
23+
CRC32C_CPPFLAGS_INT += -DHAVE_SSE42=0
24+
endif
25+
26+
if ENABLE_ARM_CRC
27+
CRC32C_CPPFLAGS_INT += -DHAVE_ARM64_CRC32C=1
28+
else
29+
CRC32C_CPPFLAGS_INT += -DHAVE_ARM64_CRC32C=0
30+
endif
31+
32+
if WORDS_BIGENDIAN
33+
CRC32C_CPPFLAGS_INT += -DBYTE_ORDER_BIG_ENDIAN=1
34+
else
35+
CRC32C_CPPFLAGS_INT += -DBYTE_ORDER_BIG_ENDIAN=0
36+
endif
37+
38+
crc32c_libcrc32c_a_CPPFLAGS = $(AM_CPPFLAGS) $(CRC32C_CPPFLAGS_INT) $(CRC32C_CPPFLAGS)
39+
crc32c_libcrc32c_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
40+
41+
crc32c_libcrc32c_a_SOURCES =
42+
crc32c_libcrc32c_a_SOURCES += crc32c/include/crc32c/crc32c.h
43+
crc32c_libcrc32c_a_SOURCES += crc32c/src/crc32c_arm64.h
44+
crc32c_libcrc32c_a_SOURCES += crc32c/src/crc32c_arm64_check.h
45+
crc32c_libcrc32c_a_SOURCES += crc32c/src/crc32c_internal.h
46+
crc32c_libcrc32c_a_SOURCES += crc32c/src/crc32c_prefetch.h
47+
crc32c_libcrc32c_a_SOURCES += crc32c/src/crc32c_read_le.h
48+
crc32c_libcrc32c_a_SOURCES += crc32c/src/crc32c_round_up.h
49+
crc32c_libcrc32c_a_SOURCES += crc32c/src/crc32c_sse42_check.h
50+
crc32c_libcrc32c_a_SOURCES += crc32c/src/crc32c_sse42.h
51+
52+
crc32c_libcrc32c_a_SOURCES += crc32c/src/crc32c.cc
53+
crc32c_libcrc32c_a_SOURCES += crc32c/src/crc32c_portable.cc
54+
55+
if ENABLE_SSE42
56+
LIBCRC32C_SSE42_INT = crc32c/libcrc32c_sse42.a
57+
EXTRA_LIBRARIES += $(LIBCRC32C_SSE42_INT)
58+
LIBCRC32C += $(LIBCRC32C_SSE42_INT)
59+
60+
crc32c_libcrc32c_sse42_a_CPPFLAGS = $(crc32c_libcrc32c_a_CPPFLAGS)
61+
crc32c_libcrc32c_sse42_a_CXXFLAGS = $(crc32c_libcrc32c_a_CXXFLAGS) $(SSE42_CXXFLAGS)
62+
63+
crc32c_libcrc32c_sse42_a_SOURCES = crc32c/src/crc32c_sse42.cc
64+
endif
65+
66+
if ENABLE_ARM_CRC
67+
LIBCRC32C_ARM_CRC_INT = crc32c/libcrc32c_arm_crc.a
68+
EXTRA_LIBRARIES += $(LIBCRC32C_ARM_CRC_INT)
69+
LIBCRC32C += $(LIBCRC32C_ARM_CRC_INT)
70+
71+
crc32c_libcrc32c_arm_crc_a_CPPFLAGS = $(crc32c_libcrc32c_a_CPPFLAGS)
72+
crc32c_libcrc32c_arm_crc_a_CXXFLAGS = $(crc32c_libcrc32c_a_CXXFLAGS) $(ARM_CRC_CXXFLAGS)
73+
74+
crc32c_libcrc32c_arm_crc_a_SOURCES = crc32c/src/crc32c_arm64.cc
75+
endif

src/Makefile.leveldb.include

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,17 @@ LIBMEMENV_INT = leveldb/libmemenv.a
88
EXTRA_LIBRARIES += $(LIBLEVELDB_INT)
99
EXTRA_LIBRARIES += $(LIBMEMENV_INT)
1010

11-
LIBLEVELDB += $(LIBLEVELDB_INT)
11+
LIBLEVELDB += $(LIBLEVELDB_INT) $(LIBCRC32C)
1212
LIBMEMENV += $(LIBMEMENV_INT)
1313

1414
LEVELDB_CPPFLAGS += -I$(srcdir)/leveldb/include
1515
LEVELDB_CPPFLAGS += -I$(srcdir)/leveldb/helpers/memenv
1616

1717
LEVELDB_CPPFLAGS_INT =
1818
LEVELDB_CPPFLAGS_INT += -I$(srcdir)/leveldb
19+
LEVELDB_CPPFLAGS_INT += -I$(srcdir)/crc32c/include
1920
LEVELDB_CPPFLAGS_INT += -D__STDC_LIMIT_MACROS
20-
LEVELDB_CPPFLAGS_INT += -DHAVE_SNAPPY=0 -DHAVE_CRC32C=0
21+
LEVELDB_CPPFLAGS_INT += -DHAVE_SNAPPY=0 -DHAVE_CRC32C=1
2122
LEVELDB_CPPFLAGS_INT += -DHAVE_FDATASYNC=@HAVE_FDATASYNC@
2223
LEVELDB_CPPFLAGS_INT += -DHAVE_FULLFSYNC=@HAVE_FULLFSYNC@
2324
LEVELDB_CPPFLAGS_INT += -DHAVE_O_CLOEXEC=@HAVE_O_CLOEXEC@

0 commit comments

Comments
 (0)