V2.0.4 #1449
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: CI | |
| on: | |
| pull_request: | |
| paths-ignore: | |
| - "documents/**" | |
| - "**.md" | |
| push: | |
| paths-ignore: | |
| - "documents/**" | |
| - "**.md" | |
| workflow_dispatch: | |
| jobs: | |
| # --------------------------------------------------------------------------- | |
| aarch64-apple-darwin: | |
| name: macOS (aarch64) | |
| runs-on: macos-latest | |
| strategy: | |
| matrix: | |
| mode: ["debug"] | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Setup xmake | |
| uses: xmake-io/github-action-setup-xmake@v1 | |
| - name: Setup LLVM (Homebrew) | |
| run: | | |
| brew install llvm | |
| brew install lld | |
| echo "$(brew --prefix llvm)/bin" >> "$GITHUB_PATH" | |
| - name: Work around LLVM libc++ header bug | |
| run: python3 tools/ci/patch_llvm_libcxx_hash_memory.py --llvm-prefix "$(brew --prefix llvm)" | |
| - name: Configure | |
| run: xmake f -m ${{ matrix.mode }} --march=none --use-llvm-compiler=y --sdk="$(brew --prefix llvm)" --static=none | |
| - name: Build | |
| run: | | |
| xmake b -rv | |
| export UBSAN_OPTIONS=halt_on_error=1:print_stacktrace=1 | |
| - name: Check UWVM version | |
| run: xmake run uwvm --version | |
| - name: Unit tests | |
| run: xmake test -v | |
| # --------------------------------------------------------------------------- | |
| x86_64-linux-gnu: | |
| name: Linux (x86_64) | |
| runs-on: ubuntu-latest | |
| strategy: | |
| matrix: | |
| mode: ["debug"] | |
| policies: | |
| [ | |
| "build.sanitizer.address,build.sanitizer.leak,build.sanitizer.undefined", | |
| ] | |
| cxx_flags: [ | |
| "", # SSE2 | |
| "-msse3", # SSE2 SSE3 | |
| "-mssse3", # SSE2 SSE3 SSSE3 | |
| "-msse4 -mbmi -mbmi2", # SSE2 SSE3 SSSE3 SSE4.1 SSE4.2 BMI BMI2 | |
| "-mavx -mbmi -mbmi2 -mprfchw", # SSE2 SSE3 SSSE3 SSE4.1 SSE4.2 AVX BMI BMI2 | |
| "-mavx2 -mbmi -mbmi2 -mprfchw" # SSE2 SSE3 SSSE3 SSE4.1 SSE4.2 AVX AVX2 BMI BMI2 | |
| # "-mavx512bw -mbmi -mbmi2 -mprfchw", # SSE2 SSE3 SSSE3 SSE4.1 SSE4.2 AVX AVX2 AVX512F AVX512BW BMI BMI2 | |
| # "-mavx512vbmi -mavx512vbmi2 -mbmi -mbmi2 -mprfchw" # SSE2 SSE3 SSSE3 SSE4.1 SSE4.2 AVX AVX2 AVX512F AVX512BW AVX512VBMI AVX512VBMI2 BMI BMI2 | |
| # "-mavx10.2 -mbmi -mbmi2 -mprfchw" | |
| # "-mapxf -mavx10.2 -mbmi -mbmi2 -mprfchw" | |
| ] | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Setup | |
| run: | | |
| CODENAME=$(lsb_release -cs) | |
| wget -qO- https://apt.llvm.org/llvm-snapshot.gpg.key | sudo tee /etc/apt/trusted.gpg.d/llvm.asc | |
| sudo add-apt-repository ppa:xmake-io/xmake | |
| sudo add-apt-repository "deb http://apt.llvm.org/$CODENAME/ llvm-toolchain-$CODENAME main" | |
| sudo apt-get install llvm-23-dev clang-tools-23 lld-23 xmake | |
| - name: Configure | |
| run: | | |
| ln -s $(which clang++-23) clang++ | |
| ln -s $(which clang-23) clang | |
| ln -s $(which llvm-config-23) llvm-config | |
| export PATH=$PWD:$PATH | |
| xmake f -m debug --use-llvm-compiler=y -m ${{ matrix.mode }} --policies=${{ matrix.policies }} --march=none --cxflags="${{ matrix.cxx_flags }}" --test-libfuzzer=y --static=none | |
| - name: Build | |
| run: | | |
| xmake b -rv | |
| export UBSAN_OPTIONS=halt_on_error=1:print_stacktrace=1 | |
| - name: Check UWVM version | |
| run: xmake run uwvm --version | |
| - name: Unit tests | |
| run: xmake test -v | |
| # --------------------------------------------------------------------------- | |
| x86_64-linux-gnu-backend-tests: | |
| name: Linux (x86_64) uwvm-int + llvm-jit | |
| runs-on: ubuntu-latest | |
| env: | |
| XMAKE_JOBS: "4" | |
| ASAN_OPTIONS: detect_leaks=1:halt_on_error=1 | |
| LSAN_OPTIONS: print_suppressions=0 | |
| UBSAN_OPTIONS: halt_on_error=1:print_stacktrace=1 | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Setup | |
| run: | | |
| CODENAME=$(lsb_release -cs) | |
| wget -qO- https://apt.llvm.org/llvm-snapshot.gpg.key | sudo tee /etc/apt/trusted.gpg.d/llvm.asc | |
| sudo add-apt-repository ppa:xmake-io/xmake | |
| sudo add-apt-repository "deb http://apt.llvm.org/$CODENAME/ llvm-toolchain-$CODENAME main" | |
| sudo apt-get install llvm-23-dev clang-tools-23 lld-23 wabt xmake | |
| - name: Configure | |
| run: | | |
| mkdir -p .github/tools | |
| ln -sf "$(which clang++-23)" .github/tools/clang++ | |
| ln -sf "$(which clang-23)" .github/tools/clang | |
| ln -sf "$(which llvm-config-23)" .github/tools/llvm-config | |
| echo "$PWD/.github/tools" >> "$GITHUB_PATH" | |
| export PATH="$PWD/.github/tools:$PATH" | |
| xmake f -m debug \ | |
| --use-llvm-compiler=y \ | |
| --policies=build.sanitizer.address,build.sanitizer.leak,build.sanitizer.undefined \ | |
| --march=none \ | |
| --static=none \ | |
| --execution-int=uwvm-int \ | |
| --execution-jit=llvm \ | |
| --enable-test-uwvm-int=y \ | |
| --enable-test-llvm-jit=y \ | |
| --enable-test-backend-fuzzer=n \ | |
| --test-libfuzzer=n | |
| - name: Check UWVM version | |
| run: | | |
| xmake b -rv -j "${XMAKE_JOBS}" uwvm | |
| xmake run uwvm --version | |
| - name: Run uwvm-int lazy tests | |
| run: UWVM_XMAKE_JOBS="${XMAKE_JOBS}" bash test/0013.uwvm_int/lazy/run_lazy_full.sh | |
| - name: Run uwvm-int strict tests | |
| run: UWVM_XMAKE_JOBS="${XMAKE_JOBS}" bash test/0013.uwvm_int/strict/run_strict_basic_full.sh | |
| - name: Run llvm-jit tests | |
| run: UWVM_XMAKE_JOBS=1 bash test/0014.llvm_jit/run_llvm_jit_full.sh | |
| # --------------------------------------------------------------------------- | |
| x86_64-linux-gnu-sde-dmr: | |
| if: ${{ !always() }} | |
| name: Linux (x86_64, SDE DMR) | |
| runs-on: ubuntu-latest | |
| strategy: | |
| matrix: | |
| mode: ["debug"] | |
| policies: | |
| [ | |
| "build.sanitizer.address,build.sanitizer.leak,build.sanitizer.undefined", | |
| ] | |
| # Build binaries that use AVX-512 so they can be executed via Intel SDE. | |
| cxx_flags: [ | |
| "-mavx512bw -mbmi -mbmi2 -mprfchw", | |
| "-mavx512vbmi -mavx512vbmi2 -mbmi -mbmi2 -mprfchw", | |
| "-mavx10.2 -mbmi -mbmi2 -mprfchw", | |
| "-mapxf -mavx10.2 -mbmi -mbmi2 -mprfchw", | |
| ] | |
| sde_url: ["https://github.com/MacroModel/sde-temp/releases/download/sde1/sde-external-9.58.0-2025-06-16-lin.tar.xz"] | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Setup | |
| run: | | |
| CODENAME=$(lsb_release -cs) | |
| wget -qO- https://apt.llvm.org/llvm-snapshot.gpg.key | sudo tee /etc/apt/trusted.gpg.d/llvm.asc | |
| sudo add-apt-repository ppa:xmake-io/xmake | |
| sudo add-apt-repository "deb http://apt.llvm.org/$CODENAME/ llvm-toolchain-$CODENAME main" | |
| sudo apt-get install llvm-23-dev clang-tools-23 lld-23 xmake | |
| - name: Download Intel SDE | |
| run: | | |
| mkdir -p /opt/intel-sde | |
| curl -L "${{ matrix.sde_url }}" -o /tmp/sde.tar.xz | |
| tar -xf /tmp/sde.tar.xz -C /opt/intel-sde --strip-components=1 | |
| - name: Configure | |
| run: | | |
| ln -s $(which clang++-23) clang++ | |
| ln -s $(which clang-23) clang | |
| ln -s $(which llvm-config-23) llvm-config | |
| export PATH=$PWD:$PATH | |
| xmake f -m debug --use-llvm-compiler=y -m ${{ matrix.mode }} --policies=${{ matrix.policies }} --march=none --cxflags="${{ matrix.cxx_flags }}" --test-libfuzzer=y --static=none | |
| - name: Build | |
| run: | | |
| # Build all targets (including tests), but do not run them. | |
| xmake b -rva | |
| export UBSAN_OPTIONS=halt_on_error=1:print_stacktrace=1 | |
| - name: Check UWVM version (via SDE) | |
| run: | | |
| BIN_DIR="build/linux/x86_64/${{ matrix.mode }}" | |
| echo "Running uwvm from ${BIN_DIR} under SDE" | |
| /opt/intel-sde/sde64 -dmr -- "${BIN_DIR}/uwvm" --version | |
| - name: Run all test executables (via SDE) | |
| run: | | |
| BIN_DIR="build/linux/x86_64/${{ matrix.mode }}" | |
| echo "Building done, scanning tests to run under SDE from ${BIN_DIR}" | |
| if [ ! -d "${BIN_DIR}" ]; then | |
| echo "Binary directory ${BIN_DIR} does not exist" | |
| exit 1 | |
| fi | |
| # Iterate over all unit-test sources and run corresponding executables via SDE. | |
| # This mimics `xmake test` but avoids running through xmake/Lua itself. | |
| find test -type f -name '*.cc' | while IFS= read -r src; do | |
| # Skip libfuzzer tests; they are too heavy to fuzz under SDE. | |
| case "${src}" in | |
| *test/0009.libfuzzer/*) continue ;; | |
| esac | |
| name="$(basename "${src}" .cc)" | |
| exe="${BIN_DIR}/${name}" | |
| if [ -x "${exe}" ]; then | |
| echo "::group::Running ${name} under SDE" | |
| /opt/intel-sde/sde64 -dmr -- "${exe}" | |
| echo "::endgroup::" | |
| else | |
| echo "Executable ${exe} not found or not executable, skipping" | |
| fi | |
| done | |
| # --------------------------------------------------------------------------- | |
| x86_64-linux-gnu-tsan: | |
| name: Linux (x86_64) with thread sanitizer | |
| runs-on: ubuntu-latest | |
| strategy: | |
| matrix: | |
| mode: ["debug"] | |
| policies: | |
| [ | |
| "build.sanitizer.thread", | |
| ] | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Setup | |
| run: | | |
| CODENAME=$(lsb_release -cs) | |
| wget -qO- https://apt.llvm.org/llvm-snapshot.gpg.key | sudo tee /etc/apt/trusted.gpg.d/llvm.asc | |
| sudo add-apt-repository ppa:xmake-io/xmake | |
| sudo add-apt-repository "deb http://apt.llvm.org/$CODENAME/ llvm-toolchain-$CODENAME main" | |
| sudo apt-get install llvm-23-dev clang-tools-23 lld-23 xmake | |
| - name: Configure | |
| run: | | |
| ln -s $(which clang++-23) clang++ | |
| ln -s $(which clang-23) clang | |
| ln -s $(which llvm-config-23) llvm-config | |
| export PATH=$PWD:$PATH | |
| xmake f -m debug --use-llvm-compiler=y -m ${{ matrix.mode }} --policies=${{ matrix.policies }} --march=none --static=none | |
| - name: Build | |
| run: xmake b -rv | |
| - name: Check UWVM version | |
| run: xmake run uwvm --version | |
| - name: Unit tests | |
| run: xmake test -v | |
| # --------------------------------------------------------------------------- | |
| x86_64-linux-gnu-module: | |
| name: Linux (x86_64) with C++ module | |
| if: ${{ !always() }} | |
| runs-on: ubuntu-latest | |
| strategy: | |
| matrix: | |
| mode: ["debug"] | |
| policies: | |
| [ | |
| "build.sanitizer.address,build.sanitizer.leak,build.sanitizer.undefined", | |
| ] | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Setup | |
| run: | | |
| CODENAME=$(lsb_release -cs) | |
| wget -qO- https://apt.llvm.org/llvm-snapshot.gpg.key | sudo tee /etc/apt/trusted.gpg.d/llvm.asc | |
| sudo add-apt-repository ppa:xmake-io/xmake | |
| sudo add-apt-repository "deb http://apt.llvm.org/$CODENAME/ llvm-toolchain-$CODENAME main" | |
| sudo apt-get install llvm-23-dev clang-tools-23 lld-23 xmake | |
| - name: Configure | |
| run: | | |
| ln -s $(which clang++-23) clang++ | |
| ln -s $(which clang-23) clang | |
| ln -s $(which llvm-config-23) llvm-config | |
| export PATH=$PWD:$PATH | |
| xmake f -m debug --use-llvm-compiler=y -m ${{ matrix.mode }} --policies=${{ matrix.policies }} --use-cxx-module=y --static=none | |
| - name: Build | |
| run: | | |
| xmake b -rv | |
| export UBSAN_OPTIONS=halt_on_error=1:print_stacktrace=1 | |
| - name: Check UWVM version | |
| run: xmake run uwvm --version | |
| # --------------------------------------------------------------------------- | |
| x86_64-windows-gnu: | |
| if: ${{ !always() }} | |
| name: Windows MINGW (x86_64) ${{ matrix.env.name }} | |
| strategy: | |
| matrix: | |
| env: | |
| - name: "CLANG64" | |
| prefix: mingw-w64-clang-x86_64 | |
| os: windows-latest | |
| #- name: "CLANGARM64" | |
| # prefix: mingw-w64-clang-aarch64 | |
| # os: windows-11-arm | |
| mode: ["debug"] | |
| policies: ["build.sanitizer.address"] | |
| winver: [ | |
| "WIN10", # NT 10.x (Win10/Win11/WS16/WS19/WS22/WS25) | |
| "WINBLUE", # NT 6.3 (Win8.1/WS12R2) | |
| "WIN8", # NT 6.2 (Win8/WS12) | |
| "WIN7", # NT 6.1 (Win7/WS08R2) | |
| "VISTA", # NT 6.0 (Vista/WS08) | |
| "WINXP64", # NT 5.2 (WS03/WinXP x64) | |
| "WINXP", # NT 5.1 (WinXP) | |
| "WIN2K", # NT 5.0 (Win2000/WS2K) | |
| "NT400", # NT 4.0 (unverified) | |
| "NT351", # NT 3.51 (unverified) | |
| "NT350", # NT 3.50 (unverified) | |
| "NT310", # NT 3.10 (closest to NT 3.0, unverified) | |
| "WINME", # Win9x 4.90 | |
| "WIN98", # Win9x 4.10 | |
| "WIN95" # Win9x 4.00 | |
| ] | |
| runs-on: ${{ matrix.env.os }} | |
| defaults: | |
| run: | |
| shell: msys2 {0} | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: msys2/setup-msys2@v2 | |
| with: | |
| msystem: ${{ matrix.env.name }} | |
| update: true | |
| install: | | |
| ${{ matrix.env.prefix }}-cc | |
| ${{ matrix.env.prefix }}-xmake | |
| - name: Configure | |
| run: xmake f -p mingw --use-llvm-compiler=y -m ${{ matrix.mode }} --policies=${{ matrix.policies }} --mingw-min=${{ matrix.winver }} --static=compiler | |
| - name: Build | |
| run: xmake b -rv | |
| - name: Check UWVM version | |
| run: xmake run uwvm --version | |
| - name: Unit tests | |
| run: xmake test -v | |
| # --------------------------------------------------------------------------- | |
| i686-windows-gnu: | |
| if: ${{ !always() }} | |
| name: Windows MINGW (i686) ${{ matrix.env.name }} | |
| strategy: | |
| matrix: | |
| env: | |
| - name: "CLANG64" | |
| prefix: mingw-w64-clang-x86_64 | |
| os: windows-latest | |
| #- name: "CLANGARM64" | |
| # prefix: mingw-w64-clang-aarch64 | |
| # os: windows-11-arm | |
| mode: ["debug"] | |
| policies: ["build.sanitizer.address"] | |
| winver: ["WIN10"] | |
| runs-on: ${{ matrix.env.os }} | |
| defaults: | |
| run: | |
| shell: msys2 {0} | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: msys2/setup-msys2@v2 | |
| with: | |
| msystem: ${{ matrix.env.name }} | |
| update: true | |
| install: | | |
| ${{ matrix.env.prefix }}-cc | |
| ${{ matrix.env.prefix }}-xmake | |
| - name: Configure | |
| run: xmake f -p mingw --use-llvm-compiler=y -m ${{ matrix.mode }} --policies=${{ matrix.policies }} --mingw-min=${{ matrix.winver }} -a i686 --static=compiler | |
| - name: Build | |
| run: xmake b -rv | |
| - name: Check UWVM version | |
| run: xmake run uwvm --version | |
| - name: Unit tests | |
| run: xmake test -v | |
| # --------------------------------------------------------------------------- | |
| # todo aarch64-windows-gnu | |
| # --------------------------------------------------------------------------- | |
| x86_64-freebsd: | |
| name: FreeBSD (x86_64) ${{ matrix.compiler }} | |
| runs-on: ubuntu-latest | |
| env: | |
| version: "14.3" | |
| freebsd_vm_memory: "8G" | |
| freebsd_swapfile_mb: "2048" | |
| strategy: | |
| matrix: | |
| compiler: ["CLANG"] | |
| mode: ["debug"] | |
| policies: ["build.sanitizer.address,build.sanitizer.leak,build.sanitizer.undefined"] | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Prepare | |
| uses: cross-platform-actions/action@v0.30.0 | |
| with: | |
| operating_system: freebsd | |
| version: ${{ env.version }} | |
| memory: ${{ env.freebsd_vm_memory }} | |
| run: | | |
| sudo mkdir -p /usr/local/etc/repos | |
| sudo tee /usr/local/etc/repos/FreeBSD.conf << EOF | |
| FreeBSD: { enabled: false } | |
| FreeBSD-latest: { | |
| url: "pkg+https://pkg.freebsd.org/${ABI}/latest", | |
| mirror_type: "srv", | |
| signature: "fingerprints", | |
| fingerprints: "/usr/share/keys/pkg", | |
| enabled: yes | |
| } | |
| EOF | |
| - name: Configure | |
| if: matrix.compiler == 'CLANG' | |
| uses: cross-platform-actions/action@v0.30.0 | |
| with: | |
| operating_system: freebsd | |
| version: ${{ env.version }} | |
| memory: ${{ env.freebsd_vm_memory }} | |
| run: | | |
| bash -c "sudo pkg install -y llvm21 gmake unzip libunwind" | |
| bash -c "sudo pkg clean -ay" | |
| bash -c "sudo ln -sf $(command -v llvm-config21) /usr/local/bin/llvm-config" | |
| bash -c "curl -fsSL https://raw.githubusercontent.com/tboox/xmake/master/scripts/get.sh -o xmake-get.sh" | |
| bash -c "bash xmake-get.sh" | |
| bash -c "source ~/.xmake/profile && xmake f -y -m ${{ matrix.mode }} --policies=${{ matrix.policies }} --use-llvm-compiler=y --sdk="$(llvm-config21 --prefix)" --march=none --static=none --strip=symbol --cxflags=-g1 --includedirs=/usr/local/include --linkdirs=/usr/local/lib --syslinks=unwind" | |
| - name: Configure | |
| if: matrix.compiler == 'GCC' | |
| uses: cross-platform-actions/action@v0.30.0 | |
| with: | |
| operating_system: freebsd | |
| version: ${{ env.version }} | |
| memory: ${{ env.freebsd_vm_memory }} | |
| run: | | |
| bash -c "sudo pkg install -y gcc16-devel gmake unzip" | |
| bash -c "sudo pkg clean -ay" | |
| bash -c "curl -fsSL https://raw.githubusercontent.com/tboox/xmake/master/scripts/get.sh -o xmake-get.sh" | |
| bash -c "bash xmake-get.sh" | |
| bash -c "source ~/.xmake/profile && xmake f -y -m ${{ matrix.mode }} --policies=${{ matrix.policies }} --cc=gcc16 --cxx=g++16 --ld=g++16 --march=none --static=none --strip=symbol --cxflags=-g1" | |
| - name: Build and check | |
| uses: cross-platform-actions/action@v0.30.0 | |
| with: | |
| operating_system: freebsd | |
| version: ${{ env.version }} | |
| memory: ${{ env.freebsd_vm_memory }} | |
| run: | | |
| bash <<'FREEBSD_CI_SWAP' | |
| set -eux | |
| swapfile=/usr/swap0 | |
| sudo dd if=/dev/zero of="${swapfile}" bs=1m count=${{ env.freebsd_swapfile_mb }} | |
| sudo chmod 0600 "${swapfile}" | |
| swapdev="$(sudo mdconfig -a -t vnode -f "${swapfile}")" | |
| case "${swapdev}" in | |
| /dev/*) ;; | |
| md*) swapdev="/dev/${swapdev}" ;; | |
| *) swapdev="/dev/md${swapdev}" ;; | |
| esac | |
| sudo swapon "${swapdev}" | |
| swapinfo | |
| df -h / /usr || true | |
| FREEBSD_CI_SWAP | |
| bash -c "source ~/.xmake/profile && xmake b -rv -j1 || { rc=\$?; swapinfo || true; df -h / /usr || true; dmesg | tail -n 80 || true; exit \$rc; }" | |
| bash -c "source ~/.xmake/profile && export UBSAN_OPTIONS=halt_on_error=1:print_stacktrace=1 && xmake run uwvm --version" | |
| bash -c "source ~/.xmake/profile && xmake clean -y uwvm || true" | |
| bash -c "source ~/.xmake/profile && xmake clean -y uwvm_runtime || true" | |
| bash -c "df -h / /usr || true" | |
| bash -c "source ~/.xmake/profile && export UBSAN_OPTIONS=halt_on_error=1:print_stacktrace=1 && xmake test -v -j1" |