PKGNAME=llvm-runtime-22
PKGSEC=libs
PKGDEP="gcc-runtime libedit libffi ncurses zlib"
BUILDDEP="swig doxygen ocaml findlib llvm-22"
BUILDDEP__RETRO="llvm"
BUILDDEP__ARMV4="${BUILDDEP__RETRO}"
BUILDDEP__ARMV6HF="${BUILDDEP__RETRO}"
BUILDDEP__ARMV7HF="${BUILDDEP__RETRO}"
BUILDDEP__I486="${BUILDDEP__RETRO}"
BUILDDEP__LOONGSON2F="${BUILDDEP__RETRO}"
BUILDDEP__POWERPC="${BUILDDEP__RETRO}"
BUILDDEP__PPC64="${BUILDDEP__RETRO}"
PKGDES="Low Level Virtual Machine Infrastructure (runtime libraries, version 22)"

AB_FLAGS_O3=1
# Note: For size.
AB_FLAGS_O3__RETRO=0

# FIXME: Fails to link with LTO enabled.
#
# /usr/bin/ld.bfd: /tmp/ccT9v8pZ.ltrans62.ltrans.o: in function `llvm::AsmPrinter::getOrCreateGCPrinter(llvm::GCStrategy&)':
# [...]/llvm-project-22.1.6.src/llvm/include/llvm/Support/Registry.h:111:(.text._ZN4llvm10AsmPrinter20getOrCreateGCPrinterERNS_10GCStrategyE+0x198): undefined reference to `llvm::Registry<llvm::GCMetadataPrinter>::Head'
# /usr/bin/ld.bfd: /tmp/ccT9v8pZ.ltrans62.ltrans.o:[...]/llvm-project-22.1.6.src/llvm/include/llvm/Support/Registry.h:111:(.text._ZN4llvm10AsmPrinter20getOrCreateGCPrinterERNS_10GCStrategyE+0x19c): undefined reference to `llvm::Registry<llvm::GCMetadataPrinter>::Head'
# collect2: error: ld returned 1 exit status
NOLTO=1

USECLANG=1

# FIXME: With debuginfo, the binaries are too large to link on many
# 32-bit architectures.
ABSPLITDBG__RETRO=0

# Figure out which feature/module to enable
_LLVM_MIN_SET="clang" # for Afterglow and other new ports
_LLVM_BASE_SET="${_LLVM_MIN_SET};lld;lldb;clang-tools-extra;polly" # for main-T2 arch (e.g. loongson3, riscv64 ...)
_LLVM_FULL_SET="${_LLVM_BASE_SET};mlir;bolt;flang" # for main-T1 arch (e.g. amd64, arm64 ...)

_LLVM_MIN_RUNTIME_SET="libunwind" # for Afterglow and other new ports
_LLVM_BASE_RUNTIME_SET="${_LLVM_MIN_RUNTIME_SET};libcxx;libcxxabi;compiler-rt;offload;openmp"
_LLVM_FULL_RUNTIME_SET="${_LLVM_BASE_RUNTIME_SET}"

CMAKE_AFTER=(
    '-DLLVM_BUILD_LLVM_DYLIB=ON'
    '-DLLVM_DYLIB_EXPORT_ALL=ON'
    '-DLLVM_LINK_LLVM_DYLIB=ON'
    '-DLLVM_ENABLE_RTTI=ON'
    '-DLLVM_ENABLE_FFI=ON'
    '-DLLVM_BUILD_DOCS=OFF'
    '-DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=OFF'
    "-DFFI_INCLUDE_DIR=$(pkg-config --variable=includedir libffi)"
    '-DLLVM_BINUTILS_INCDIR=/usr/include'
    '-DLLVM_INSTALL_UTILS=ON'
    '-DLLVM_INCLUDE_TESTS=OFF'
    '-DLLVM_USE_LINKER=lld'
    '-DINSTALL_WITH_TOOLCHAIN=ON'
    '-DCLANG_DEFAULT_PIE_ON_LINUX=ON'
)
CMAKE_AFTER__BASE=(
    "${CMAKE_AFTER[@]}"
    '-DLIBOMPTARGET_ENABLE_DEBUG=ON'
    "-DLLVM_ENABLE_PROJECTS=${_LLVM_BASE_SET}"
    "-DLLVM_ENABLE_RUNTIMES=${_LLVM_BASE_RUNTIME_SET}"
    '-DOPENMP_ENABLE_LIBOMP_PROFILING=ON'
)
CMAKE_AFTER__FULL=(
    "${CMAKE_AFTER[@]}"
    '-DLIBOMPTARGET_ENABLE_DEBUG=ON'
    "-DLLVM_ENABLE_PROJECTS=${_LLVM_FULL_SET}"
    "-DLLVM_ENABLE_RUNTIMES=${_LLVM_FULL_RUNTIME_SET}"
    '-DOPENMP_ENABLE_LIBOMP_PROFILING=ON'
)

CMAKE_AFTER__AMD64=(
    "${CMAKE_AFTER__FULL[@]}"
)
CMAKE_AFTER__ARM64=(
    "${CMAKE_AFTER__FULL[@]}"
)
CMAKE_AFTER__LOONGARCH64=(
    "${CMAKE_AFTER__FULL[@]}"
    '-DLLVM_PARALLEL_LINK_JOBS=2'
)
CMAKE_AFTER__LOONGARCH64_NOSIMD=(
    "${CMAKE_AFTER__LOONGARCH64[@]}"
)
CMAKE_AFTER__LOONGSON3=(
    "${CMAKE_AFTER[@]}"
    "-DLLVM_ENABLE_PROJECTS=${_LLVM_BASE_SET}"
    "-DLLVM_ENABLE_RUNTIMES=${_LLVM_BASE_RUNTIME_SET__LOONGSON3}"
    '-DLLVM_PARALLEL_LINK_JOBS=2'
)
CMAKE_AFTER__RISCV64=(
    "${CMAKE_AFTER__BASE[@]}"
    '-DLLVM_PARALLEL_LINK_JOBS=2'
)
CMAKE_AFTER__PPC64EL=(
    "${CMAKE_AFTER__BASE[@]}"
    '-DLLVM_PARALLEL_LINK_JOBS=2'
)

CMAKE_AFTER__RETRO=(
    "${CMAKE_AFTER[@]}"
    '-DLLVM_ENABLE_PROJECTS=${_LLVM_MIN_SET}'
    '-DLLVM_USE_LINKER=bfd'
)

PKGBREAK="${PKGBREAK} llvm-runtime<=18.1.8-1 llvm-runtime-18<=18.1.8-10"
PKGREP="llvm<=17.0.6-6 llvm-runtime<=18.1.8-1 llvm-runtime-18<=18.1.8-10"
