From a82ee3a5c388bcf8a7ce3ddbb718edc7f6853f38 Mon Sep 17 00:00:00 2001 From: karurochari Date: Thu, 6 Feb 2025 22:51:14 +0000 Subject: [PATCH 1/4] Initial code to support llvm-20 --- src/llvmheaders.h | 8 ++++++-- src/llvmheaders_190.h | 34 ++++++++++++++++++++++++++++++++++ src/llvmheaders_200.h | 34 ++++++++++++++++++++++++++++++++++ src/tcompiler.cpp | 18 ++++++++++++++++++ src/tcwrapper.cpp | 4 ++++ 5 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 src/llvmheaders_190.h create mode 100644 src/llvmheaders_200.h diff --git a/src/llvmheaders.h b/src/llvmheaders.h index 5a52588cb..ca2cea993 100644 --- a/src/llvmheaders.h +++ b/src/llvmheaders.h @@ -70,11 +70,15 @@ #include "llvmheaders_170.h" #elif LLVM_VERSION < 190 #include "llvmheaders_180.h" +#elif LLVM_VERSION < 200 +#include "llvmheaders_190.h" +#elif LLVM_VERSION < 210 +#include "llvmheaders_200.h" #else #error "unsupported LLVM version" // for OSX code completion -#define LLVM_VERSION 180 -#include "llvmheaders_180.h" +#define LLVM_VERSION 200 +#include "llvmheaders_200.h" #endif #define UNIQUEIFY(T, x) (std::unique_ptr(x)) diff --git a/src/llvmheaders_190.h b/src/llvmheaders_190.h new file mode 100644 index 000000000..348eff0f6 --- /dev/null +++ b/src/llvmheaders_190.h @@ -0,0 +1,34 @@ +#include "llvm/IR/CallingConv.h" +#include "llvm/IR/DerivedTypes.h" +#include "llvm/IR/LLVMContext.h" +#include "llvm/IR/Module.h" +#include "llvm/IR/IRBuilder.h" +#include "llvm/IR/DataLayout.h" +#include "llvm/IR/Instructions.h" +#include "llvm/IR/IntrinsicInst.h" +#include "llvm/IR/InlineAsm.h" +#include "llvm/Analysis/CallGraphSCCPass.h" +#include "llvm/Analysis/CallGraph.h" +#include "llvm/IR/DIBuilder.h" +#include "llvm/IR/DebugInfo.h" +#include "llvm/IR/Mangler.h" +//#include "llvm/ExecutionEngine/ObjectImage.h" +#include "llvm/IR/Verifier.h" +#include "llvm/Linker/Linker.h" +#include "llvm/IR/CFG.h" +#include "llvm/IR/InstVisitor.h" +#include "llvm/CodeGen/TargetSubtargetInfo.h" + +#include "llvm/Support/VirtualFileSystem.h" +#include "clang/Rewrite/Core/Rewriter.h" +#include "clang/Rewrite/Frontend/Rewriters.h" +#include "llvm/IR/DiagnosticPrinter.h" +#include "llvm/Analysis/TargetTransformInfo.h" +#include "llvm/Object/SymbolSize.h" + +#include "llvm/Bitcode/BitcodeReader.h" +#include "llvm/Support/Error.h" + +#define LLVM_PATH_TYPE std::string +#define RAW_FD_OSTREAM_NONE sys::fs::OF_None +#define RAW_FD_OSTREAM_BINARY sys::fs::OF_None diff --git a/src/llvmheaders_200.h b/src/llvmheaders_200.h new file mode 100644 index 000000000..348eff0f6 --- /dev/null +++ b/src/llvmheaders_200.h @@ -0,0 +1,34 @@ +#include "llvm/IR/CallingConv.h" +#include "llvm/IR/DerivedTypes.h" +#include "llvm/IR/LLVMContext.h" +#include "llvm/IR/Module.h" +#include "llvm/IR/IRBuilder.h" +#include "llvm/IR/DataLayout.h" +#include "llvm/IR/Instructions.h" +#include "llvm/IR/IntrinsicInst.h" +#include "llvm/IR/InlineAsm.h" +#include "llvm/Analysis/CallGraphSCCPass.h" +#include "llvm/Analysis/CallGraph.h" +#include "llvm/IR/DIBuilder.h" +#include "llvm/IR/DebugInfo.h" +#include "llvm/IR/Mangler.h" +//#include "llvm/ExecutionEngine/ObjectImage.h" +#include "llvm/IR/Verifier.h" +#include "llvm/Linker/Linker.h" +#include "llvm/IR/CFG.h" +#include "llvm/IR/InstVisitor.h" +#include "llvm/CodeGen/TargetSubtargetInfo.h" + +#include "llvm/Support/VirtualFileSystem.h" +#include "clang/Rewrite/Core/Rewriter.h" +#include "clang/Rewrite/Frontend/Rewriters.h" +#include "llvm/IR/DiagnosticPrinter.h" +#include "llvm/Analysis/TargetTransformInfo.h" +#include "llvm/Object/SymbolSize.h" + +#include "llvm/Bitcode/BitcodeReader.h" +#include "llvm/Support/Error.h" + +#define LLVM_PATH_TYPE std::string +#define RAW_FD_OSTREAM_NONE sys::fs::OF_None +#define RAW_FD_OSTREAM_BINARY sys::fs::OF_None diff --git a/src/tcompiler.cpp b/src/tcompiler.cpp index c0f920a0c..da4b744c6 100644 --- a/src/tcompiler.cpp +++ b/src/tcompiler.cpp @@ -223,14 +223,22 @@ bool OneTimeInit(struct terra_State *T) { // LLVM 3.1 doesn't enable avx even if it is present, we detect and force it here bool HostHasAVX() { +#if LLVM_VERSION < 190 StringMap Features; sys::getHostCPUFeatures(Features); +#else + StringMap Features = sys::getHostCPUFeatures(); +#endif return Features["avx"]; } bool HostHasAVX512() { +#if LLVM_VERSION < 190 StringMap Features; sys::getHostCPUFeatures(Features); +#else + StringMap Features = sys::getHostCPUFeatures(); +#endif // The following instructions sets are supported by Intel CPUs starting 2017 // (Skylake-SP and beyond) and AMD CPUs starting 2022 (Zen4 and beyond) const char *instruction_set[] = { @@ -3358,7 +3366,12 @@ struct FunctionEmitter { ValueToValueMapTy VMap; DebugInfoFinder DIFinder; BasicBlock *NewBB = +#if LLVM_VERSION < 20 CloneBasicBlock(BB, VMap, "defer", fstate->func, nullptr, &DIFinder); +#else + // TODO: Check if DIFinder needs to be used in a different function. + CloneBasicBlock(BB, VMap, "defer", fstate->func, nullptr); +#endif VMap[BB] = NewBB; BasicBlock::iterator oldII = BB->begin(); @@ -3740,8 +3753,13 @@ static void *JITGlobalValue(TerraCompilationUnit *CU, GlobalValue *gv) { ExecutionEngine *ee = CU->ee; if (gv->isDeclaration()) { StringRef name = gv->getName(); +#if LLVM_VERSION < 180 if (name.startswith("\01")) // remove asm renaming tag before looking for symbol name = name.substr(1); +#else + if (name.starts_with("\01")) // remove asm renaming tag before looking for symbol + name = name.substr(1); +#endif return ee->getPointerToNamedFunction(name); } void *ptr = GetGlobalValueAddress(CU, gv->getName()); diff --git a/src/tcwrapper.cpp b/src/tcwrapper.cpp index afaad2d3d..052d3a475 100644 --- a/src/tcwrapper.cpp +++ b/src/tcwrapper.cpp @@ -884,7 +884,11 @@ static void AddMacro(terra_State *T, Preprocessor &PP, const IdentifierInfo *II, double V; if (Literal.isFloatingLiteral()) { llvm::APFloat Result(0.0); +#if LLVM_VERSION < 190 Literal.GetFloatValue(Result); +#else + Literal.GetFloatValue(Result, llvm::RoundingMode::NearestTiesToEven); +#endif V = Result.convertToDouble(); } else { llvm::APInt Result(64, 0); From 786936b98a3b3b9eec6667b143cfe7e86c00d9da Mon Sep 17 00:00:00 2001 From: Elliott Slaughter Date: Fri, 7 Feb 2025 09:46:07 -0800 Subject: [PATCH 2/4] CI configuration for LLVM 19. --- .github/workflows/main.yml | 34 +++++++++++++++++++++------------- travis.sh | 8 +++++++- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 6b89340c4..d57acaa97 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -21,7 +21,7 @@ jobs: matrix: # Note: macOS 13 runs on x86 hardware, and 14 runs on M1 hardware os: ['macos-13', 'macos-14', 'windows-2022'] - llvm: ['11', '12', '13', '14', '15', '16', '17', '18'] + llvm: ['11', '12', '13', '14', '15', '16', '17', '18', '19'] cuda: ['0', '1'] lua: ['luajit', 'moonjit'] exclude: @@ -47,7 +47,7 @@ jobs: - os: 'macos-14' llvm: '15' - # Windows: exclude LLVM 12-18 + # Windows: exclude LLVM 12-19 - os: 'windows-2022' llvm: '12' - os: 'windows-2022' @@ -62,6 +62,8 @@ jobs: llvm: '17' - os: 'windows-2022' llvm: '18' + - os: 'windows-2022' + llvm: '19' # CUDA: only LLVM 11 - llvm: '12' @@ -78,6 +80,8 @@ jobs: cuda: '1' - llvm: '18' cuda: '1' + - llvm: '19' + cuda: '1' # Moonjit: only LLVM 12 - llvm: '11' @@ -94,6 +98,8 @@ jobs: lua: 'moonjit' - llvm: '18' lua: 'moonjit' + - llvm: '19' + lua: 'moonjit' steps: - uses: actions/checkout@v4 - run: ./travis.sh @@ -121,7 +127,6 @@ jobs: llvm: ['11', '12.0.1', '13.0.1', '14.0.6', '15.0.2', '16.0.3', '17.0.5', '18.1.7'] lua: ['luajit', 'moonjit'] cuda: ['0', '1'] - test: ['1'] exclude: # CUDA with LLVM 13 only: - llvm: '11' @@ -167,6 +172,15 @@ jobs: # Some additional configurations: + # LLVM 19 + - distro: 'ubuntu-20.04' + llvm: '19.1.7' + lua: 'luajit' + cuda: '0' + variant: 'prebuilt' + slib: '1' + static: '1' + # LLVM 12, 13, 14 on Ubuntu 22.04 - distro: 'ubuntu-22.04' llvm: '12' @@ -175,7 +189,6 @@ jobs: variant: 'package' slib: '1' static: '1' - test: '1' - distro: 'ubuntu-22.04' llvm: '13' lua: 'luajit' @@ -183,7 +196,6 @@ jobs: variant: 'package' slib: '1' static: '1' - test: '1' - distro: 'ubuntu-22.04' llvm: '14' lua: 'luajit' @@ -191,7 +203,6 @@ jobs: variant: 'package' slib: '1' static: '1' - test: '1' # LLVM 14, no-slib/no-static, Ubuntu 22.04 - distro: 'ubuntu-22.04' @@ -201,7 +212,6 @@ jobs: variant: 'package' slib: '0' static: '1' - test: '1' # - distro: 'ubuntu-22.04' # llvm: '14' # lua: 'luajit' @@ -209,7 +219,6 @@ jobs: # variant: 'package' # slib: '0' # static: '0' - # test: '1' steps: - uses: actions/checkout@v4 - run: ./travis.sh @@ -221,7 +230,7 @@ jobs: DOCKER_SLIB: ${{ matrix.slib }} DOCKER_CUDA: ${{ matrix.cuda }} DOCKER_VARIANT: ${{ matrix.variant }} - DOCKER_TEST: ${{ matrix.test }} + DOCKER_TEST: 1 multiarch: name: Multiarch (${{ matrix.distro }}, ${{ matrix.arch }}, llvm-${{ matrix.llvm }}, cuda=${{ matrix.cuda }}, ${{ matrix.variant }}) runs-on: ubuntu-latest @@ -232,7 +241,6 @@ jobs: llvm: ['11.1.0', '13.0.0'] variant: ['prebuilt'] cuda: ['0'] - test: ['0'] exclude: - arch: 'arm64' llvm: '13.0.0' @@ -247,7 +255,7 @@ jobs: DOCKER_LLVM: ${{ matrix.llvm }} DOCKER_CUDA: ${{ matrix.cuda }} DOCKER_VARIANT: ${{ matrix.variant }} - DOCKER_TEST: ${{ matrix.test }} + DOCKER_TEST: 0 - uses: actions/upload-artifact@v4 with: name: docker-${{ matrix.distro }}-${{ matrix.arch }}-llvm-${{ matrix.llvm }} @@ -259,10 +267,10 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - run: ./docker/compatibility_test.sh ubuntu 18.04 "18.04 20.04 22.04 24.04" "" 18.1.7 luajit prebuilt 2 + - run: ./docker/compatibility_test.sh ubuntu 20.04 "20.04 22.04 24.04" "" 19.1.7 luajit prebuilt 2 - uses: actions/upload-artifact@v4 with: - name: docker-ubuntu-18.04-x86_64-llvm-18 + name: docker-ubuntu-20.04-x86_64-llvm-19 path: | terra-*.tar.xz terra-*.7z diff --git a/travis.sh b/travis.sh index cf31bad6a..00fb7081e 100755 --- a/travis.sh +++ b/travis.sh @@ -34,7 +34,13 @@ if [[ $(uname) = Linux ]]; then exit 1 elif [[ $(uname) = Darwin ]]; then - if [[ $LLVM_VERSION = 18 ]]; then + if [[ $LLVM_VERSION = 19 ]]; then + curl -L -O https://github.com/terralang/llvm-build/releases/download/llvm-19.1.7/clang+llvm-19.1.7-${arch}-apple-darwin.tar.xz + tar xf clang+llvm-19.1.7-${arch}-apple-darwin.tar.xz + ln -s clang+llvm-19.1.7-${arch}-apple-darwin/bin/llvm-config llvm-config-17 + ln -s clang+llvm-19.1.7-${arch}-apple-darwin/bin/clang clang-17 + export CMAKE_PREFIX_PATH=$PWD/clang+llvm-19.1.7-${arch}-apple-darwin + elif [[ $LLVM_VERSION = 18 ]]; then curl -L -O https://github.com/terralang/llvm-build/releases/download/llvm-18.1.7/clang+llvm-18.1.7-${arch}-apple-darwin.tar.xz tar xf clang+llvm-18.1.7-${arch}-apple-darwin.tar.xz ln -s clang+llvm-18.1.7-${arch}-apple-darwin/bin/llvm-config llvm-config-17 From b9fcf2129ef5328f12354fba6ea55695f566b4df Mon Sep 17 00:00:00 2001 From: Elliott Slaughter Date: Fri, 7 Feb 2025 09:50:17 -0800 Subject: [PATCH 3/4] Test LLVM 19 in FreeBSD. --- .cirrus.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.cirrus.yml b/.cirrus.yml index cf7f97904..1a31d752f 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -2,7 +2,7 @@ freebsd_task: name: FreeBSD freebsd_instance: matrix: - image_family: freebsd-14-0 + image_family: freebsd-14-1 env: matrix: LLVM_VERSION: 11 @@ -13,6 +13,7 @@ freebsd_task: LLVM_VERSION: 16 LLVM_VERSION: 17 LLVM_VERSION: 18 + LLVM_VERSION: 19 install_script: pkg install -y bash coreutils cmake gmake llvm$LLVM_VERSION script: | export CC=cc From 6cb9edb39a4766b1877624035fef8aff5d587c8c Mon Sep 17 00:00:00 2001 From: Elliott Slaughter Date: Fri, 7 Feb 2025 10:59:50 -0800 Subject: [PATCH 4/4] LLVM 19 is incompatible with static library inclusion. --- .github/workflows/main.yml | 25 +++++++++++++++++++++++-- CMakeLists.txt | 9 ++++++++- cmake/Modules/ExtractLLVM.cmake | 6 +++--- 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index d57acaa97..08700860e 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -24,6 +24,7 @@ jobs: llvm: ['11', '12', '13', '14', '15', '16', '17', '18', '19'] cuda: ['0', '1'] lua: ['luajit', 'moonjit'] + slib: ['0', '1'] exclude: # macOS: exclude cuda - os: 'macos-13' @@ -100,6 +101,26 @@ jobs: lua: 'moonjit' - llvm: '19' lua: 'moonjit' + + # LLVM 19 is incompatible with SLIB_INCLUDE_LLVM + - llvm: '11' + slib: '0' + - llvm: '12' + slib: '0' + - llvm: '13' + slib: '0' + - llvm: '14' + slib: '0' + - llvm: '15' + slib: '0' + - llvm: '16' + slib: '0' + - llvm: '17' + slib: '0' + - llvm: '18' + slib: '0' + - llvm: '19' + slib: '1' steps: - uses: actions/checkout@v4 - run: ./travis.sh @@ -109,7 +130,7 @@ jobs: USE_CUDA: ${{ matrix.cuda }} STATIC_LLVM: 1 STATIC_LUAJIT: 1 - SLIB_INCLUDE_LLVM: 1 + SLIB_INCLUDE_LLVM: ${{ matrix.slib }} SLIB_INCLUDE_LUAJIT: 1 TERRA_LUA: ${{ matrix.lua }} - uses: actions/upload-artifact@v4 @@ -178,7 +199,7 @@ jobs: lua: 'luajit' cuda: '0' variant: 'prebuilt' - slib: '1' + slib: '0' static: '1' # LLVM 12, 13, 14 on Ubuntu 22.04 diff --git a/CMakeLists.txt b/CMakeLists.txt index cdc499233..20ebe3166 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,7 +17,7 @@ set(TERRA_ENABLE_CUDA ${CUDA_FOUND} CACHE BOOL "Build Terra with support for CUD if(DEFINED TERRA_STATIC_LINK_LLVM) set(DEFAULT_TERRA_SLIB_INCLUDE_LLVM ${TERRA_STATIC_LINK_LLVM}) else() - if(WIN32) + if(WIN32 OR LLVM_VERSION_MAJOR GREATER 18) set(DEFAULT_TERRA_SLIB_INCLUDE_LLVM OFF) else() set(DEFAULT_TERRA_SLIB_INCLUDE_LLVM ON) @@ -26,6 +26,13 @@ endif() set(TERRA_SLIB_INCLUDE_LLVM ${DEFAULT_TERRA_SLIB_INCLUDE_LLVM} CACHE BOOL "Include LLVM in Terra static libraries") set(TERRA_STATIC_LINK_LLVM ON CACHE BOOL "Statically link Terra against LLVM") +if(LLVM_VERSION_MAJOR GREATER 18) + set(DEFAULT_TERRA_WHOLE_ARCHIVE_LLVM OFF) +else() + set(DEFAULT_TERRA_WHOLE_ARCHIVE_LLVM ON) +endif() +set(TERRA_WHOLE_ARCHIVE_LLVM ${DEFAULT_TERRA_WHOLE_ARCHIVE_LLVM} CACHE BOOL "When statically linking LLVM, force inclusion of all objects") + if(TERRA_SLIB_INCLUDE_LLVM AND NOT TERRA_STATIC_LINK_LLVM) message(FATAL_ERROR "TERRA_SLIB_INCLUDE_LLVM requires TERRA_STATIC_LINK_LLVM to be set") endif() diff --git a/cmake/Modules/ExtractLLVM.cmake b/cmake/Modules/ExtractLLVM.cmake index 54f460029..f7cce5e3d 100644 --- a/cmake/Modules/ExtractLLVM.cmake +++ b/cmake/Modules/ExtractLLVM.cmake @@ -69,7 +69,7 @@ elseif(TERRA_STATIC_LINK_LLVM) endif() endforeach() - if(UNIX AND NOT APPLE) + if(UNIX AND NOT APPLE AND TERRA_WHOLE_ARCHIVE_LLVM) list(APPEND ALL_LLVM_LIBRARIES -Wl,-export-dynamic -Wl,--whole-archive @@ -77,14 +77,14 @@ elseif(TERRA_STATIC_LINK_LLVM) endif() foreach(LLVM_LIB_PATH ${LLVM_LIBRARIES} ${CLANG_LIBRARIES}) - if(APPLE) + if(APPLE AND TERRA_WHOLE_ARCHIVE_LLVM) list(APPEND ALL_LLVM_LIBRARIES "-Wl,-force_load,${LLVM_LIB_PATH}") else() list(APPEND ALL_LLVM_LIBRARIES "${LLVM_LIB_PATH}") endif() endforeach() - if(UNIX AND NOT APPLE) + if(UNIX AND NOT APPLE AND TERRA_WHOLE_ARCHIVE_LLVM) list(APPEND ALL_LLVM_LIBRARIES -Wl,--no-whole-archive )