Files
zeekay 9a90943b8f merge: ClickHouse 26.7.1.1315-stable into datastore — preserve debrand
13,838 upstream commits, forward from the 26.6.1.1 fork point. 129 conflicts:
37 resolved mechanically (take upstream's file, re-apply the brand sweep) and
92 by hand where our fork and upstream had both changed the same code.

The rule throughout: upstream owns the engine, we own the naming and a small set
of deliberate deviations. Never resolve by discarding an upstream change — a
dropped rename or a missed new parameter becomes a compile error a thousand
files away.

Deviations verified intact after the merge:
  ENABLE_XRAY still defaults OFF        (CMakeLists.txt:105)
  X-Datastore-User read by the server   (authenticateUserByHTTP.cpp)
  X-ClickHouse-* in src/                0
  hanzo/research                        present
  system.*_log retention bound          present
  ArrowFlight rip                       held against upstream re-adding it

Two things worth naming, because neither shows up as a conflict:

  src/CMakeLists.txt gained an UNGUARDED
  `add_object_library(datastore_storages_arrowflight Storages/ArrowFlight)` from
  upstream, for a directory our gRPC rip deleted. It sat outside every conflict
  hunk, so a resolver reading only the markers would sail straight past it into
  a CMake configure error. Removed; the Server/ArrowFlight sibling at line 474
  stays because it is inside `if (TARGET ch_contrib::arrow_flight)`.

  The brand sweep had rewritten github.com/ClickHouse/ClickHouse issue links to
  github.com/Datastore/Datastore — a dead host. Those point at upstream's own
  tracker and are restored, alongside the contributors list, sql.clickhouse.com
  and the ClickHouse Inc copyright: attribution is theirs, not ours to rename.

base/glibc-compatibility/memcpy/memcpy.h is deleted, not kept: upstream dropped
it for LLVM-libc's, and our only change to it was a comment rebrand.
2026-07-26 14:47:43 -07:00

1083 lines
55 KiB
CMake

# Lean LLVM build for Datastore
#
# Builds LLVM libraries without including LLVM's own CMake definitions.
# Uses llvm-tblgen built from sources to generate .inc files at build time.
if (SANITIZE STREQUAL "memory")
set (ENABLE_EMBEDDED_COMPILER_DEFAULT OFF)
set (ENABLE_DWARF_PARSER_DEFAULT OFF)
else()
set (ENABLE_EMBEDDED_COMPILER_DEFAULT ${ENABLE_LIBRARIES})
set (ENABLE_DWARF_PARSER_DEFAULT ${ENABLE_LIBRARIES})
endif()
option (ENABLE_EMBEDDED_COMPILER "Enable JIT compilation" ${ENABLE_EMBEDDED_COMPILER_DEFAULT})
option (ENABLE_DWARF_PARSER "Enable DWARF input format" ${ENABLE_DWARF_PARSER_DEFAULT})
option (ENABLE_BLAKE3 "Enable BLAKE3 function" ${ENABLE_LIBRARIES})
if (NOT ENABLE_EMBEDDED_COMPILER AND NOT ENABLE_DWARF_PARSER AND NOT ENABLE_BLAKE3)
message(STATUS "Not using LLVM")
return()
endif()
set (LLVM_VERSION "22.1.1bundled")
# Directories
set (LLVM_SOURCE_DIR "${Datastore_SOURCE_DIR}/contrib/llvm-project/llvm")
set (LLVM_BINARY_DIR "${Datastore_BINARY_DIR}/contrib/llvm-project/llvm")
set (LLVM_CMAKE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
set (LLVM_INCLUDE_DIRS
"${LLVM_SOURCE_DIR}/include"
"${LLVM_BINARY_DIR}/include"
"${Datastore_SOURCE_DIR}/contrib/llvm-project/third-party/siphash/include"
)
if (ENABLE_XRAY)
list(APPEND LLVM_INCLUDE_DIRS "${Datastore_SOURCE_DIR}/contrib/llvm-project/compiler-rt/include")
endif()
# Target architecture
if (ARCH_AMD64)
set (LLVM_TARGET_ARCH "X86")
set (LLVM_HOST_TRIPLE_DEFAULT "x86_64-unknown-linux-gnu")
elseif (ARCH_AARCH64)
set (LLVM_TARGET_ARCH "AArch64")
set (LLVM_HOST_TRIPLE_DEFAULT "aarch64-unknown-linux-gnu")
elseif (ARCH_PPC64LE)
set (LLVM_TARGET_ARCH "PowerPC")
set (LLVM_HOST_TRIPLE_DEFAULT "powerpc64le-unknown-linux-gnu")
elseif (ARCH_S390X)
set (LLVM_TARGET_ARCH "SystemZ")
set (LLVM_HOST_TRIPLE_DEFAULT "s390x-unknown-linux-gnu")
elseif (ARCH_RISCV64)
set (LLVM_TARGET_ARCH "RISCV")
set (LLVM_HOST_TRIPLE_DEFAULT "riscv64-unknown-linux-gnu")
elseif (ARCH_LOONGARCH64)
set (LLVM_TARGET_ARCH "LoongArch")
set (LLVM_HOST_TRIPLE_DEFAULT "loongarch64-unknown-linux-gnu")
else()
message(FATAL_ERROR "Unsupported architecture for LLVM")
endif()
# Use the compiler target triple when cross-compiling (handles musl, macOS, FreeBSD, etc.)
if (CMAKE_CROSSCOMPILING AND CMAKE_C_COMPILER_TARGET)
set (LLVM_HOST_TRIPLE "${CMAKE_C_COMPILER_TARGET}")
else()
set (LLVM_HOST_TRIPLE "${LLVM_HOST_TRIPLE_DEFAULT}")
endif()
message(STATUS "LLVM target: ${LLVM_TARGET_ARCH}")
# LLVM has issues with C++23
set (CMAKE_CXX_STANDARD 17)
# Needed for musl compatibility
add_compile_definitions(_LARGEFILE64_SOURCE)
# BLAKE3 x86 assembly files
if (ARCH_AMD64)
set(LLVM_BLAKE3_ASM_SOURCES
${LLVM_SOURCE_DIR}/lib/Support/BLAKE3/blake3_sse2_x86-64_unix.S
${LLVM_SOURCE_DIR}/lib/Support/BLAKE3/blake3_sse41_x86-64_unix.S
${LLVM_SOURCE_DIR}/lib/Support/BLAKE3/blake3_avx2_x86-64_unix.S
${LLVM_SOURCE_DIR}/lib/Support/BLAKE3/blake3_avx512_x86-64_unix.S
)
set_source_files_properties(${LLVM_SOURCE_DIR}/lib/Support/BLAKE3/blake3_avx512_x86-64_unix.S
PROPERTIES COMPILE_OPTIONS "-mavx512f;-mavx512vl")
else()
set(LLVM_BLAKE3_ASM_SOURCES "")
add_compile_definitions(BLAKE3_NO_AVX512 BLAKE3_NO_AVX2 BLAKE3_NO_SSE41 BLAKE3_NO_SSE2)
endif()
# Include source file lists
include(${LLVM_CMAKE_DIR}/sources/LLVMDemangle.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMSupport.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMTableGen.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMBinaryFormat.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMTargetParser.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMCore.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMMC.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMMCParser.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMMCDisassembler.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMBitReader.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMBitstreamReader.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMBitWriter.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMRemarks.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMDebugInfoCodeView.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMDebugInfoDWARF.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMObject.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMTextAPI.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMObjectYAML.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMAsmParser.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMIRReader.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMProfileData.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMAnalysis.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMTransformUtils.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMLinker.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMTarget.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMScalarOpts.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMInstCombine.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMAggressiveInstCombine.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMVectorize.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMipo.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMInstrumentation.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMCodeGen.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMCodeGenTypes.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMGlobalISel.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMSelectionDAG.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMAsmPrinter.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMCGData.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMObjCARCOpts.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMIRPrinter.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMCFGuard.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMFrontendOpenMP.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMFrontendAtomic.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMFrontendOffloading.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMFrontendHLSL.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMCoroutines.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMHipStdPar.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMSandboxIR.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMPasses.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMExecutionEngine.cmake)
include(${LLVM_CMAKE_DIR}/sources/LLVMRuntimeDyld.cmake)
if (ARCH_AMD64)
include(${LLVM_CMAKE_DIR}/sources/LLVMX86.cmake)
elseif (ARCH_AARCH64)
include(${LLVM_CMAKE_DIR}/sources/LLVMAArch64.cmake)
elseif (ARCH_PPC64LE)
include(${LLVM_CMAKE_DIR}/sources/LLVMPowerPC.cmake)
elseif (ARCH_S390X)
include(${LLVM_CMAKE_DIR}/sources/LLVMSystemZ.cmake)
elseif (ARCH_RISCV64)
include(${LLVM_CMAKE_DIR}/sources/LLVMRISCV.cmake)
elseif (ARCH_LOONGARCH64)
include(${LLVM_CMAKE_DIR}/sources/LLVMLoongArch.cmake)
endif()
if (ENABLE_XRAY)
include(${LLVM_CMAKE_DIR}/sources/LLVMXRay.cmake)
endif()
#
# Generate config headers
#
file(MAKE_DIRECTORY "${LLVM_BINARY_DIR}/include/llvm/Config")
file(MAKE_DIRECTORY "${LLVM_BINARY_DIR}/include/llvm/IR")
file(MAKE_DIRECTORY "${LLVM_BINARY_DIR}/include/llvm/CodeGen")
#
# Platform-specific config variables
#
# These variables control platform-specific behavior in config.h.in
# The target platform is determined by CMAKE_SYSTEM_NAME when cross-compiling
#
# Shared library extension
if (APPLE)
set(LLVM_SHLIB_EXT ".dylib")
else()
set(LLVM_SHLIB_EXT ".so")
endif()
# mallinfo is only available on Linux with glibc (not musl, not BSD, not macOS)
if (CMAKE_SYSTEM_NAME STREQUAL "Linux" AND NOT USE_MUSL)
set(HAVE_MALLINFO_DEFINE "#define HAVE_MALLINFO 1")
else()
set(HAVE_MALLINFO_DEFINE "/* #undef HAVE_MALLINFO */")
endif()
# backtrace/execinfo.h is available on glibc and macOS/BSD, but NOT on musl
if (USE_MUSL)
set(HAVE_BACKTRACE_DEFINE "/* #undef HAVE_BACKTRACE */")
set(BACKTRACE_HEADER_DEFINE "/* No backtrace header on musl */")
else()
set(HAVE_BACKTRACE_DEFINE "#define HAVE_BACKTRACE 1")
set(BACKTRACE_HEADER_DEFINE "#define BACKTRACE_HEADER <execinfo.h>")
endif()
# getauxval is Linux-specific
if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
set(HAVE_GETAUXVAL_DEFINE "#define HAVE_GETAUXVAL 1")
set(HAVE_BUILTIN_THREAD_POINTER_DEFINE "#define HAVE_BUILTIN_THREAD_POINTER 1")
else()
set(HAVE_GETAUXVAL_DEFINE "/* #undef HAVE_GETAUXVAL */")
set(HAVE_BUILTIN_THREAD_POINTER_DEFINE "/* #undef HAVE_BUILTIN_THREAD_POINTER */")
endif()
# macOS-specific headers and functions
if (APPLE)
set(HAVE_MACH_MACH_H_DEFINE "#define HAVE_MACH_MACH_H 1")
set(HAVE_MALLOC_MALLOC_H_DEFINE "#define HAVE_MALLOC_MALLOC_H 1")
set(HAVE_MALLOC_ZONE_STATISTICS_DEFINE "#define HAVE_MALLOC_ZONE_STATISTICS 1")
else()
set(HAVE_MACH_MACH_H_DEFINE "/* #undef HAVE_MACH_MACH_H */")
set(HAVE_MALLOC_MALLOC_H_DEFINE "/* #undef HAVE_MALLOC_MALLOC_H */")
set(HAVE_MALLOC_ZONE_STATISTICS_DEFINE "/* #undef HAVE_MALLOC_ZONE_STATISTICS */")
endif()
# stat struct: st_mtim (Linux) vs st_mtimespec (macOS/BSD)
if (APPLE OR CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
set(HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC_DEFINE "#define HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC 1")
set(HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC_DEFINE "/* #undef HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC */")
else()
set(HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC_DEFINE "/* #undef HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC */")
set(HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC_DEFINE "#define HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC 1")
endif()
# arc4random is available on macOS and BSD
if (APPLE OR CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
set(HAVE_DECL_ARC4RANDOM_DECL_DEFINE "#define HAVE_DECL_ARC4RANDOM 1")
set(HAVE_DECL_ARC4RANDOM_DEFINE "#define HAVE_DECL_ARC4RANDOM 1")
else()
set(HAVE_DECL_ARC4RANDOM_DECL_DEFINE "#define HAVE_DECL_ARC4RANDOM 0")
set(HAVE_DECL_ARC4RANDOM_DEFINE "/* #undef HAVE_DECL_ARC4RANDOM */")
endif()
configure_file(
"${LLVM_CMAKE_DIR}/config/llvm-config.h.in"
"${LLVM_BINARY_DIR}/include/llvm/Config/llvm-config.h"
@ONLY
)
configure_file(
"${LLVM_CMAKE_DIR}/config/config.h.in"
"${LLVM_BINARY_DIR}/include/llvm/Config/config.h"
@ONLY
)
configure_file(
"${LLVM_CMAKE_DIR}/config/abi-breaking.h.in"
"${LLVM_BINARY_DIR}/include/llvm/Config/abi-breaking.h"
@ONLY
)
# Target definition files
file(WRITE "${LLVM_BINARY_DIR}/include/llvm/Config/Targets.def"
"LLVM_TARGET(${LLVM_TARGET_ARCH})\n")
file(WRITE "${LLVM_BINARY_DIR}/include/llvm/Config/AsmPrinters.def"
"LLVM_ASM_PRINTER(${LLVM_TARGET_ARCH})\n")
file(WRITE "${LLVM_BINARY_DIR}/include/llvm/Config/AsmParsers.def"
"LLVM_ASM_PARSER(${LLVM_TARGET_ARCH})\n")
file(WRITE "${LLVM_BINARY_DIR}/include/llvm/Config/Disassemblers.def"
"LLVM_DISASSEMBLER(${LLVM_TARGET_ARCH})\n")
file(WRITE "${LLVM_BINARY_DIR}/include/llvm/Config/TargetMCAs.def" "")
file(WRITE "${LLVM_BINARY_DIR}/include/llvm/Config/TargetExegesis.def" "")
# VCSRevision.h - LLVM version control info (normally generated by LLVM CMake)
file(MAKE_DIRECTORY "${LLVM_BINARY_DIR}/include/llvm/Support")
file(WRITE "${LLVM_BINARY_DIR}/include/llvm/Support/VCSRevision.h"
"#define LLVM_REVISION \"\"\n#define LLVM_REPOSITORY \"\"\n")
#
# Common compile definitions
#
set(LLVM_COMPILE_DEFINITIONS
__STDC_CONSTANT_MACROS
__STDC_FORMAT_MACROS
__STDC_LIMIT_MACROS
LLVM_ENABLE_THREADS=1
LLVM_HAS_ATOMICS=1
LLVM_ENABLE_EH=1
LLVM_ENABLE_RTTI=1
)
#
# Cross-compilation support for tablegen tools
#
# When cross-compiling, we need to build tablegen for the HOST system (not target).
# The tablegen executables must be runnable on the build machine to generate .inc files.
#
# We detect cross-compilation by checking CMAKE_CROSSCOMPILING.
#
if (CMAKE_CROSSCOMPILING)
message(STATUS "LLVM: Cross-compiling detected, building native tablegen tools")
include(ExternalProject)
set(NATIVE_TBLGEN_BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR}/native-tblgen")
# Build native tablegen tools using ExternalProject
# This runs a separate CMake configuration WITHOUT the target toolchain,
# so it builds for the host system.
#
# IMPORTANT: We do NOT pass CMAKE_C_COMPILER/CMAKE_CXX_COMPILER here.
# The toolchain file sets sysroot and gcc-toolchain flags that make binaries
# link against target system libraries, not host libraries.
# By not specifying compilers, CMake will use the default host compilers.
ExternalProject_Add(native-tblgen-build
SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/native-tblgen"
BINARY_DIR "${NATIVE_TBLGEN_BUILD_DIR}"
CMAKE_ARGS
-DLLVM_SOURCE_DIR=${LLVM_SOURCE_DIR}
-DLLVM_NATIVE_OUTPUT_DIR=${NATIVE_TBLGEN_BUILD_DIR}
-DCMAKE_BUILD_TYPE=Release
# Do NOT pass toolchain file or compilers - let CMake find host compilers
BUILD_ALWAYS OFF
INSTALL_COMMAND ""
CMAKE_GENERATOR "${CMAKE_GENERATOR}"
)
# Paths to native tablegen executables
# Note: native-tblgen builds for the host (not the cross-compilation target),
# so we do not append CMAKE_EXECUTABLE_SUFFIX (which is the target's suffix).
set(LLVM_TABLEGEN_EXE "${NATIVE_TBLGEN_BUILD_DIR}/llvm-tblgen")
set(LLVM_MIN_TABLEGEN_EXE "${NATIVE_TBLGEN_BUILD_DIR}/llvm-min-tblgen")
# Create imported targets for native tablegen
add_executable(llvm-tblgen-native IMPORTED GLOBAL)
set_target_properties(llvm-tblgen-native PROPERTIES IMPORTED_LOCATION "${LLVM_TABLEGEN_EXE}")
add_dependencies(llvm-tblgen-native native-tblgen-build)
add_executable(llvm-min-tblgen-native IMPORTED GLOBAL)
set_target_properties(llvm-min-tblgen-native PROPERTIES IMPORTED_LOCATION "${LLVM_MIN_TABLEGEN_EXE}")
add_dependencies(llvm-min-tblgen-native native-tblgen-build)
# We still need dummy targets for non-cross builds that expect these
# But tablegen commands will use the imported targets
set(TABLEGEN_TARGET llvm-tblgen-native)
set(MIN_TABLEGEN_TARGET llvm-min-tblgen-native)
set(USE_NATIVE_TABLEGEN ON)
else()
# Native build - build tablegen as part of the normal build
message(STATUS "LLVM: Native build, building tablegen inline")
set(USE_NATIVE_TABLEGEN OFF)
endif()
#
# Build llvm-min-tblgen and llvm-tblgen (only for native builds)
# For cross-compilation, these are built by ExternalProject above.
#
if (NOT USE_NATIVE_TABLEGEN)
add_executable(llvm-min-tblgen
# Main entry point
${LLVM_SOURCE_DIR}/utils/TableGen/llvm-min-tblgen.cpp
# TableGen Basic backends (minimal set, no CodeGenTypes dependency)
${LLVM_SOURCE_DIR}/utils/TableGen/Basic/ARMTargetDefEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/Basic/Attributes.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/Basic/CodeGenIntrinsics.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/Basic/DirectiveEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/Basic/IntrinsicEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/Basic/RISCVTargetDefEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/Basic/RuntimeLibcalls.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/Basic/RuntimeLibcallsEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/Basic/SDNodeProperties.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/Basic/TableGen.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/Basic/TargetFeaturesEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/Basic/TargetLibraryInfoEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/Basic/VTEmitter.cpp
# TableGen library
${LLVM_SOURCE_DIR}/lib/TableGen/DetailedRecordsBackend.cpp
${LLVM_SOURCE_DIR}/lib/TableGen/Error.cpp
${LLVM_SOURCE_DIR}/lib/TableGen/JSONBackend.cpp
${LLVM_SOURCE_DIR}/lib/TableGen/Main.cpp
${LLVM_SOURCE_DIR}/lib/TableGen/Parser.cpp
${LLVM_SOURCE_DIR}/lib/TableGen/Record.cpp
${LLVM_SOURCE_DIR}/lib/TableGen/SetTheory.cpp
${LLVM_SOURCE_DIR}/lib/TableGen/StringMatcher.cpp
${LLVM_SOURCE_DIR}/lib/TableGen/StringToOffsetTable.cpp
${LLVM_SOURCE_DIR}/lib/TableGen/TableGenBackend.cpp
${LLVM_SOURCE_DIR}/lib/TableGen/TableGenBackendSkeleton.cpp
${LLVM_SOURCE_DIR}/lib/TableGen/TGLexer.cpp
${LLVM_SOURCE_DIR}/lib/TableGen/TGParser.cpp
${LLVM_SOURCE_DIR}/lib/TableGen/TGTimer.cpp
# Support library
${LLVMSUPPORT_SOURCES}
${LLVM_BLAKE3_ASM_SOURCES}
${LLVMDEMANGLE_SOURCES}
)
target_include_directories(llvm-min-tblgen PRIVATE
${LLVM_SOURCE_DIR}/include
${LLVM_BINARY_DIR}/include
${LLVM_SOURCE_DIR}/utils/TableGen
"${Datastore_SOURCE_DIR}/contrib/llvm-project/third-party/siphash/include"
)
target_compile_definitions(llvm-min-tblgen PRIVATE ${LLVM_COMPILE_DEFINITIONS})
# On Linux with glibc, link with pthread and dl
# musl has these in libc, so no separate libraries needed
if (UNIX AND NOT APPLE AND NOT USE_MUSL)
target_link_libraries(llvm-min-tblgen PRIVATE pthread dl)
endif()
#
# Generate GenVT.inc using llvm-min-tblgen (needed for CodeGenTypes which llvm-tblgen uses)
# This must be done before building llvm-tblgen
#
file(MAKE_DIRECTORY "${LLVM_BINARY_DIR}/include/llvm/CodeGen")
add_custom_command(
OUTPUT "${LLVM_BINARY_DIR}/include/llvm/CodeGen/GenVT.inc"
COMMAND $<TARGET_FILE:llvm-min-tblgen>
-gen-vt
-I "${LLVM_SOURCE_DIR}/include"
"${LLVM_SOURCE_DIR}/include/llvm/CodeGen/ValueTypes.td"
-o "${LLVM_BINARY_DIR}/include/llvm/CodeGen/GenVT.inc"
DEPENDS llvm-min-tblgen "${LLVM_SOURCE_DIR}/include/llvm/CodeGen/ValueTypes.td"
COMMENT "TableGen (min): GenVT.inc"
VERBATIM
)
add_custom_target(llvm_gen_vt DEPENDS "${LLVM_BINARY_DIR}/include/llvm/CodeGen/GenVT.inc")
#
# Build full llvm-tblgen (depends on GenVT.inc via CodeGenTypes)
#
add_executable(llvm-tblgen
# Main entry point
${LLVM_SOURCE_DIR}/utils/TableGen/llvm-tblgen.cpp
# TableGen Basic backends
${LLVM_SOURCE_DIR}/utils/TableGen/Basic/ARMTargetDefEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/Basic/Attributes.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/Basic/CodeGenIntrinsics.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/Basic/DirectiveEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/Basic/IntrinsicEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/Basic/RISCVTargetDefEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/Basic/RuntimeLibcalls.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/Basic/RuntimeLibcallsEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/Basic/SDNodeProperties.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/Basic/TableGen.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/Basic/TargetFeaturesEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/Basic/TargetLibraryInfoEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/Basic/VTEmitter.cpp
# TableGen Common backends
${LLVM_SOURCE_DIR}/utils/TableGen/Common/GlobalISel/CodeExpander.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/Common/GlobalISel/CombinerUtils.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/Common/GlobalISel/CXXPredicates.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/Common/GlobalISel/GlobalISelMatchTable.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/Common/GlobalISel/GlobalISelMatchTableExecutorEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/Common/GlobalISel/PatternParser.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/Common/GlobalISel/Patterns.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/Common/AsmWriterInst.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/Common/CodeGenDAGPatterns.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/Common/CodeGenHwModes.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/Common/CodeGenInstAlias.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/Common/CodeGenInstruction.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/Common/CodeGenRegisters.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/Common/CodeGenSchedule.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/Common/CodeGenTarget.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/Common/InfoByHwMode.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/Common/InstructionEncoding.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/Common/OptEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/Common/PredicateExpander.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/Common/SubtargetFeatureInfo.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/Common/Types.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/Common/Utils.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/Common/VarLenCodeEmitterGen.cpp
# TableGen full backends
${LLVM_SOURCE_DIR}/utils/TableGen/AsmMatcherEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/AsmWriterEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/CallingConvEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/CodeEmitterGen.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/CodeGenMapTable.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/CompressInstEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/CTagsEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/DAGISelEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/DAGISelMatcher.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/DAGISelMatcherEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/DAGISelMatcherGen.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/DAGISelMatcherOpt.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/DecoderEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/DecoderTableEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/DecoderTree.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/DFAEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/DFAPacketizerEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/DisassemblerEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/DXILEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/ExegesisEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/FastISelEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/GlobalISelCombinerEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/GlobalISelEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/InstrDocsEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/InstrInfoEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/MacroFusionPredicatorEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/OptionParserEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/OptionRSTEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/PseudoLoweringEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/RegisterBankEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/RegisterInfoEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/SDNodeInfoEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/SearchableTableEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/SubtargetEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/WebAssemblyDisassemblerEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/X86InstrMappingEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/X86DisassemblerTables.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/X86FoldTablesEmitter.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/X86MnemonicTables.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/X86ModRMFilters.cpp
${LLVM_SOURCE_DIR}/utils/TableGen/X86RecognizableInstr.cpp
# TableGen library
${LLVM_SOURCE_DIR}/lib/TableGen/DetailedRecordsBackend.cpp
${LLVM_SOURCE_DIR}/lib/TableGen/Error.cpp
${LLVM_SOURCE_DIR}/lib/TableGen/JSONBackend.cpp
${LLVM_SOURCE_DIR}/lib/TableGen/Main.cpp
${LLVM_SOURCE_DIR}/lib/TableGen/Parser.cpp
${LLVM_SOURCE_DIR}/lib/TableGen/Record.cpp
${LLVM_SOURCE_DIR}/lib/TableGen/SetTheory.cpp
${LLVM_SOURCE_DIR}/lib/TableGen/StringMatcher.cpp
${LLVM_SOURCE_DIR}/lib/TableGen/StringToOffsetTable.cpp
${LLVM_SOURCE_DIR}/lib/TableGen/TableGenBackend.cpp
${LLVM_SOURCE_DIR}/lib/TableGen/TableGenBackendSkeleton.cpp
${LLVM_SOURCE_DIR}/lib/TableGen/TGLexer.cpp
${LLVM_SOURCE_DIR}/lib/TableGen/TGParser.cpp
${LLVM_SOURCE_DIR}/lib/TableGen/TGTimer.cpp
# CodeGenTypes library (needs GenVT.inc)
${LLVMCODEGENTYPES_SOURCES}
# Support library
${LLVMSUPPORT_SOURCES}
${LLVM_BLAKE3_ASM_SOURCES}
${LLVMDEMANGLE_SOURCES}
)
# llvm-tblgen needs GenVT.inc which is generated by llvm-min-tblgen
add_dependencies(llvm-tblgen llvm_gen_vt)
target_include_directories(llvm-tblgen PRIVATE
${LLVM_SOURCE_DIR}/include
${LLVM_BINARY_DIR}/include
${LLVM_SOURCE_DIR}/lib/Target
${LLVM_SOURCE_DIR}/utils/TableGen
"${Datastore_SOURCE_DIR}/contrib/llvm-project/third-party/siphash/include"
)
target_compile_definitions(llvm-tblgen PRIVATE ${LLVM_COMPILE_DEFINITIONS})
# On Linux with glibc, link with pthread and dl
# musl has these in libc, so no separate libraries needed
if (UNIX AND NOT APPLE AND NOT USE_MUSL)
target_link_libraries(llvm-tblgen PRIVATE pthread dl)
endif()
# End of native tablegen build block
endif() # NOT USE_NATIVE_TABLEGEN
#
# Set up tablegen executable variables
#
if (USE_NATIVE_TABLEGEN)
# For cross-compilation: use native (host) tablegen
set(LLVM_TABLEGEN_DEPENDS native-tblgen-build)
# The executable path is set above as LLVM_TABLEGEN_EXE
else()
# For native compilation: use the tablegen we just built
set(LLVM_TABLEGEN_EXE "$<TARGET_FILE:llvm-tblgen>")
set(LLVM_MIN_TABLEGEN_EXE "$<TARGET_FILE:llvm-min-tblgen>")
set(LLVM_TABLEGEN_DEPENDS llvm-tblgen)
endif()
#
# For cross-compilation: Copy GenVT.inc from native build
# (For native compilation, llvm_gen_vt is defined inside the if (NOT USE_NATIVE_TABLEGEN) block above)
#
if (USE_NATIVE_TABLEGEN)
set(NATIVE_GENVT_INC "${NATIVE_TBLGEN_BUILD_DIR}/include/llvm/CodeGen/GenVT.inc")
# Copy GenVT.inc from native build to our include dir
add_custom_command(
OUTPUT "${LLVM_BINARY_DIR}/include/llvm/CodeGen/GenVT.inc"
COMMAND ${CMAKE_COMMAND} -E copy
"${NATIVE_GENVT_INC}"
"${LLVM_BINARY_DIR}/include/llvm/CodeGen/GenVT.inc"
DEPENDS native-tblgen-build
COMMENT "Copying native GenVT.inc"
VERBATIM
)
add_custom_target(llvm_gen_vt DEPENDS "${LLVM_BINARY_DIR}/include/llvm/CodeGen/GenVT.inc")
endif()
#
# TableGen macros
#
# Note: GEN_FLAGS should be passed as a CMake list (semicolon-separated) for multiple flags
macro(tablegen_generate TARGET_NAME TD_FILE GEN_FLAGS OUTPUT_FILE)
set(OUTPUT_PATH "${LLVM_BINARY_DIR}/${OUTPUT_FILE}")
get_filename_component(OUTPUT_DIR "${OUTPUT_PATH}" DIRECTORY)
file(MAKE_DIRECTORY "${OUTPUT_DIR}")
add_custom_command(
OUTPUT "${OUTPUT_PATH}"
COMMAND ${LLVM_TABLEGEN_EXE}
${GEN_FLAGS}
-I "${LLVM_SOURCE_DIR}/include"
-I "${LLVM_SOURCE_DIR}/lib/Target/${LLVM_TARGET_ARCH}"
"${TD_FILE}"
-o "${OUTPUT_PATH}"
DEPENDS ${LLVM_TABLEGEN_DEPENDS} "${TD_FILE}"
COMMENT "TableGen: ${OUTPUT_FILE}"
COMMAND_EXPAND_LISTS
)
list(APPEND ${TARGET_NAME}_TABLEGEN_OUTPUTS "${OUTPUT_PATH}")
endmacro()
#
# Generate common TableGen outputs
#
tablegen_generate(COMMON
"${LLVM_SOURCE_DIR}/include/llvm/IR/Intrinsics.td"
"-gen-intrinsic-enums"
"include/llvm/IR/IntrinsicEnums.inc"
)
tablegen_generate(COMMON
"${LLVM_SOURCE_DIR}/include/llvm/IR/Intrinsics.td"
"-gen-intrinsic-impl"
"include/llvm/IR/IntrinsicImpl.inc"
)
tablegen_generate(COMMON
"${LLVM_SOURCE_DIR}/include/llvm/IR/Attributes.td"
"-gen-attrs"
"include/llvm/IR/Attributes.inc"
)
tablegen_generate(COMMON
"${LLVM_SOURCE_DIR}/include/llvm/IR/RuntimeLibcalls.td"
"-gen-runtime-libcalls"
"include/llvm/IR/RuntimeLibcalls.inc"
)
tablegen_generate(COMMON
"${LLVM_SOURCE_DIR}/include/llvm/Analysis/TargetLibraryInfo.td"
"-gen-target-library-info"
"include/llvm/Analysis/TargetLibraryInfo.inc"
)
# Note: GenVT.inc is generated by llvm-min-tblgen earlier in the build process
#
# Intrinsics headers for all architectures (needed by LLVMCore even when building for single arch)
#
set(INTRINSICS_TD "${LLVM_SOURCE_DIR}/include/llvm/IR/Intrinsics.td")
tablegen_generate(COMMON "${INTRINSICS_TD}" "-gen-intrinsic-enums;-intrinsic-prefix=aarch64" "include/llvm/IR/IntrinsicsAArch64.h")
tablegen_generate(COMMON "${INTRINSICS_TD}" "-gen-intrinsic-enums;-intrinsic-prefix=amdgcn" "include/llvm/IR/IntrinsicsAMDGPU.h")
tablegen_generate(COMMON "${INTRINSICS_TD}" "-gen-intrinsic-enums;-intrinsic-prefix=arm" "include/llvm/IR/IntrinsicsARM.h")
tablegen_generate(COMMON "${INTRINSICS_TD}" "-gen-intrinsic-enums;-intrinsic-prefix=bpf" "include/llvm/IR/IntrinsicsBPF.h")
tablegen_generate(COMMON "${INTRINSICS_TD}" "-gen-intrinsic-enums;-intrinsic-prefix=dx" "include/llvm/IR/IntrinsicsDirectX.h")
tablegen_generate(COMMON "${INTRINSICS_TD}" "-gen-intrinsic-enums;-intrinsic-prefix=hexagon" "include/llvm/IR/IntrinsicsHexagon.h")
tablegen_generate(COMMON "${INTRINSICS_TD}" "-gen-intrinsic-enums;-intrinsic-prefix=loongarch" "include/llvm/IR/IntrinsicsLoongArch.h")
tablegen_generate(COMMON "${INTRINSICS_TD}" "-gen-intrinsic-enums;-intrinsic-prefix=mips" "include/llvm/IR/IntrinsicsMips.h")
tablegen_generate(COMMON "${INTRINSICS_TD}" "-gen-intrinsic-enums;-intrinsic-prefix=nvvm" "include/llvm/IR/IntrinsicsNVPTX.h")
tablegen_generate(COMMON "${INTRINSICS_TD}" "-gen-intrinsic-enums;-intrinsic-prefix=ppc" "include/llvm/IR/IntrinsicsPowerPC.h")
tablegen_generate(COMMON "${INTRINSICS_TD}" "-gen-intrinsic-enums;-intrinsic-prefix=r600" "include/llvm/IR/IntrinsicsR600.h")
tablegen_generate(COMMON "${INTRINSICS_TD}" "-gen-intrinsic-enums;-intrinsic-prefix=riscv" "include/llvm/IR/IntrinsicsRISCV.h")
tablegen_generate(COMMON "${INTRINSICS_TD}" "-gen-intrinsic-enums;-intrinsic-prefix=spv" "include/llvm/IR/IntrinsicsSPIRV.h")
tablegen_generate(COMMON "${INTRINSICS_TD}" "-gen-intrinsic-enums;-intrinsic-prefix=s390" "include/llvm/IR/IntrinsicsS390.h")
tablegen_generate(COMMON "${INTRINSICS_TD}" "-gen-intrinsic-enums;-intrinsic-prefix=wasm" "include/llvm/IR/IntrinsicsWebAssembly.h")
tablegen_generate(COMMON "${INTRINSICS_TD}" "-gen-intrinsic-enums;-intrinsic-prefix=x86" "include/llvm/IR/IntrinsicsX86.h")
tablegen_generate(COMMON "${INTRINSICS_TD}" "-gen-intrinsic-enums;-intrinsic-prefix=xcore" "include/llvm/IR/IntrinsicsXCore.h")
tablegen_generate(COMMON "${INTRINSICS_TD}" "-gen-intrinsic-enums;-intrinsic-prefix=ve" "include/llvm/IR/IntrinsicsVE.h")
#
# Frontend tablegen outputs (OpenMP, OpenACC)
#
set(OMP_TD "${LLVM_SOURCE_DIR}/include/llvm/Frontend/OpenMP/OMP.td")
tablegen_generate(COMMON "${OMP_TD}" "-gen-directive-decl" "include/llvm/Frontend/OpenMP/OMP.h.inc")
tablegen_generate(COMMON "${OMP_TD}" "-gen-directive-impl" "include/llvm/Frontend/OpenMP/OMP.inc")
#
# TargetParser tablegen outputs (needed regardless of which arch we're building for)
#
# For these we need a modified tablegen_generate that uses different include dirs
# Note: GEN_FLAGS should be passed as a CMake list (semicolon-separated) for multiple flags
macro(tablegen_generate_target_parser TARGET_NAME TD_FILE GEN_FLAGS EXTRA_INCLUDES OUTPUT_FILE)
set(OUTPUT_PATH "${LLVM_BINARY_DIR}/${OUTPUT_FILE}")
get_filename_component(OUTPUT_DIR "${OUTPUT_PATH}" DIRECTORY)
file(MAKE_DIRECTORY "${OUTPUT_DIR}")
add_custom_command(
OUTPUT "${OUTPUT_PATH}"
COMMAND ${LLVM_TABLEGEN_EXE}
${GEN_FLAGS}
-I "${LLVM_SOURCE_DIR}/include"
-I "${EXTRA_INCLUDES}"
"${TD_FILE}"
-o "${OUTPUT_PATH}"
DEPENDS ${LLVM_TABLEGEN_DEPENDS} "${TD_FILE}"
COMMENT "TableGen: ${OUTPUT_FILE}"
COMMAND_EXPAND_LISTS
)
list(APPEND ${TARGET_NAME}_TABLEGEN_OUTPUTS "${OUTPUT_PATH}")
endmacro()
# ARM target parser def
tablegen_generate_target_parser(COMMON
"${LLVM_SOURCE_DIR}/lib/Target/ARM/ARM.td"
"-gen-arm-target-def"
"${LLVM_SOURCE_DIR}/lib/Target/ARM"
"include/llvm/TargetParser/ARMTargetParserDef.inc"
)
# AArch64 target parser def
tablegen_generate_target_parser(COMMON
"${LLVM_SOURCE_DIR}/lib/Target/AArch64/AArch64.td"
"-gen-arm-target-def"
"${LLVM_SOURCE_DIR}/lib/Target/AArch64"
"include/llvm/TargetParser/AArch64TargetParserDef.inc"
)
# RISCV target parser def
tablegen_generate_target_parser(COMMON
"${LLVM_SOURCE_DIR}/lib/Target/RISCV/RISCV.td"
"-gen-riscv-target-def"
"${LLVM_SOURCE_DIR}/lib/Target/RISCV"
"include/llvm/TargetParser/RISCVTargetParserDef.inc"
)
# PPC target features
tablegen_generate_target_parser(COMMON
"${LLVM_SOURCE_DIR}/lib/Target/PowerPC/PPC.td"
"-gen-target-features"
"${LLVM_SOURCE_DIR}/lib/Target/PowerPC"
"include/llvm/TargetParser/PPCGenTargetFeatures.inc"
)
#
# X86-specific TableGen
#
if (ARCH_AMD64)
set(X86_TD "${LLVM_SOURCE_DIR}/lib/Target/X86/X86.td")
tablegen_generate(X86 "${X86_TD}" "-gen-register-info" "lib/Target/X86/X86GenRegisterInfo.inc")
tablegen_generate(X86 "${X86_TD}" "-gen-instr-info" "lib/Target/X86/X86GenInstrInfo.inc")
tablegen_generate(X86 "${X86_TD}" "-gen-subtarget" "lib/Target/X86/X86GenSubtargetInfo.inc")
tablegen_generate(X86 "${X86_TD}" "-gen-dag-isel" "lib/Target/X86/X86GenDAGISel.inc")
tablegen_generate(X86 "${X86_TD}" "-gen-callingconv" "lib/Target/X86/X86GenCallingConv.inc")
tablegen_generate(X86 "${X86_TD}" "-gen-asm-writer" "lib/Target/X86/X86GenAsmWriter.inc")
tablegen_generate(X86 "${X86_TD}" "-gen-asm-writer;-asmwriternum=1" "lib/Target/X86/X86GenAsmWriter1.inc")
tablegen_generate(X86 "${X86_TD}" "-gen-asm-matcher" "lib/Target/X86/X86GenAsmMatcher.inc")
tablegen_generate(X86 "${X86_TD}" "-gen-fast-isel" "lib/Target/X86/X86GenFastISel.inc")
tablegen_generate(X86 "${X86_TD}" "-gen-global-isel" "lib/Target/X86/X86GenGlobalISel.inc")
tablegen_generate(X86 "${X86_TD}" "-gen-register-bank" "lib/Target/X86/X86GenRegisterBank.inc")
tablegen_generate(X86 "${X86_TD}" "-gen-x86-fold-tables" "lib/Target/X86/X86GenFoldTables.inc")
tablegen_generate(X86 "${X86_TD}" "-gen-x86-mnemonic-tables;-asmwriternum=1" "lib/Target/X86/X86GenMnemonicTables.inc")
tablegen_generate(X86 "${X86_TD}" "-gen-x86-instr-mapping" "lib/Target/X86/X86GenInstrMapping.inc")
tablegen_generate(X86 "${X86_TD}" "-gen-global-isel-combiner;-combiners=X86PreLegalizerCombiner" "lib/Target/X86/X86GenPreLegalizeGICombiner.inc")
endif()
#
# AArch64-specific TableGen
#
if (ARCH_AARCH64)
set(AARCH64_TD "${LLVM_SOURCE_DIR}/lib/Target/AArch64/AArch64.td")
tablegen_generate(AARCH64 "${AARCH64_TD}" "-gen-register-info" "lib/Target/AArch64/AArch64GenRegisterInfo.inc")
tablegen_generate(AARCH64 "${AARCH64_TD}" "-gen-instr-info" "lib/Target/AArch64/AArch64GenInstrInfo.inc")
tablegen_generate(AARCH64 "${AARCH64_TD}" "-gen-subtarget" "lib/Target/AArch64/AArch64GenSubtargetInfo.inc")
tablegen_generate(AARCH64 "${AARCH64_TD}" "-gen-dag-isel" "lib/Target/AArch64/AArch64GenDAGISel.inc")
tablegen_generate(AARCH64 "${AARCH64_TD}" "-gen-callingconv" "lib/Target/AArch64/AArch64GenCallingConv.inc")
tablegen_generate(AARCH64 "${AARCH64_TD}" "-gen-asm-writer" "lib/Target/AArch64/AArch64GenAsmWriter.inc")
tablegen_generate(AARCH64 "${AARCH64_TD}" "-gen-asm-writer;-asmwriternum=1" "lib/Target/AArch64/AArch64GenAsmWriter1.inc")
tablegen_generate(AARCH64 "${AARCH64_TD}" "-gen-asm-matcher" "lib/Target/AArch64/AArch64GenAsmMatcher.inc")
tablegen_generate(AARCH64 "${AARCH64_TD}" "-gen-fast-isel" "lib/Target/AArch64/AArch64GenFastISel.inc")
tablegen_generate(AARCH64 "${AARCH64_TD}" "-gen-global-isel" "lib/Target/AArch64/AArch64GenGlobalISel.inc")
tablegen_generate(AARCH64 "${AARCH64_TD}" "-gen-global-isel-combiner;-combiners=AArch64O0PreLegalizerCombiner" "lib/Target/AArch64/AArch64GenO0PreLegalizeGICombiner.inc")
tablegen_generate(AARCH64 "${AARCH64_TD}" "-gen-global-isel-combiner;-combiners=AArch64PreLegalizerCombiner" "lib/Target/AArch64/AArch64GenPreLegalizeGICombiner.inc")
tablegen_generate(AARCH64 "${AARCH64_TD}" "-gen-global-isel-combiner;-combiners=AArch64PostLegalizerCombiner" "lib/Target/AArch64/AArch64GenPostLegalizeGICombiner.inc")
tablegen_generate(AARCH64 "${AARCH64_TD}" "-gen-global-isel-combiner;-combiners=AArch64PostLegalizerLowering" "lib/Target/AArch64/AArch64GenPostLegalizeGILowering.inc")
tablegen_generate(AARCH64 "${AARCH64_TD}" "-gen-emitter" "lib/Target/AArch64/AArch64GenMCCodeEmitter.inc")
tablegen_generate(AARCH64 "${AARCH64_TD}" "-gen-pseudo-lowering" "lib/Target/AArch64/AArch64GenMCPseudoLowering.inc")
tablegen_generate(AARCH64 "${AARCH64_TD}" "-gen-register-bank" "lib/Target/AArch64/AArch64GenRegisterBank.inc")
tablegen_generate(AARCH64 "${AARCH64_TD}" "-gen-sd-node-info" "lib/Target/AArch64/AArch64GenSDNodeInfo.inc")
tablegen_generate(AARCH64 "${AARCH64_TD}" "-gen-searchable-tables" "lib/Target/AArch64/AArch64GenSystemOperands.inc")
tablegen_generate(AARCH64 "${AARCH64_TD}" "-gen-exegesis" "lib/Target/AArch64/AArch64GenExegesis.inc")
endif()
#
# PowerPC-specific TableGen
#
if (ARCH_PPC64LE)
set(PPC_TD "${LLVM_SOURCE_DIR}/lib/Target/PowerPC/PPC.td")
tablegen_generate(PPC "${PPC_TD}" "-gen-register-info" "lib/Target/PowerPC/PPCGenRegisterInfo.inc")
tablegen_generate(PPC "${PPC_TD}" "-gen-instr-info" "lib/Target/PowerPC/PPCGenInstrInfo.inc")
tablegen_generate(PPC "${PPC_TD}" "-gen-subtarget" "lib/Target/PowerPC/PPCGenSubtargetInfo.inc")
tablegen_generate(PPC "${PPC_TD}" "-gen-dag-isel" "lib/Target/PowerPC/PPCGenDAGISel.inc")
tablegen_generate(PPC "${PPC_TD}" "-gen-callingconv" "lib/Target/PowerPC/PPCGenCallingConv.inc")
tablegen_generate(PPC "${PPC_TD}" "-gen-asm-writer" "lib/Target/PowerPC/PPCGenAsmWriter.inc")
tablegen_generate(PPC "${PPC_TD}" "-gen-asm-matcher" "lib/Target/PowerPC/PPCGenAsmMatcher.inc")
tablegen_generate(PPC "${PPC_TD}" "-gen-fast-isel" "lib/Target/PowerPC/PPCGenFastISel.inc")
tablegen_generate(PPC "${PPC_TD}" "-gen-emitter" "lib/Target/PowerPC/PPCGenMCCodeEmitter.inc")
tablegen_generate(PPC "${PPC_TD}" "-gen-register-bank" "lib/Target/PowerPC/PPCGenRegisterBank.inc")
tablegen_generate(PPC "${PPC_TD}" "-gen-global-isel" "lib/Target/PowerPC/PPCGenGlobalISel.inc")
tablegen_generate(PPC "${PPC_TD}" "-gen-exegesis" "lib/Target/PowerPC/PPCGenExegesis.inc")
tablegen_generate(PPC "${PPC_TD}" "-gen-sd-node-info" "lib/Target/PowerPC/PPCGenSDNodeInfo.inc")
endif()
#
# SystemZ-specific TableGen
#
if (ARCH_S390X)
set(SYSTEMZ_TD "${LLVM_SOURCE_DIR}/lib/Target/SystemZ/SystemZ.td")
tablegen_generate(SYSTEMZ "${SYSTEMZ_TD}" "-gen-register-info" "lib/Target/SystemZ/SystemZGenRegisterInfo.inc")
tablegen_generate(SYSTEMZ "${SYSTEMZ_TD}" "-gen-instr-info" "lib/Target/SystemZ/SystemZGenInstrInfo.inc")
tablegen_generate(SYSTEMZ "${SYSTEMZ_TD}" "-gen-subtarget" "lib/Target/SystemZ/SystemZGenSubtargetInfo.inc")
tablegen_generate(SYSTEMZ "${SYSTEMZ_TD}" "-gen-dag-isel" "lib/Target/SystemZ/SystemZGenDAGISel.inc")
tablegen_generate(SYSTEMZ "${SYSTEMZ_TD}" "-gen-callingconv" "lib/Target/SystemZ/SystemZGenCallingConv.inc")
tablegen_generate(SYSTEMZ "${SYSTEMZ_TD}" "-gen-asm-writer" "lib/Target/SystemZ/SystemZGenGNUAsmWriter.inc")
tablegen_generate(SYSTEMZ "${SYSTEMZ_TD}" "-gen-asm-writer;-asmwriternum=1" "lib/Target/SystemZ/SystemZGenHLASMAsmWriter.inc")
tablegen_generate(SYSTEMZ "${SYSTEMZ_TD}" "-gen-asm-matcher" "lib/Target/SystemZ/SystemZGenAsmMatcher.inc")
tablegen_generate(SYSTEMZ "${SYSTEMZ_TD}" "-gen-emitter" "lib/Target/SystemZ/SystemZGenMCCodeEmitter.inc")
tablegen_generate(SYSTEMZ "${SYSTEMZ_TD}" "-gen-sd-node-info" "lib/Target/SystemZ/SystemZGenSDNodeInfo.inc")
endif()
#
# RISCV-specific TableGen
#
if (ARCH_RISCV64)
set(RISCV_TD "${LLVM_SOURCE_DIR}/lib/Target/RISCV/RISCV.td")
# GlobalISel and combiners use RISCVGISel.td which includes RISCVCombine.td
set(RISCV_GISEL_TD "${LLVM_SOURCE_DIR}/lib/Target/RISCV/RISCVGISel.td")
tablegen_generate(RISCV "${RISCV_TD}" "-gen-register-info" "lib/Target/RISCV/RISCVGenRegisterInfo.inc")
tablegen_generate(RISCV "${RISCV_TD}" "-gen-instr-info" "lib/Target/RISCV/RISCVGenInstrInfo.inc")
tablegen_generate(RISCV "${RISCV_TD}" "-gen-subtarget" "lib/Target/RISCV/RISCVGenSubtargetInfo.inc")
tablegen_generate(RISCV "${RISCV_TD}" "-gen-dag-isel" "lib/Target/RISCV/RISCVGenDAGISel.inc")
tablegen_generate(RISCV "${RISCV_TD}" "-gen-asm-writer" "lib/Target/RISCV/RISCVGenAsmWriter.inc")
tablegen_generate(RISCV "${RISCV_TD}" "-gen-asm-matcher" "lib/Target/RISCV/RISCVGenAsmMatcher.inc")
tablegen_generate(RISCV "${RISCV_TD}" "-gen-compress-inst-emitter" "lib/Target/RISCV/RISCVGenCompressInstEmitter.inc")
tablegen_generate(RISCV "${RISCV_TD}" "-gen-macro-fusion-pred" "lib/Target/RISCV/RISCVGenMacroFusion.inc")
tablegen_generate(RISCV "${RISCV_TD}" "-gen-emitter" "lib/Target/RISCV/RISCVGenMCCodeEmitter.inc")
tablegen_generate(RISCV "${RISCV_TD}" "-gen-pseudo-lowering" "lib/Target/RISCV/RISCVGenMCPseudoLowering.inc")
tablegen_generate(RISCV "${RISCV_TD}" "-gen-register-bank" "lib/Target/RISCV/RISCVGenRegisterBank.inc")
tablegen_generate(RISCV "${RISCV_TD}" "-gen-searchable-tables" "lib/Target/RISCV/RISCVGenSearchableTables.inc")
tablegen_generate(RISCV "${RISCV_TD}" "-gen-sd-node-info" "lib/Target/RISCV/RISCVGenSDNodeInfo.inc")
tablegen_generate(RISCV "${RISCV_TD}" "-gen-exegesis" "lib/Target/RISCV/RISCVGenExegesis.inc")
# GlobalISel commands use RISCVGISel.td (which includes RISCVCombine.td)
tablegen_generate(RISCV "${RISCV_GISEL_TD}" "-gen-global-isel" "lib/Target/RISCV/RISCVGenGlobalISel.inc")
tablegen_generate(RISCV "${RISCV_GISEL_TD}" "-gen-global-isel-combiner;-combiners=RISCVO0PreLegalizerCombiner" "lib/Target/RISCV/RISCVGenO0PreLegalizeGICombiner.inc")
tablegen_generate(RISCV "${RISCV_GISEL_TD}" "-gen-global-isel-combiner;-combiners=RISCVPreLegalizerCombiner" "lib/Target/RISCV/RISCVGenPreLegalizeGICombiner.inc")
tablegen_generate(RISCV "${RISCV_GISEL_TD}" "-gen-global-isel-combiner;-combiners=RISCVPostLegalizerCombiner" "lib/Target/RISCV/RISCVGenPostLegalizeGICombiner.inc")
endif()
#
# LoongArch-specific TableGen
#
if (ARCH_LOONGARCH64)
set(LOONGARCH_TD "${LLVM_SOURCE_DIR}/lib/Target/LoongArch/LoongArch.td")
tablegen_generate(LOONGARCH "${LOONGARCH_TD}" "-gen-register-info" "lib/Target/LoongArch/LoongArchGenRegisterInfo.inc")
tablegen_generate(LOONGARCH "${LOONGARCH_TD}" "-gen-instr-info" "lib/Target/LoongArch/LoongArchGenInstrInfo.inc")
tablegen_generate(LOONGARCH "${LOONGARCH_TD}" "-gen-subtarget" "lib/Target/LoongArch/LoongArchGenSubtargetInfo.inc")
tablegen_generate(LOONGARCH "${LOONGARCH_TD}" "-gen-dag-isel" "lib/Target/LoongArch/LoongArchGenDAGISel.inc")
tablegen_generate(LOONGARCH "${LOONGARCH_TD}" "-gen-asm-writer" "lib/Target/LoongArch/LoongArchGenAsmWriter.inc")
tablegen_generate(LOONGARCH "${LOONGARCH_TD}" "-gen-asm-matcher" "lib/Target/LoongArch/LoongArchGenAsmMatcher.inc")
tablegen_generate(LOONGARCH "${LOONGARCH_TD}" "-gen-pseudo-lowering" "lib/Target/LoongArch/LoongArchGenMCPseudoLowering.inc")
tablegen_generate(LOONGARCH "${LOONGARCH_TD}" "-gen-emitter" "lib/Target/LoongArch/LoongArchGenMCCodeEmitter.inc")
tablegen_generate(LOONGARCH "${LOONGARCH_TD}" "-gen-disassembler" "lib/Target/LoongArch/LoongArchGenDisassemblerTables.inc")
tablegen_generate(LOONGARCH "${LOONGARCH_TD}" "-gen-sd-node-info" "lib/Target/LoongArch/LoongArchGenSDNodeInfo.inc")
endif()
# Combine all tablegen outputs
set(ALL_TABLEGEN_OUTPUTS ${COMMON_TABLEGEN_OUTPUTS})
if (ARCH_AMD64)
list(APPEND ALL_TABLEGEN_OUTPUTS ${X86_TABLEGEN_OUTPUTS})
elseif (ARCH_AARCH64)
list(APPEND ALL_TABLEGEN_OUTPUTS ${AARCH64_TABLEGEN_OUTPUTS})
elseif (ARCH_PPC64LE)
list(APPEND ALL_TABLEGEN_OUTPUTS ${PPC_TABLEGEN_OUTPUTS})
elseif (ARCH_S390X)
list(APPEND ALL_TABLEGEN_OUTPUTS ${SYSTEMZ_TABLEGEN_OUTPUTS})
elseif (ARCH_RISCV64)
list(APPEND ALL_TABLEGEN_OUTPUTS ${RISCV_TABLEGEN_OUTPUTS})
elseif (ARCH_LOONGARCH64)
list(APPEND ALL_TABLEGEN_OUTPUTS ${LOONGARCH_TABLEGEN_OUTPUTS})
endif()
add_custom_target(llvm_tablegen_outputs DEPENDS ${ALL_TABLEGEN_OUTPUTS})
# Make sure GenVT.inc (generated by llvm-min-tblgen) is also a dependency
add_dependencies(llvm_tablegen_outputs llvm_gen_vt)
#
# Helper function to add LLVM library
#
function(add_llvm_library name)
cmake_parse_arguments(ARG "" "" "SOURCES;DEPENDS" ${ARGN})
add_library(${name} STATIC ${ARG_SOURCES})
target_include_directories(${name} PUBLIC ${LLVM_INCLUDE_DIRS})
# Include generated files (tablegen outputs) for target architecture
target_include_directories(${name} PRIVATE "${LLVM_BINARY_DIR}/lib/Target/${LLVM_TARGET_ARCH}")
# Include source directory for target architecture (for headers like TargetInfo/X86TargetInfo.h)
target_include_directories(${name} PRIVATE "${LLVM_SOURCE_DIR}/lib/Target/${LLVM_TARGET_ARCH}")
target_compile_definitions(${name} PRIVATE ${LLVM_COMPILE_DEFINITIONS})
add_dependencies(${name} llvm_tablegen_outputs)
if(ARG_DEPENDS)
target_link_libraries(${name} PUBLIC ${ARG_DEPENDS})
endif()
endfunction()
#
# Build LLVM libraries (in dependency order)
#
add_llvm_library(LLVMDemangle SOURCES ${LLVMDEMANGLE_SOURCES})
add_llvm_library(LLVMSupport SOURCES ${LLVMSUPPORT_SOURCES} ${LLVM_BLAKE3_ASM_SOURCES} DEPENDS LLVMDemangle)
add_llvm_library(LLVMBinaryFormat SOURCES ${LLVMBINARYFORMAT_SOURCES} DEPENDS LLVMSupport)
add_llvm_library(LLVMTargetParser SOURCES ${LLVMTARGETPARSER_SOURCES} DEPENDS LLVMSupport)
add_llvm_library(LLVMCore SOURCES ${LLVMCORE_SOURCES} DEPENDS LLVMSupport LLVMBinaryFormat LLVMTargetParser LLVMRemarks)
add_llvm_library(LLVMMC SOURCES ${LLVMMC_SOURCES} DEPENDS LLVMSupport LLVMBinaryFormat LLVMTargetParser)
add_llvm_library(LLVMMCParser SOURCES ${LLVMMCPARSER_SOURCES} DEPENDS LLVMMC LLVMSupport)
add_llvm_library(LLVMMCDisassembler SOURCES ${LLVMMCDISASSEMBLER_SOURCES} DEPENDS LLVMMC LLVMSupport)
add_llvm_library(LLVMBitstreamReader SOURCES ${LLVMBITSTREAMREADER_SOURCES} DEPENDS LLVMSupport)
add_llvm_library(LLVMBitReader SOURCES ${LLVMBITREADER_SOURCES} DEPENDS LLVMCore LLVMBitstreamReader LLVMSupport)
add_llvm_library(LLVMBitWriter SOURCES ${LLVMBITWRITER_SOURCES} DEPENDS LLVMCore LLVMSupport)
add_llvm_library(LLVMRemarks SOURCES ${LLVMREMARKS_SOURCES} DEPENDS LLVMSupport LLVMBitstreamReader)
add_llvm_library(LLVMDebugInfoCodeView SOURCES ${LLVMDEBUGINFOCODEVI_SOURCES} DEPENDS LLVMSupport)
add_llvm_library(LLVMObject SOURCES ${LLVMOBJECT_SOURCES} DEPENDS LLVMCore LLVMMC LLVMBinaryFormat LLVMSupport LLVMTargetParser LLVMTextAPI)
add_llvm_library(LLVMTextAPI SOURCES ${LLVMTEXTAPI_SOURCES} DEPENDS LLVMSupport LLVMBinaryFormat LLVMTargetParser)
add_llvm_library(LLVMObjectYAML SOURCES ${LLVMOBJECTYAML_SOURCES} DEPENDS LLVMBinaryFormat LLVMObject LLVMSupport LLVMTargetParser LLVMDebugInfoCodeView LLVMMC)
add_llvm_library(LLVMAsmParser SOURCES ${LLVMASMPARSER_SOURCES} DEPENDS LLVMBinaryFormat LLVMCore LLVMSupport LLVMTargetParser)
add_llvm_library(LLVMIRReader SOURCES ${LLVMIRREADER_SOURCES} DEPENDS LLVMAsmParser LLVMBitReader LLVMCore LLVMSupport)
add_llvm_library(LLVMDebugInfoDWARF SOURCES ${LLVMDEBUGINFODWARF_SOURCES} DEPENDS LLVMSupport LLVMObject LLVMBinaryFormat)
add_llvm_library(LLVMProfileData SOURCES ${LLVMPROFILEDATA_SOURCES} DEPENDS LLVMSupport LLVMCore)
add_llvm_library(LLVMAnalysis SOURCES ${LLVMANALYSIS_SOURCES} DEPENDS LLVMCore LLVMObject LLVMProfileData LLVMSupport LLVMFrontendHLSL)
add_llvm_library(LLVMTransformUtils SOURCES ${LLVMTRANSFORMUTILS_SOURCES} DEPENDS LLVMCore LLVMAnalysis LLVMSupport)
add_llvm_library(LLVMLinker SOURCES ${LLVMLINKER_SOURCES} DEPENDS LLVMCore LLVMObject LLVMSupport LLVMTransformUtils LLVMTargetParser)
add_llvm_library(LLVMTarget SOURCES ${LLVMTARGET_SOURCES} DEPENDS LLVMCore LLVMAnalysis LLVMSupport)
add_llvm_library(LLVMScalarOpts SOURCES ${LLVMSCALAROPTS_SOURCES} DEPENDS LLVMCore LLVMAnalysis LLVMTransformUtils LLVMSupport)
add_llvm_library(LLVMInstCombine SOURCES ${LLVMINSTCOMBINE_SOURCES} DEPENDS LLVMCore LLVMAnalysis LLVMTransformUtils LLVMSupport)
add_llvm_library(LLVMAggressiveInstCombine SOURCES ${LLVMAGGRESSIVEINSTCOMBINE_SOURCES} DEPENDS LLVMCore LLVMAnalysis LLVMTransformUtils LLVMSupport)
add_llvm_library(LLVMVectorize SOURCES ${LLVMVECTORIZE_SOURCES} DEPENDS LLVMCore LLVMAnalysis LLVMTransformUtils LLVMSupport)
add_llvm_library(LLVMipo SOURCES ${LLVMIPO_SOURCES} DEPENDS LLVMCore LLVMAnalysis LLVMTransformUtils LLVMScalarOpts LLVMInstCombine LLVMSupport LLVMFrontendOpenMP LLVMCGData)
add_llvm_library(LLVMInstrumentation SOURCES ${LLVMINSTRUMENTATION_SOURCES} DEPENDS LLVMCore LLVMAnalysis LLVMTransformUtils LLVMProfileData LLVMSupport)
add_llvm_library(LLVMCodeGenTypes SOURCES ${LLVMCODEGENTYPES_SOURCES} DEPENDS LLVMSupport)
add_llvm_library(LLVMCodeGen SOURCES ${LLVMCODEGEN_SOURCES} DEPENDS LLVMCore LLVMAnalysis LLVMTarget LLVMTransformUtils LLVMScalarOpts LLVMMC LLVMCodeGenTypes LLVMBitReader LLVMBitWriter LLVMProfileData LLVMSupport LLVMCGData)
add_llvm_library(LLVMGlobalISel SOURCES ${LLVMGLOBALISEL_SOURCES} DEPENDS LLVMCore LLVMCodeGen LLVMAnalysis LLVMTarget LLVMMC LLVMSupport)
add_llvm_library(LLVMSelectionDAG SOURCES ${LLVMSELECTIONDAG_SOURCES} DEPENDS LLVMCore LLVMCodeGen LLVMAnalysis LLVMTarget LLVMTransformUtils LLVMSupport)
add_llvm_library(LLVMAsmPrinter SOURCES ${LLVMASMPRINTER_SOURCES} DEPENDS LLVMCore LLVMCodeGen LLVMAnalysis LLVMTarget LLVMMC LLVMMCParser LLVMDebugInfoCodeView LLVMRemarks LLVMSupport)
add_llvm_library(LLVMPasses SOURCES ${LLVMPASSES_SOURCES} DEPENDS LLVMCore LLVMAnalysis LLVMTransformUtils LLVMScalarOpts LLVMInstCombine LLVMVectorize LLVMipo LLVMInstrumentation LLVMTarget LLVMSupport)
add_llvm_library(LLVMRuntimeDyld SOURCES ${LLVMRUNTIMEDYLD_SOURCES} DEPENDS LLVMCore LLVMObject LLVMMC LLVMSupport)
add_llvm_library(LLVMExecutionEngine SOURCES ${LLVMEXECUTIONENGINE_SOURCES} DEPENDS LLVMCore LLVMTarget LLVMObject LLVMMC LLVMRuntimeDyld LLVMSupport)
add_llvm_library(LLVMCGData SOURCES ${LLVMCGDATA_SOURCES} DEPENDS LLVMSupport LLVMCore LLVMObject)
add_llvm_library(LLVMObjCARCOpts SOURCES ${LLVMOBJCARCOPTS_SOURCES} DEPENDS LLVMCore LLVMAnalysis LLVMTransformUtils LLVMSupport)
add_llvm_library(LLVMIRPrinter SOURCES ${LLVMIRPRINTER_SOURCES} DEPENDS LLVMCore LLVMAnalysis LLVMSupport)
add_llvm_library(LLVMCFGuard SOURCES ${LLVMCFGUARD_SOURCES} DEPENDS LLVMCore LLVMSupport)
add_llvm_library(LLVMFrontendOpenMP SOURCES ${LLVMFRONTENDOPENMP_SOURCES} DEPENDS LLVMCore LLVMTransformUtils LLVMSupport LLVMFrontendAtomic LLVMFrontendOffloading)
add_llvm_library(LLVMFrontendAtomic SOURCES ${LLVMFRONTENDATOMIC_SOURCES} DEPENDS LLVMCore LLVMSupport LLVMAnalysis)
add_llvm_library(LLVMFrontendOffloading SOURCES ${LLVMFRONTENDOFFLOADING_SOURCES} DEPENDS LLVMCore LLVMSupport)
add_llvm_library(LLVMFrontendHLSL SOURCES ${LLVMFRONTENDHLSL_SOURCES} DEPENDS LLVMBinaryFormat LLVMCore LLVMSupport)
add_llvm_library(LLVMCoroutines SOURCES ${LLVMCOROUTINES_SOURCES} DEPENDS LLVMCore LLVMAnalysis LLVMTransformUtils LLVMipo LLVMSupport)
add_llvm_library(LLVMHipStdPar SOURCES ${LLVMHIPSTDPAR_SOURCES} DEPENDS LLVMAnalysis LLVMCore LLVMSupport LLVMTransformUtils)
add_llvm_library(LLVMSandboxIR SOURCES ${LLVMSANDBOXIR_SOURCES} DEPENDS LLVMCore LLVMSupport)
# Architecture-specific libraries
if (ARCH_AMD64)
add_llvm_library(LLVMX86Info SOURCES ${LLVMX86INFO_SOURCES} DEPENDS LLVMMC LLVMSupport)
add_llvm_library(LLVMX86Desc SOURCES ${LLVMX86DESC_SOURCES} DEPENDS LLVMX86Info LLVMMC LLVMMCDisassembler LLVMSupport)
add_llvm_library(LLVMX86CodeGen SOURCES ${LLVMX86CODEGEN_SOURCES} DEPENDS LLVMX86Info LLVMX86Desc LLVMCodeGen LLVMGlobalISel LLVMSelectionDAG LLVMAsmPrinter LLVMTarget LLVMMC LLVMSupport)
elseif (ARCH_AARCH64)
add_llvm_library(LLVMAArch64Info SOURCES ${LLVMAARCH64INFO_SOURCES} DEPENDS LLVMMC LLVMSupport)
add_llvm_library(LLVMAArch64Desc SOURCES ${LLVMAARCH64DESC_SOURCES} ${LLVMAARCH64UTILS_SOURCES} DEPENDS LLVMAArch64Info LLVMMC LLVMMCDisassembler LLVMSupport)
add_llvm_library(LLVMAArch64CodeGen SOURCES ${LLVMAARCH64CODEGEN_SOURCES} DEPENDS LLVMAArch64Info LLVMAArch64Desc LLVMCodeGen LLVMGlobalISel LLVMSelectionDAG LLVMAsmPrinter LLVMTarget LLVMMC LLVMSupport)
elseif (ARCH_PPC64LE)
add_llvm_library(LLVMPowerPCInfo SOURCES ${LLVMPOWERPCINFO_SOURCES} DEPENDS LLVMMC LLVMSupport)
add_llvm_library(LLVMPowerPCDesc SOURCES ${LLVMPOWERPCDESC_SOURCES} DEPENDS LLVMPowerPCInfo LLVMMC LLVMMCDisassembler LLVMSupport)
add_llvm_library(LLVMPowerPCCodeGen SOURCES ${LLVMPOWERPCCODEGEN_SOURCES} DEPENDS LLVMPowerPCInfo LLVMPowerPCDesc LLVMCodeGen LLVMGlobalISel LLVMSelectionDAG LLVMAsmPrinter LLVMTarget LLVMMC LLVMSupport)
elseif (ARCH_S390X)
add_llvm_library(LLVMSystemZInfo SOURCES ${LLVMSYSTEMZINFO_SOURCES} DEPENDS LLVMMC LLVMSupport)
add_llvm_library(LLVMSystemZDesc SOURCES ${LLVMSYSTEMZDESC_SOURCES} DEPENDS LLVMSystemZInfo LLVMMC LLVMMCDisassembler LLVMSupport)
add_llvm_library(LLVMSystemZCodeGen SOURCES ${LLVMSYSTEMZCODEGEN_SOURCES} DEPENDS LLVMSystemZInfo LLVMSystemZDesc LLVMCodeGen LLVMSelectionDAG LLVMAsmPrinter LLVMTarget LLVMMC LLVMSupport)
elseif (ARCH_RISCV64)
add_llvm_library(LLVMRISCVInfo SOURCES ${LLVMRISCVINFO_SOURCES} DEPENDS LLVMMC LLVMSupport)
add_llvm_library(LLVMRISCVDesc SOURCES ${LLVMRISCVDESC_SOURCES} DEPENDS LLVMRISCVInfo LLVMMC LLVMMCDisassembler LLVMSupport)
add_llvm_library(LLVMRISCVCodeGen SOURCES ${LLVMRISCVCODEGEN_SOURCES} DEPENDS LLVMRISCVInfo LLVMRISCVDesc LLVMCodeGen LLVMGlobalISel LLVMSelectionDAG LLVMAsmPrinter LLVMTarget LLVMMC LLVMSupport)
elseif (ARCH_LOONGARCH64)
add_llvm_library(LLVMLoongArchInfo SOURCES ${LLVMLOONGARCHINFO_SOURCES} DEPENDS LLVMMC LLVMSupport)
add_llvm_library(LLVMLoongArchDesc SOURCES ${LLVMLOONGARCHDESC_SOURCES} DEPENDS LLVMLoongArchInfo LLVMMC LLVMMCDisassembler LLVMSupport)
add_llvm_library(LLVMLoongArchCodeGen SOURCES ${LLVMLOONGARCHCODEGEN_SOURCES} DEPENDS LLVMLoongArchInfo LLVMLoongArchDesc LLVMCodeGen LLVMSelectionDAG LLVMAsmPrinter LLVMTarget LLVMMC LLVMSupport)
endif()
# XRay support
if (ENABLE_XRAY)
add_llvm_library(LLVMXRay SOURCES ${LLVMXRAY_SOURCES} DEPENDS LLVMSupport LLVMObject)
endif()
#
# Create the interface library that Datastore links against
#
if (NOT ENABLE_EMBEDDED_COMPILER AND NOT ENABLE_DWARF_PARSER)
set (REQUIRED_LLVM_LIBRARIES LLVMSupport)
else()
set (REQUIRED_LLVM_LIBRARIES
LLVMExecutionEngine
LLVMRuntimeDyld
LLVMAsmPrinter
LLVMDebugInfoDWARF
LLVMGlobalISel
LLVMSelectionDAG
LLVMMCDisassembler
LLVMPasses
LLVMCodeGen
LLVMCodeGenTypes
LLVMipo
LLVMBitWriter
LLVMInstrumentation
LLVMScalarOpts
LLVMAggressiveInstCombine
LLVMInstCombine
LLVMVectorize
LLVMTransformUtils
LLVMTarget
LLVMAnalysis
LLVMProfileData
LLVMObject
LLVMBitReader
LLVMCore
LLVMRemarks
LLVMBitstreamReader
LLVMMCParser
LLVMMC
LLVMBinaryFormat
LLVMDebugInfoCodeView
LLVMCGData
LLVMObjCARCOpts
LLVMIRPrinter
LLVMCFGuard
LLVMFrontendOpenMP
LLVMFrontendAtomic
LLVMFrontendOffloading
LLVMFrontendHLSL
LLVMCoroutines
LLVMHipStdPar
LLVMSandboxIR
LLVMTextAPI
LLVMObjectYAML
LLVMAsmParser
LLVMIRReader
LLVMLinker
LLVMTargetParser
LLVMSupport
LLVMDemangle
)
if (ARCH_AMD64)
list(APPEND REQUIRED_LLVM_LIBRARIES LLVMX86Info LLVMX86Desc LLVMX86CodeGen)
elseif (ARCH_AARCH64)
list(APPEND REQUIRED_LLVM_LIBRARIES LLVMAArch64Info LLVMAArch64Desc LLVMAArch64CodeGen)
elseif (ARCH_PPC64LE)
list(APPEND REQUIRED_LLVM_LIBRARIES LLVMPowerPCInfo LLVMPowerPCDesc LLVMPowerPCCodeGen)
elseif (ARCH_S390X)
list(APPEND REQUIRED_LLVM_LIBRARIES LLVMSystemZInfo LLVMSystemZDesc LLVMSystemZCodeGen)
elseif (ARCH_RISCV64)
list(APPEND REQUIRED_LLVM_LIBRARIES LLVMRISCVInfo LLVMRISCVDesc LLVMRISCVCodeGen)
elseif (ARCH_LOONGARCH64)
list(APPEND REQUIRED_LLVM_LIBRARIES LLVMLoongArchInfo LLVMLoongArchDesc LLVMLoongArchCodeGen)
endif()
if (ENABLE_XRAY)
list(APPEND REQUIRED_LLVM_LIBRARIES LLVMXRay)
endif()
endif()
add_library(_llvm INTERFACE)
target_link_libraries(_llvm INTERFACE ${REQUIRED_LLVM_LIBRARIES})
target_include_directories(_llvm SYSTEM BEFORE INTERFACE ${LLVM_INCLUDE_DIRS})
add_library(ch_contrib::llvm ALIAS _llvm)