Files
zeekayandHanzo Dev a7786758f8 Restore upstream citations broken by a global rename
A prior ClickHouse to Datastore rename rewrote `github.com/ClickHouse/ClickHouse`
to `github.com/Datastore/Datastore`, a repository that does not exist. That
turned 162 references across 131 files into dead links, and turned captured
stack traces and historical changelogs into false statements.

A citation of upstream is a fact, not branding. Product surfaces keep the Hanzo
Datastore name; references to the upstream project point at the upstream project.
Also untracks `.claude/`, agent scratch that was never meant to be committed.

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-26 19:24:23 -07:00

162 lines
7.1 KiB
CMake

set(LIBLLVMLIBC_SOURCE_DIR "${Datastore_SOURCE_DIR}/contrib/llvm-project/libc")
# Only build on supported architectures
if (NOT (ARCH_AMD64 OR ARCH_AARCH64))
return()
endif()
# Memory functions: mem_functions.cpp provides the weak memcmp/memcpy/memmove/
# memset/bcmp; the strong memmem lives in memmem.cpp (added below).
set(SRCS
"${CMAKE_CURRENT_SOURCE_DIR}/string/mem_functions.cpp"
"${LIBLLVMLIBC_SOURCE_DIR}/src/math/generic/acos.cpp"
"${LIBLLVMLIBC_SOURCE_DIR}/src/math/generic/asin.cpp"
"${LIBLLVMLIBC_SOURCE_DIR}/src/math/generic/asinf.cpp"
"${LIBLLVMLIBC_SOURCE_DIR}/src/math/generic/atan.cpp"
"${LIBLLVMLIBC_SOURCE_DIR}/src/math/generic/atan2.cpp"
"${LIBLLVMLIBC_SOURCE_DIR}/src/math/generic/cbrt.cpp"
"${LIBLLVMLIBC_SOURCE_DIR}/src/math/generic/ceill.cpp"
"${LIBLLVMLIBC_SOURCE_DIR}/src/math/generic/copysignl.cpp"
"${LIBLLVMLIBC_SOURCE_DIR}/src/math/generic/cos.cpp"
"${LIBLLVMLIBC_SOURCE_DIR}/src/math/generic/exp.cpp"
"${LIBLLVMLIBC_SOURCE_DIR}/src/math/generic/exp2.cpp"
"${LIBLLVMLIBC_SOURCE_DIR}/src/math/generic/expm1.cpp"
"${LIBLLVMLIBC_SOURCE_DIR}/src/math/generic/fabs.cpp"
"${LIBLLVMLIBC_SOURCE_DIR}/src/math/generic/fabsl.cpp"
"${LIBLLVMLIBC_SOURCE_DIR}/src/math/generic/floor.cpp"
"${LIBLLVMLIBC_SOURCE_DIR}/src/math/generic/floorl.cpp"
"${LIBLLVMLIBC_SOURCE_DIR}/src/math/generic/fma.cpp"
"${LIBLLVMLIBC_SOURCE_DIR}/src/math/generic/fmod.cpp"
"${LIBLLVMLIBC_SOURCE_DIR}/src/math/generic/fmodl.cpp"
"${LIBLLVMLIBC_SOURCE_DIR}/src/math/generic/frexp.cpp"
"${LIBLLVMLIBC_SOURCE_DIR}/src/math/generic/frexpl.cpp"
"${LIBLLVMLIBC_SOURCE_DIR}/src/math/generic/hypot.cpp"
"${LIBLLVMLIBC_SOURCE_DIR}/src/math/generic/ldexp.cpp"
"${LIBLLVMLIBC_SOURCE_DIR}/src/math/generic/ldexpf.cpp"
"${LIBLLVMLIBC_SOURCE_DIR}/src/math/generic/ldexpl.cpp"
"${LIBLLVMLIBC_SOURCE_DIR}/src/math/generic/llround.cpp"
"${LIBLLVMLIBC_SOURCE_DIR}/src/math/generic/log.cpp"
"${LIBLLVMLIBC_SOURCE_DIR}/src/math/generic/log10.cpp"
"${LIBLLVMLIBC_SOURCE_DIR}/src/math/generic/log1p.cpp"
"${LIBLLVMLIBC_SOURCE_DIR}/src/math/generic/log2.cpp"
"${LIBLLVMLIBC_SOURCE_DIR}/src/math/generic/logf.cpp"
"${LIBLLVMLIBC_SOURCE_DIR}/src/math/generic/lround.cpp"
"${LIBLLVMLIBC_SOURCE_DIR}/src/math/generic/modf.cpp"
"${LIBLLVMLIBC_SOURCE_DIR}/src/math/generic/nan.cpp"
"${LIBLLVMLIBC_SOURCE_DIR}/src/math/generic/nanf.cpp"
"${LIBLLVMLIBC_SOURCE_DIR}/src/math/generic/nanl.cpp"
"${LIBLLVMLIBC_SOURCE_DIR}/src/math/generic/nextafter.cpp"
"${LIBLLVMLIBC_SOURCE_DIR}/src/math/generic/pow.cpp"
"${LIBLLVMLIBC_SOURCE_DIR}/src/math/generic/scalbn.cpp"
"${LIBLLVMLIBC_SOURCE_DIR}/src/math/generic/scalbnl.cpp"
"${LIBLLVMLIBC_SOURCE_DIR}/src/math/generic/sin.cpp"
"${LIBLLVMLIBC_SOURCE_DIR}/src/math/generic/sqrt.cpp"
"${LIBLLVMLIBC_SOURCE_DIR}/src/math/generic/sqrtf.cpp"
"${LIBLLVMLIBC_SOURCE_DIR}/src/math/generic/sqrtl.cpp"
"${LIBLLVMLIBC_SOURCE_DIR}/src/math/generic/tan.cpp"
"${LIBLLVMLIBC_SOURCE_DIR}/src/math/generic/truncl.cpp"
)
# memmem is exported strong, so under sanitizers it would win the link over
# compiler-rt's weak `memmem` interceptor and bypass its range checks. Skip it
# there and let the interceptor wrap the system memmem, as before this PR.
if (NOT SANITIZE)
list (APPEND SRCS "${CMAKE_CURRENT_SOURCE_DIR}/string/memmem.cpp")
endif ()
set(LIBC_NAMESPACE "__llvm_libc")
set(LLVMLIBC_DEFS_COMMON
LIBC_MATH_HAS_NO_ERRNO=1
LIBC_MATH_HAS_NO_EXCEPT=1
LIBC_MATH_HAS_SKIP_ACCURATE_PASS=1
LIBC_ERRNO_MODE=6 # Needed to make building with -O0 work. Details in https://github.com/ClickHouse/ClickHouse/pull/100023
)
if (ARCH_AMD64)
add_library(libllvmlibc ${SRCS})
set_target_properties(libllvmlibc PROPERTIES FOLDER "contrib/libllvmlibc-cmake")
# Without -fno-builtin, clang's loop-idiom pass rewrites the mem* inner loops
# into calls to the very functions being defined (infinite recursion).
target_compile_options(libllvmlibc PRIVATE -ffreestanding -fno-builtin)
if (X86_ARCH_LEVEL VERSION_LESS 3)
# Compat build: SSE2 baseline
target_compile_definitions(libllvmlibc PRIVATE
${LLVMLIBC_DEFS_COMMON}
LIBC_NAMESPACE=${LIBC_NAMESPACE}
LIBC_COPT_PUBLIC_PACKAGING=1
LIBC_TARGET_CPU_HAS_SSE2=1
LIBC_TARGET_CPU_HAS_FPU_FLOAT=1
LIBC_TARGET_CPU_HAS_FPU_DOUBLE=1
)
elseif (X86_ARCH_LEVEL VERSION_LESS 4)
# v3: single library with AVX/AVX2/FMA
target_compile_definitions(libllvmlibc PRIVATE
${LLVMLIBC_DEFS_COMMON}
LIBC_NAMESPACE=${LIBC_NAMESPACE}
LIBC_COPT_PUBLIC_PACKAGING=1
LIBC_TARGET_CPU_HAS_SSE2=1
LIBC_TARGET_CPU_HAS_SSE4_2=1
LIBC_TARGET_CPU_HAS_FPU_FLOAT=1
LIBC_TARGET_CPU_HAS_FPU_DOUBLE=1
LIBC_TARGET_CPU_HAS_FMA=1
LIBC_TARGET_CPU_HAS_FMA_FLOAT=1
LIBC_TARGET_CPU_HAS_FMA_DOUBLE=1
LIBC_TARGET_CPU_HAS_NEAREST_INT=1
LIBC_TARGET_CPU_HAS_AVX=1
LIBC_TARGET_CPU_HAS_AVX2=1
)
else()
# v4: AVX-512 (F/BW/DQ/CD/VL). -mprefer-vector-width=512 forces clang to
# emit ZMM for __builtin_memcpy_inline rather than defaulting to YMM.
target_compile_definitions(libllvmlibc PRIVATE
${LLVMLIBC_DEFS_COMMON}
LIBC_NAMESPACE=${LIBC_NAMESPACE}
LIBC_COPT_PUBLIC_PACKAGING=1
LIBC_TARGET_CPU_HAS_SSE2=1
LIBC_TARGET_CPU_HAS_SSE4_2=1
LIBC_TARGET_CPU_HAS_FPU_FLOAT=1
LIBC_TARGET_CPU_HAS_FPU_DOUBLE=1
LIBC_TARGET_CPU_HAS_FMA=1
LIBC_TARGET_CPU_HAS_FMA_FLOAT=1
LIBC_TARGET_CPU_HAS_FMA_DOUBLE=1
LIBC_TARGET_CPU_HAS_NEAREST_INT=1
LIBC_TARGET_CPU_HAS_AVX=1
LIBC_TARGET_CPU_HAS_AVX2=1
LIBC_TARGET_CPU_HAS_AVX512_F=1
LIBC_TARGET_CPU_HAS_AVX512_BW=1
)
target_compile_options(libllvmlibc PRIVATE -mprefer-vector-width=512)
endif()
target_include_directories(libllvmlibc SYSTEM BEFORE
PRIVATE $<BUILD_INTERFACE:${LIBLLVMLIBC_SOURCE_DIR}>
)
elseif (ARCH_AARCH64)
# aarch64: Single variant, FMA is always available (ARMv8 baseline)
# Uses LIBC_COPT_PUBLIC_PACKAGING to emit public C symbols directly
add_library(libllvmlibc ${SRCS})
set_target_properties(libllvmlibc PROPERTIES FOLDER "contrib/libllvmlibc-cmake")
# -fno-builtin: prevent loop-idiom self-calls in mem* (see the ARCH_AMD64 branch).
target_compile_options(libllvmlibc PRIVATE -ffreestanding -fno-builtin)
target_compile_definitions(libllvmlibc PRIVATE
${LLVMLIBC_DEFS_COMMON}
LIBC_NAMESPACE=${LIBC_NAMESPACE}
LIBC_COPT_PUBLIC_PACKAGING=1
LIBC_TARGET_CPU_HAS_FMA=1
LIBC_TARGET_CPU_HAS_FMA_DOUBLE=1
LIBC_TARGET_CPU_HAS_FMA_HALF=1
LIBC_TARGET_CPU_HAS_FMA_FLOAT=1
LIBC_TARGET_CPU_HAS_NEAREST_INT=1
LIBC_TARGET_CPU_HAS_FULLFP16=1
LIBC_TARGET_CPU_HAS_FAST_FLOAT16_OPS=1
)
target_include_directories(libllvmlibc SYSTEM BEFORE
PRIVATE $<BUILD_INTERFACE:${LIBLLVMLIBC_SOURCE_DIR}>
)
endif()