Skip to content

V2.0.4

V2.0.4 #1449

Workflow file for this run

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"