PKGNAME=llvm-runtime-20
PKGSEC=libs
PKGDEP="gcc-runtime libedit libffi ncurses zlib"
BUILDDEP="swig doxygen ocaml findlib llvm"
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 20)"

AB_FLAGS_O3=1
AB_FLAGS_O3__RETRO=0
AB_FLAGS_O3__ARMV4="${AB_FLAGS_O3__RETRO}"
AB_FLAGS_O3__ARMV6HF="${AB_FLAGS_O3__RETRO}"
AB_FLAGS_O3__ARMV7HF="${AB_FLAGS_O3__RETRO}"
AB_FLAGS_O3__I486="${AB_FLAGS_O3__RETRO}"
AB_FLAGS_O3__LOONGSON2F="${AB_FLAGS_O3__RETRO}"
AB_FLAGS_O3__M68K="${AB_FLAGS_O3__RETRO}"
AB_FLAGS_O3__POWERPC="${AB_FLAGS_O3__RETRO}"
AB_FLAGS_O3__PPC64="${AB_FLAGS_O3__RETRO}"

USECLANG=1
USECLANG__ARMV4=0
USECLANG__ARMV6HF=0
USECLANG__LOONGSON2F=0
# FIXME: libLLVM-16.so linkage failure.
# relocation R_MIPS_TLS_TPREL_HI16 against `a local symbol' cannot be used
# when making a shared object; recompile with -fPIC.
USECLANG__LOONGSON3=0

NOLTO=1

ABSPLITDBG__RETRO=0
ABSPLITDBG__ARMV4="${ABSPLITDBG__RETRO}"
ABSPLITDBG__ARMV6HF="${ABSPLITDBG__RETRO}"
ABSPLITDBG__ARMV7HF="${ABSPLITDBG__RETRO}"
ABSPLITDBG__I486="${ABSPLITDBG__RETRO}"
ABSPLITDBG__LOONGSON2F="${ABSPLITDBG__RETRO}"
ABSPLITDBG__M68K="${ABSPLITDBG__RETRO}"
ABSPLITDBG__POWERPC="${ABSPLITDBG__RETRO}"
ABSPLITDBG__PPC64="${ABSPLITDBG__RETRO}"

# 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;libclc" # 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};pstl"
# FIXME: Runtime libraries does not build without lld.
_LLVM_BASE_RUNTIME_SET__LOONGSON3=""

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 \
             -DCLANG_DEFAULT_PIE_ON_LINUX=ON"
# Mainline
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/;polly/} \
             -DLLVM_USE_LINKER=bfd \
             -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 \
             -DLLVM_USE_LINKER="
CMAKE_AFTER__RISCV64="${CMAKE_AFTER__BASE} -DLLVM_PARALLEL_LINK_JOBS=2"
CMAKE_AFTER__PPC64EL="${CMAKE_AFTER__BASE} -DLLVM_PARALLEL_LINK_JOBS=2"

# Retro
CMAKE_AFTER__RETRO=" \
             -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_PROJECTS=${_LLVM_MIN_SET} \
             -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=bfd \
             -DCLANG_DEFAULT_PIE_ON_LINUX=ON"
CMAKE_AFTER__I486=" \
             ${CMAKE_AFTER__RETRO} \
             -DLLVM_ENABLE_PROJECTS=${_LLVM_MIN_SET};lld"

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

# Needed by Afterglow, whereas FAIL_ARCH defaults to mainline-only.
FAIL_ARCH="!(mainline|retro)"
