
Implement TrieRawHashMap can be used to store object with its associated hash. User needs to supply a strong hashing function to guarantee the uniqueness of the hash of the objects to be inserted. A hash collision is not supported and will lead to error or failed to insert. TrieRawHashMap is thread-safe and lock-free and can be used as foundation data structure to implement a content addressible storage. TrieRawHashMap owns the data stored in it and is designed to be: * Fast to lookup. * Fast to "insert" if the data has already been inserted. * Can be used without lock and doesn't require any knowledge of the participating threads or extra coordination between threads. It is not currently designed to be used to insert unique new data with high contention, due to the limitation on the memory allocator.
367 lines
11 KiB
CMake
367 lines
11 KiB
CMake
include(GetLibraryName)
|
|
|
|
# Ensure that libSupport does not carry any static global initializer.
|
|
# libSupport can be embedded in use cases where we don't want to load all
|
|
# cl::opt unless we want to parse the command line.
|
|
# ManagedStatic can be used to enable lazy-initialization of globals.
|
|
# We don't use `add_flag_if_supported` as instead of compiling an empty file we
|
|
# check if the current platform is able to compile global std::mutex with this
|
|
# flag (Linux can, Darwin can't for example).
|
|
check_cxx_compiler_flag("-Werror=global-constructors" HAS_WERROR_GLOBAL_CTORS)
|
|
if (HAS_WERROR_GLOBAL_CTORS)
|
|
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror=global-constructors")
|
|
CHECK_CXX_SOURCE_COMPILES("
|
|
#include <mutex>
|
|
static std::mutex TestGlobalCtorDtor;
|
|
static std::recursive_mutex TestGlobalCtorDtor2;
|
|
int main() { (void)TestGlobalCtorDtor; (void)TestGlobalCtorDtor2; return 0;}
|
|
" LLVM_HAS_NOGLOBAL_CTOR_MUTEX)
|
|
if (NOT LLVM_HAS_NOGLOBAL_CTOR_MUTEX)
|
|
string(REPLACE "-Werror=global-constructors" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
|
|
endif()
|
|
endif()
|
|
|
|
if(LLVM_ENABLE_ZLIB)
|
|
list(APPEND imported_libs ZLIB::ZLIB)
|
|
endif()
|
|
|
|
if(LLVM_ENABLE_ZSTD)
|
|
if(TARGET zstd::libzstd_shared AND NOT LLVM_USE_STATIC_ZSTD)
|
|
set(zstd_target zstd::libzstd_shared)
|
|
else()
|
|
set(zstd_target zstd::libzstd_static)
|
|
endif()
|
|
endif()
|
|
|
|
if(LLVM_ENABLE_ZSTD)
|
|
list(APPEND imported_libs ${zstd_target})
|
|
endif()
|
|
|
|
if( WIN32 )
|
|
# libuuid required for FOLDERID_Profile usage in lib/Support/Windows/Path.inc.
|
|
# advapi32 required for CryptAcquireContextW in lib/Support/Windows/Path.inc.
|
|
# ntdll required for RtlGetLastNtStatus in lib/Support/ErrorHandling.cpp.
|
|
set(system_libs ${system_libs} psapi shell32 ole32 uuid advapi32 ws2_32 ntdll)
|
|
elseif( CMAKE_HOST_UNIX )
|
|
if( HAVE_LIBRT )
|
|
set(system_libs ${system_libs} rt)
|
|
endif()
|
|
if( HAVE_LIBDL )
|
|
set(system_libs ${system_libs} ${CMAKE_DL_LIBS})
|
|
endif()
|
|
if( HAVE_BACKTRACE AND NOT "${Backtrace_LIBRARIES}" STREQUAL "" )
|
|
# On BSDs, CMake returns a fully qualified path to the backtrace library.
|
|
# We need to remove the path and the 'lib' prefix, to make it look like a
|
|
# regular short library name, suitable for appending to a -l link flag.
|
|
get_filename_component(Backtrace_LIBFILE ${Backtrace_LIBRARIES} NAME_WE)
|
|
STRING(REGEX REPLACE "^lib" "" Backtrace_LIBFILE ${Backtrace_LIBFILE})
|
|
set(system_libs ${system_libs} ${Backtrace_LIBFILE})
|
|
endif()
|
|
set(system_libs ${system_libs} ${LLVM_ATOMIC_LIB})
|
|
set(system_libs ${system_libs} ${LLVM_PTHREAD_LIB})
|
|
if( UNIX AND NOT (BEOS OR HAIKU) )
|
|
set(system_libs ${system_libs} m)
|
|
endif()
|
|
if( UNIX AND ${CMAKE_SYSTEM_NAME} MATCHES "SunOS" )
|
|
set(system_libs ${system_libs} kstat socket)
|
|
endif()
|
|
if( FUCHSIA )
|
|
set(system_libs ${system_libs} zircon)
|
|
endif()
|
|
if ( HAIKU )
|
|
add_compile_definitions(_BSD_SOURCE)
|
|
set(system_libs ${system_libs} bsd network)
|
|
endif()
|
|
endif( WIN32 )
|
|
|
|
set(WL "")
|
|
if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.25"
|
|
AND MSVC
|
|
AND NOT CMAKE_GENERATOR MATCHES "Visual Studio")
|
|
#IntelLLVM requires to pass linker flags with a wrapper
|
|
set(WL "$<$<OR:$<LINK_LANG_AND_ID:C,IntelLLVM>,$<LINK_LANG_AND_ID:CXX,IntelLLVM>,$<LINK_LANG_AND_ID:Fortran,IntelLLVM>>:-Qoption,link,>")
|
|
endif()
|
|
|
|
# Delay load shell32.dll if possible to speed up process startup.
|
|
set (delayload_flags)
|
|
if (MSVC)
|
|
# When linking with Swift, `swiftc.exe` is used as the linker drive rather
|
|
# than invoking `link.exe` directly. In such a case, the flags should be
|
|
# marked as `-Xlinker` to pass them directly to the linker. As a temporary
|
|
# workaround simply elide the delay loading.
|
|
set (delayload_flags $<$<NOT:$<LINK_LANGUAGE:Swift>>:delayimp ${WL}-delayload:shell32.dll ${WL}-delayload:ole32.dll>)
|
|
endif()
|
|
|
|
# Link Z3 if the user wants to build it.
|
|
if(LLVM_WITH_Z3)
|
|
set(system_libs ${system_libs} ${Z3_LIBRARIES})
|
|
endif()
|
|
|
|
# Override the C runtime allocator on Windows and embed it into LLVM tools & libraries
|
|
if(LLVM_INTEGRATED_CRT_ALLOC)
|
|
if (NOT CMAKE_MSVC_RUNTIME_LIBRARY OR CMAKE_MSVC_RUNTIME_LIBRARY MATCHES "DLL$")
|
|
message(FATAL_ERROR "LLVM_INTEGRATED_CRT_ALLOC only works with CMAKE_MSVC_RUNTIME_LIBRARY set to MultiThreaded or MultiThreadedDebug.")
|
|
endif()
|
|
|
|
string(REGEX REPLACE "(/|\\\\)$" "" LLVM_INTEGRATED_CRT_ALLOC "${LLVM_INTEGRATED_CRT_ALLOC}")
|
|
|
|
if(NOT EXISTS "${LLVM_INTEGRATED_CRT_ALLOC}")
|
|
message(FATAL_ERROR "Cannot find the path to `git clone` for the CRT allocator! (${LLVM_INTEGRATED_CRT_ALLOC}). Currently, rpmalloc, snmalloc and mimalloc are supported.")
|
|
endif()
|
|
|
|
if((LLVM_INTEGRATED_CRT_ALLOC MATCHES "rpmalloc$") OR LLVM_ENABLE_RPMALLOC)
|
|
add_compile_definitions(ENABLE_OVERRIDE ENABLE_PRELOAD)
|
|
set(ALLOCATOR_FILES "${LLVM_INTEGRATED_CRT_ALLOC}/rpmalloc/rpmalloc.c")
|
|
set(delayload_flags "${delayload_flags} ${WL}-INCLUDE:malloc")
|
|
elseif(LLVM_INTEGRATED_CRT_ALLOC MATCHES "snmalloc$")
|
|
set(ALLOCATOR_FILES "${LLVM_INTEGRATED_CRT_ALLOC}/src/snmalloc/override/new.cc")
|
|
set(system_libs ${system_libs} "mincore.lib" "${WL}-INCLUDE:malloc")
|
|
elseif(LLVM_INTEGRATED_CRT_ALLOC MATCHES "mimalloc$")
|
|
set(MIMALLOC_LIB "${LLVM_INTEGRATED_CRT_ALLOC}/out/msvc-x64/Release/mimalloc-static.lib")
|
|
if(NOT EXISTS "${MIMALLOC_LIB}")
|
|
message(FATAL_ERROR "Cannot find the mimalloc static library. To build it, first apply the patch from https://github.com/microsoft/mimalloc/issues/268 then build the Release x64 target through ${LLVM_INTEGRATED_CRT_ALLOC}\\ide\\vs2019\\mimalloc.sln")
|
|
endif()
|
|
set(system_libs ${system_libs} "${MIMALLOC_LIB}" "${WL}-INCLUDE:malloc")
|
|
endif()
|
|
endif()
|
|
|
|
# FIXME: We are currently guarding AIX headers with _XOPEN_SOURCE=700.
|
|
# See llvm/CMakeLists.txt. However, we need _SC_NPROCESSORS_ONLN in
|
|
# unistd.h and it is guarded by _ALL_SOURCE, so we remove the _XOPEN_SOURCE
|
|
# guard here. We should remove the guards all together once AIX cleans up
|
|
# the system headers.
|
|
if (UNIX AND ${CMAKE_SYSTEM_NAME} MATCHES "AIX")
|
|
remove_definitions("-D_XOPEN_SOURCE=700")
|
|
endif()
|
|
|
|
add_subdirectory(BLAKE3)
|
|
|
|
add_llvm_component_library(LLVMSupport
|
|
ABIBreak.cpp
|
|
AMDGPUMetadata.cpp
|
|
APFixedPoint.cpp
|
|
APFloat.cpp
|
|
APInt.cpp
|
|
APSInt.cpp
|
|
ARMBuildAttrs.cpp
|
|
ARMAttributeParser.cpp
|
|
ARMWinEH.cpp
|
|
Allocator.cpp
|
|
AutoConvert.cpp
|
|
Base64.cpp
|
|
BalancedPartitioning.cpp
|
|
BinaryStreamError.cpp
|
|
BinaryStreamReader.cpp
|
|
BinaryStreamRef.cpp
|
|
BinaryStreamWriter.cpp
|
|
BlockFrequency.cpp
|
|
BranchProbability.cpp
|
|
BuryPointer.cpp
|
|
CachePruning.cpp
|
|
Caching.cpp
|
|
circular_raw_ostream.cpp
|
|
Chrono.cpp
|
|
COM.cpp
|
|
CodeGenCoverage.cpp
|
|
CommandLine.cpp
|
|
Compression.cpp
|
|
CRC.cpp
|
|
ConvertUTF.cpp
|
|
ConvertEBCDIC.cpp
|
|
ConvertUTFWrapper.cpp
|
|
CrashRecoveryContext.cpp
|
|
CSKYAttributes.cpp
|
|
CSKYAttributeParser.cpp
|
|
DataExtractor.cpp
|
|
Debug.cpp
|
|
DebugCounter.cpp
|
|
DeltaAlgorithm.cpp
|
|
DeltaTree.cpp
|
|
DivisionByConstantInfo.cpp
|
|
DAGDeltaAlgorithm.cpp
|
|
DJB.cpp
|
|
DynamicAPInt.cpp
|
|
ELFAttributeParser.cpp
|
|
ELFAttributes.cpp
|
|
Error.cpp
|
|
ErrorHandling.cpp
|
|
ExponentialBackoff.cpp
|
|
ExtensibleRTTI.cpp
|
|
FileCollector.cpp
|
|
FileUtilities.cpp
|
|
FileOutputBuffer.cpp
|
|
FloatingPointMode.cpp
|
|
FoldingSet.cpp
|
|
FormattedStream.cpp
|
|
FormatVariadic.cpp
|
|
GlobPattern.cpp
|
|
GraphWriter.cpp
|
|
HexagonAttributeParser.cpp
|
|
HexagonAttributes.cpp
|
|
InitLLVM.cpp
|
|
InstructionCost.cpp
|
|
IntEqClasses.cpp
|
|
IntervalMap.cpp
|
|
JSON.cpp
|
|
KnownBits.cpp
|
|
LEB128.cpp
|
|
LineIterator.cpp
|
|
Locale.cpp
|
|
LockFileManager.cpp
|
|
ManagedStatic.cpp
|
|
MathExtras.cpp
|
|
MemAlloc.cpp
|
|
MemoryBuffer.cpp
|
|
MemoryBufferRef.cpp
|
|
ModRef.cpp
|
|
MD5.cpp
|
|
MSP430Attributes.cpp
|
|
MSP430AttributeParser.cpp
|
|
NativeFormatting.cpp
|
|
OptimizedStructLayout.cpp
|
|
Optional.cpp
|
|
OptionStrCmp.cpp
|
|
PGOOptions.cpp
|
|
Parallel.cpp
|
|
PluginLoader.cpp
|
|
PrettyStackTrace.cpp
|
|
RandomNumberGenerator.cpp
|
|
Regex.cpp
|
|
RewriteBuffer.cpp
|
|
RewriteRope.cpp
|
|
RISCVAttributes.cpp
|
|
RISCVAttributeParser.cpp
|
|
RISCVISAUtils.cpp
|
|
ScaledNumber.cpp
|
|
ScopedPrinter.cpp
|
|
SHA1.cpp
|
|
SHA256.cpp
|
|
Signposts.cpp
|
|
SipHash.cpp
|
|
SlowDynamicAPInt.cpp
|
|
SmallPtrSet.cpp
|
|
SmallVector.cpp
|
|
SourceMgr.cpp
|
|
SpecialCaseList.cpp
|
|
Statistic.cpp
|
|
StringExtras.cpp
|
|
StringMap.cpp
|
|
StringSaver.cpp
|
|
StringRef.cpp
|
|
SuffixTreeNode.cpp
|
|
SuffixTree.cpp
|
|
SystemUtils.cpp
|
|
TarWriter.cpp
|
|
ThreadPool.cpp
|
|
TimeProfiler.cpp
|
|
Timer.cpp
|
|
ToolOutputFile.cpp
|
|
TrieRawHashMap.cpp
|
|
Twine.cpp
|
|
TypeSize.cpp
|
|
Unicode.cpp
|
|
UnicodeCaseFold.cpp
|
|
UnicodeNameToCodepoint.cpp
|
|
UnicodeNameToCodepointGenerated.cpp
|
|
VersionTuple.cpp
|
|
VirtualFileSystem.cpp
|
|
WithColor.cpp
|
|
YAMLParser.cpp
|
|
YAMLTraits.cpp
|
|
raw_os_ostream.cpp
|
|
raw_ostream.cpp
|
|
raw_socket_stream.cpp
|
|
regcomp.c
|
|
regerror.c
|
|
regexec.c
|
|
regfree.c
|
|
regstrlcpy.c
|
|
xxhash.cpp
|
|
Z3Solver.cpp
|
|
|
|
${ALLOCATOR_FILES}
|
|
$<TARGET_OBJECTS:LLVMSupportBlake3>
|
|
|
|
# System
|
|
Atomic.cpp
|
|
DynamicLibrary.cpp
|
|
Errno.cpp
|
|
Memory.cpp
|
|
Path.cpp
|
|
Process.cpp
|
|
Program.cpp
|
|
RWMutex.cpp
|
|
Signals.cpp
|
|
Threading.cpp
|
|
Valgrind.cpp
|
|
Watchdog.cpp
|
|
|
|
ADDITIONAL_HEADER_DIRS
|
|
Unix
|
|
Windows
|
|
${LLVM_MAIN_INCLUDE_DIR}/llvm/ADT
|
|
${LLVM_MAIN_INCLUDE_DIR}/llvm/Support
|
|
${Backtrace_INCLUDE_DIRS}
|
|
|
|
LINK_LIBS
|
|
${system_libs} ${imported_libs} ${delayload_flags}
|
|
|
|
LINK_COMPONENTS
|
|
Demangle
|
|
)
|
|
|
|
set(llvm_system_libs ${system_libs})
|
|
|
|
# This block is only needed for llvm-config. When we deprecate llvm-config and
|
|
# move to using CMake export, this block can be removed.
|
|
if(LLVM_ENABLE_ZLIB)
|
|
# CMAKE_BUILD_TYPE is only meaningful to single-configuration generators.
|
|
if(CMAKE_BUILD_TYPE)
|
|
string(TOUPPER ${CMAKE_BUILD_TYPE} build_type)
|
|
get_property(zlib_library TARGET ZLIB::ZLIB PROPERTY LOCATION_${build_type})
|
|
endif()
|
|
if(NOT zlib_library)
|
|
get_property(zlib_library TARGET ZLIB::ZLIB PROPERTY LOCATION)
|
|
endif()
|
|
get_library_name(${zlib_library} zlib_library)
|
|
set(llvm_system_libs ${llvm_system_libs} "${zlib_library}")
|
|
endif()
|
|
|
|
if(LLVM_ENABLE_ZSTD)
|
|
# CMAKE_BUILD_TYPE is only meaningful to single-configuration generators.
|
|
if(CMAKE_BUILD_TYPE)
|
|
string(TOUPPER ${CMAKE_BUILD_TYPE} build_type)
|
|
get_property(zstd_library TARGET ${zstd_target} PROPERTY LOCATION_${build_type})
|
|
endif()
|
|
if(NOT zstd_library)
|
|
get_property(zstd_library TARGET ${zstd_target} PROPERTY LOCATION)
|
|
endif()
|
|
if (zstd_target STREQUAL zstd::libzstd_shared)
|
|
get_library_name(${zstd_library} zstd_library)
|
|
set(llvm_system_libs ${llvm_system_libs} "${zstd_library}")
|
|
else()
|
|
set(llvm_system_libs ${llvm_system_libs} "${zstd_STATIC_LIBRARY}")
|
|
endif()
|
|
endif()
|
|
|
|
set_property(TARGET LLVMSupport PROPERTY LLVM_SYSTEM_LIBS "${llvm_system_libs}")
|
|
|
|
|
|
if(LLVM_INTEGRATED_CRT_ALLOC)
|
|
if(LLVM_INTEGRATED_CRT_ALLOC MATCHES "snmalloc$")
|
|
set_property(TARGET LLVMSupport PROPERTY CXX_STANDARD 17)
|
|
add_compile_definitions(_SILENCE_CXX17_ITERATOR_BASE_CLASS_DEPRECATION_WARNING)
|
|
if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" AND
|
|
"${CMAKE_SYSTEM_PROCESSOR}" MATCHES "x86_64")
|
|
set_property(TARGET LLVMSupport PROPERTY COMPILE_FLAGS "-mcx16")
|
|
endif()
|
|
endif()
|
|
endif()
|
|
|
|
if(LLVM_WITH_Z3)
|
|
target_include_directories(LLVMSupport SYSTEM
|
|
PRIVATE
|
|
${Z3_INCLUDE_DIR}
|
|
)
|
|
endif()
|