Add force-amo feature (portable_atomic_force_amo cfg) #2692
Workflow file for this run
This file contains 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 | |
permissions: | |
contents: read | |
on: | |
pull_request: | |
push: | |
branches: | |
- main | |
- dev | |
schedule: | |
- cron: '0 2 * * *' | |
workflow_dispatch: | |
env: | |
CARGO_INCREMENTAL: 0 | |
CARGO_NET_GIT_FETCH_WITH_CLI: true | |
CARGO_NET_RETRY: 10 | |
CARGO_TERM_COLOR: always | |
RUST_BACKTRACE: 1 | |
RUST_TEST_THREADS: 1 | |
RUSTDOCFLAGS: -D warnings | |
RUSTFLAGS: -D warnings | |
RUSTUP_MAX_RETRIES: 10 | |
# NB: sync with: | |
# - docs.rs metadata in Cargo.toml | |
# - test_features list in tools/build.sh and tools/test.sh. | |
TEST_FEATURES: float,std,serde,critical-section | |
defaults: | |
run: | |
shell: bash | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} | |
cancel-in-progress: true | |
jobs: | |
check-external-types: | |
uses: taiki-e/github-actions/.github/workflows/check-external-types.yml@main | |
deny: | |
uses: taiki-e/github-actions/.github/workflows/deny.yml@main | |
docs: | |
uses: taiki-e/github-actions/.github/workflows/docs.yml@main | |
with: | |
target: x86_64-unknown-linux-gnu,aarch64-unknown-linux-gnu,powerpc64le-unknown-linux-gnu,s390x-unknown-linux-gnu,armv5te-unknown-linux-gnueabi | |
msrv: | |
needs: tidy | |
uses: taiki-e/github-actions/.github/workflows/msrv.yml@main | |
with: | |
event_name: ${{ github.event_name }} | |
# NB: sync with env.TEST_FEATURES | |
# Exclude serde and critical-section features because the MSRV when it is enabled depends on the MSRV of them | |
args: --features float,std --ignore-unknown-features | |
tidy: | |
uses: taiki-e/github-actions/.github/workflows/tidy.yml@main | |
with: | |
# clippy is covered by TESTS=1 ./tools/build.sh | |
clippy: false | |
test: | |
needs: tidy | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
# LLVM version table: | |
# - LLVM 12: stable ? - 1.55, | |
# - LLVM 13: stable 1.56 - 1.59, - nightly-2022-02-17 (1.60) | |
# - LLVM 14: stable 1.60 - 1.64, nightly-2022-02-18 (1.60) - nightly-2022-08-12 (1.65) | |
# - LLVM 15: stable 1.65 - 1.69, nightly-2022-08-13 (1.65) - nightly-2023-03-25 (1.70) | |
# - LLVM 16: stable 1.70 - 1.72, nightly-2023-03-26 (1.70) - nightly-2023-08-08 (1.73) | |
# - LLVM 17: stable 1.73 - , nightly-2023-08-09 (1.73) - | |
- rust: '1.56' | |
- rust: '1.59' # LLVM 13 | |
# - rust: '1.64' # LLVM 14 | |
# - rust: '1.69' # LLVM 15 | |
# - rust: '1.72' # LLVM 16 | |
- rust: stable | |
- rust: beta | |
- rust: nightly | |
- rust: nightly | |
flags: -C panic=abort -Z panic_abort_tests | |
- rust: nightly | |
os: macos-latest | |
- rust: nightly | |
os: windows-latest | |
- rust: nightly-x86_64-pc-windows-gnu | |
os: windows-latest | |
- rust: nightly-i686-pc-windows-msvc | |
os: windows-latest | |
- rust: nightly-i686-pc-windows-gnu | |
os: windows-latest | |
- rust: '1.59' # LLVM 13 | |
target: aarch64-unknown-linux-gnu | |
# - rust: '1.64' # LLVM 14 | |
# target: aarch64-unknown-linux-gnu | |
# - rust: '1.69' # LLVM 15 | |
# target: aarch64-unknown-linux-gnu | |
# - rust: '1.72' # LLVM 16 | |
# target: aarch64-unknown-linux-gnu | |
- rust: stable | |
target: aarch64-unknown-linux-gnu | |
- rust: beta | |
target: aarch64-unknown-linux-gnu | |
- rust: nightly | |
target: aarch64-unknown-linux-gnu | |
- rust: nightly | |
target: aarch64_be-unknown-linux-gnu | |
- rust: stable | |
target: aarch64-unknown-linux-musl | |
- rust: stable | |
target: aarch64-unknown-linux-musl | |
flags: -C target-feature=-crt-static | |
- rust: nightly | |
target: aarch64-unknown-linux-musl | |
- rust: nightly | |
target: aarch64-unknown-linux-musl | |
flags: -C target-feature=-crt-static | |
- rust: stable | |
target: aarch64-linux-android | |
- rust: nightly | |
target: aarch64-linux-android | |
- rust: nightly | |
target: aarch64-pc-windows-gnullvm | |
- rust: '1.59' | |
target: armv5te-unknown-linux-gnueabi | |
- rust: stable | |
target: armv5te-unknown-linux-gnueabi | |
- rust: nightly | |
target: armv5te-unknown-linux-gnueabi | |
- rust: nightly | |
target: arm-unknown-linux-gnueabi | |
- rust: nightly | |
target: armv7-unknown-linux-gnueabi | |
- rust: nightly | |
target: armv7-unknown-linux-gnueabihf | |
- rust: nightly | |
target: armeb-unknown-linux-gnueabi | |
- rust: nightly | |
target: arm-linux-androideabi | |
- rust: nightly | |
target: i586-unknown-linux-gnu | |
- rust: '1.59' | |
target: i686-unknown-linux-gnu | |
- rust: stable | |
target: i686-unknown-linux-gnu | |
- rust: nightly | |
target: i686-unknown-linux-gnu | |
- rust: nightly | |
target: loongarch64-unknown-linux-gnu | |
- rust: nightly | |
target: mips-unknown-linux-gnu | |
- rust: nightly | |
target: mipsel-unknown-linux-gnu | |
- rust: nightly | |
target: mips64-unknown-linux-gnuabi64 | |
- rust: nightly | |
target: mips64el-unknown-linux-gnuabi64 | |
- rust: nightly-2023-07-18 # TODO: hang with LLVM 17 | |
target: mipsisa32r6-unknown-linux-gnu | |
- rust: nightly-2023-07-18 # TODO: hang with LLVM 17 | |
target: mipsisa32r6el-unknown-linux-gnu | |
- rust: nightly | |
target: mipsisa64r6-unknown-linux-gnuabi64 | |
- rust: nightly | |
target: mipsisa64r6el-unknown-linux-gnuabi64 | |
- rust: nightly | |
target: powerpc-unknown-linux-gnu | |
- rust: nightly | |
target: powerpc64-unknown-linux-gnu | |
# - rust: nightly-2023-08-08 # Rust 1.73, LLVM 16 | |
# target: powerpc64-unknown-linux-gnu | |
# - rust: nightly-2023-03-25 # Rust 1.70, LLVM 15 | |
# target: powerpc64-unknown-linux-gnu | |
# - rust: nightly-2022-08-12 # Rust 1.65, LLVM 14 | |
# target: powerpc64-unknown-linux-gnu | |
- rust: nightly-2022-02-13 # Rust 1.60, LLVM 13 (oldest version we can use asm_experimental_arch on this target) | |
target: powerpc64-unknown-linux-gnu | |
- rust: nightly | |
target: powerpc64le-unknown-linux-gnu | |
# - rust: nightly-2023-08-08 # Rust 1.73, LLVM 16 | |
# target: powerpc64le-unknown-linux-gnu | |
# - rust: nightly-2023-03-25 # Rust 1.70, LLVM 15 | |
# target: powerpc64le-unknown-linux-gnu | |
# - rust: nightly-2022-08-12 # Rust 1.65, LLVM 14 | |
# target: powerpc64le-unknown-linux-gnu | |
- rust: nightly-2022-02-13 # Rust 1.60, LLVM 13 (oldest version we can use asm_experimental_arch on this target) | |
target: powerpc64le-unknown-linux-gnu | |
- rust: nightly | |
target: riscv32gc-unknown-linux-gnu | |
- rust: '1.59' | |
target: riscv64gc-unknown-linux-gnu | |
- rust: stable | |
target: riscv64gc-unknown-linux-gnu | |
- rust: nightly | |
target: riscv64gc-unknown-linux-gnu | |
- rust: nightly | |
target: s390x-unknown-linux-gnu | |
- rust: nightly-2023-05-09 # Rust 1.71, LLVM 16 (oldest version we can use asm_experimental_arch on this target) | |
target: s390x-unknown-linux-gnu | |
- rust: nightly | |
target: sparc64-unknown-linux-gnu | |
- rust: nightly | |
target: thumbv7neon-unknown-linux-gnueabihf | |
runs-on: ${{ matrix.os || 'ubuntu-latest' }} | |
timeout-minutes: 60 | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
persist-credentials: false | |
- run: | | |
lscpu | |
# sudo apt-get -o Acquire::Retries=10 -qq update && sudo apt-get -o Acquire::Retries=10 -o Dpkg::Use-Pty=0 install -y --no-install-recommends moreutils | |
if: startsWith(matrix.os, 'ubuntu') || matrix.os == '' | |
- run: | | |
sysctl hw.optional machdep.cpu | |
# brew install moreutils | |
if: startsWith(matrix.os, 'macos') | |
# - run: | | |
# C:/msys64/usr/bin/pacman -S --noconfirm moreutils | |
# if: startsWith(matrix.os, 'windows') | |
- name: Install Rust | |
run: rustup toolchain add ${{ matrix.rust }} --no-self-update && rustup default ${{ matrix.rust }} | |
- run: rustup toolchain add nightly --no-self-update | |
- uses: taiki-e/install-action@cargo-hack | |
- uses: taiki-e/install-action@cargo-minimal-versions | |
- uses: taiki-e/install-action@cargo-careful | |
if: startsWith(matrix.rust, 'nightly') | |
- uses: taiki-e/setup-cross-toolchain-action@v1 | |
with: | |
target: ${{ matrix.target }} | |
if: matrix.target != '' | |
- run: echo "RUSTFLAGS=${RUSTFLAGS} --cfg qemu" >>"${GITHUB_ENV}" | |
if: matrix.target != '' && !startsWith(matrix.target, 'i686') && !startsWith(matrix.target, 'x86_64') | |
- run: | | |
echo "RUSTFLAGS=${RUSTFLAGS} ${{ matrix.flags }}" >>"${GITHUB_ENV}" | |
echo "RUSTDOCFLAGS=${RUSTDOCFLAGS} ${{ matrix.flags }}" >>"${GITHUB_ENV}" | |
if: matrix.flags != '' | |
- run: echo "TARGET=--target=${{ matrix.target }}" >>"${GITHUB_ENV}" | |
if: matrix.target != '' | |
# TODO: LLVM bug: Undefined temporary symbol error when building std. | |
- run: echo "RELEASE=--release" >>"${GITHUB_ENV}" | |
if: startsWith(matrix.target, 'mips-') || startsWith(matrix.target, 'mipsel-') | |
- run: tools/test.sh -vv $TARGET $DOCTEST_XCOMPILE $BUILD_STD $RELEASE | |
# We test doctest only once with the default build conditions because doctest is slow. Both api-test | |
# and src/tests have extended copies of doctest, so this will not reduce test coverage. | |
- run: tools/test.sh -vv --tests $TARGET $BUILD_STD $RELEASE | |
env: | |
RUSTDOCFLAGS: ${{ env.RUSTDOCFLAGS }} --cfg portable_atomic_no_outline_atomics | |
RUSTFLAGS: ${{ env.RUSTFLAGS }} --cfg portable_atomic_no_outline_atomics | |
# outline-atomics is disabled by default on aarch64 musl with static linking | |
if: (matrix.target == '' && !contains(matrix.rust, 'i686') || startsWith(matrix.target, 'x86_64')) || startsWith(matrix.target, 'aarch64') && !(contains(matrix.target, '-musl') && matrix.flags == '') || startsWith(matrix.target, 'armv5te') || matrix.target == 'arm-linux-androideabi' | |
- run: tools/test.sh -vv --tests $TARGET $BUILD_STD $RELEASE | |
env: | |
# Note: detect_false cfg is intended to make it easy for portable-atomic developers to | |
# test cases such as has_cmpxchg16b == false, has_lse == false, | |
# __kuser_helper_version < 5, etc., and is not a public API. | |
RUSTDOCFLAGS: ${{ env.RUSTDOCFLAGS }} --cfg portable_atomic_test_outline_atomics_detect_false | |
RUSTFLAGS: ${{ env.RUSTFLAGS }} --cfg portable_atomic_test_outline_atomics_detect_false | |
# outline-atomics is disabled by default on aarch64 musl with static linking | |
if: (matrix.target == '' && !contains(matrix.rust, 'i686') || startsWith(matrix.target, 'x86_64')) || startsWith(matrix.target, 'aarch64') && !(contains(matrix.target, '-musl') && matrix.flags == '') || startsWith(matrix.target, 'armv5te') || matrix.target == 'arm-linux-androideabi' | |
# outline-atomics is disabled by default on aarch64 musl with static linking and powerpc64 | |
# powerpc64le- (little-endian) is skipped because it is pwr8 by default | |
- run: tools/test.sh -vv --tests $TARGET $BUILD_STD $RELEASE | |
env: | |
RUSTDOCFLAGS: ${{ env.RUSTDOCFLAGS }} --cfg portable_atomic_outline_atomics | |
RUSTFLAGS: ${{ env.RUSTFLAGS }} --cfg portable_atomic_outline_atomics | |
if: startsWith(matrix.target, 'aarch64') && contains(matrix.target, '-musl') && matrix.flags == '' || startsWith(matrix.target, 'powerpc64-') | |
- run: tools/test.sh -vv --tests $TARGET $BUILD_STD $RELEASE | |
env: | |
# Note: detect_false cfg is intended to make it easy for portable-atomic developers to | |
# test cases such as has_cmpxchg16b == false, has_lse == false, | |
# __kuser_helper_version < 5, etc., and is not a public API. | |
RUSTDOCFLAGS: ${{ env.RUSTDOCFLAGS }} --cfg portable_atomic_outline_atomics --cfg portable_atomic_test_outline_atomics_detect_false | |
RUSTFLAGS: ${{ env.RUSTFLAGS }} --cfg portable_atomic_outline_atomics --cfg portable_atomic_test_outline_atomics_detect_false | |
if: startsWith(matrix.target, 'aarch64') && contains(matrix.target, '-musl') && matrix.flags == '' || startsWith(matrix.target, 'powerpc64-') | |
# x86_64 +cmpxchg16b | |
- run: tools/test.sh -vv --tests $TARGET $BUILD_STD $RELEASE | |
env: | |
# cmpxchg16b + outline-atomics (vmovdqa load/store) path is tested in first 2 runs on macOS. | |
RUSTDOCFLAGS: ${{ env.RUSTDOCFLAGS }} -C target-feature=+cmpxchg16b --cfg portable_atomic_no_outline_atomics | |
RUSTFLAGS: ${{ env.RUSTFLAGS }} -C target-feature=+cmpxchg16b --cfg portable_atomic_no_outline_atomics | |
if: matrix.target == '' && !contains(matrix.rust, 'i686') || startsWith(matrix.target, 'x86_64') | |
# aarch64 +lse | |
- run: tools/test.sh -vv --tests $TARGET $BUILD_STD $RELEASE | |
env: | |
RUSTDOCFLAGS: ${{ env.RUSTDOCFLAGS }} -C target-feature=+lse | |
RUSTFLAGS: ${{ env.RUSTFLAGS }} -C target-feature=+lse | |
# QEMU + Wine is slow so test only cases where OS-specific code is called. | |
if: startsWith(matrix.target, 'aarch64') && matrix.target != 'aarch64-pc-windows-gnullvm' | |
# aarch64 +lse,+lse2 | |
- run: tools/test.sh -vv --tests $TARGET $BUILD_STD $RELEASE | |
env: | |
RUSTDOCFLAGS: ${{ env.RUSTDOCFLAGS }} -C target-feature=+lse,+lse2 | |
RUSTFLAGS: ${{ env.RUSTFLAGS }} -C target-feature=+lse,+lse2 | |
# QEMU + Wine is slow so test only cases where OS-specific code is called. | |
if: startsWith(matrix.target, 'aarch64') && matrix.target != 'aarch64-pc-windows-gnullvm' | |
# powerpc64 pwr7 | |
# powerpc64- (big-endian) is skipped because it is pre-pwr8 by default | |
- run: tools/test.sh -vv --tests $TARGET $BUILD_STD $RELEASE | |
env: | |
RUSTDOCFLAGS: ${{ env.RUSTDOCFLAGS }} -C target-cpu=pwr7 | |
RUSTFLAGS: ${{ env.RUSTFLAGS }} -C target-cpu=pwr7 | |
if: startsWith(matrix.target, 'powerpc64le-') | |
# powerpc64 pwr8 | |
# powerpc64le- (little-endian) is skipped because it is pwr8 by default | |
- run: tools/test.sh -vv --tests $TARGET $BUILD_STD $RELEASE | |
env: | |
RUSTDOCFLAGS: ${{ env.RUSTDOCFLAGS }} -C target-cpu=pwr8 | |
RUSTFLAGS: ${{ env.RUSTFLAGS }} -C target-cpu=pwr8 | |
if: startsWith(matrix.target, 'powerpc64-') | |
# s390x z196 (arch9) | |
- run: tools/test.sh -vv --tests $TARGET $BUILD_STD $RELEASE | |
env: | |
RUSTDOCFLAGS: ${{ env.RUSTDOCFLAGS }} -C target-cpu=z196 | |
RUSTFLAGS: ${{ env.RUSTFLAGS }} -C target-cpu=z196 | |
if: startsWith(matrix.target, 's390x') | |
# s390x z15 (arch13) | |
- run: tools/test.sh -vv --tests $TARGET $BUILD_STD $RELEASE | |
env: | |
# TODO: disable high-word LLVM target-feature to avoid LLVM codegen bug. | |
RUSTDOCFLAGS: ${{ env.RUSTDOCFLAGS }} -C target-cpu=z15 -C target-feature=-high-word | |
RUSTFLAGS: ${{ env.RUSTFLAGS }} -C target-cpu=z15 -C target-feature=-high-word | |
if: startsWith(matrix.target, 's390x') | |
# Skip targets that also checked by "build" job. | |
- run: tools/build.sh ${{ matrix.target || 'host' }} | |
env: | |
SKIP_DEFAULT_TARGET: 1 | |
- run: TESTS=1 tools/build.sh ${{ matrix.target || 'host' }} | |
env: | |
SKIP_DEFAULT_TARGET: 1 | |
- run: cargo minimal-versions build -vvv --workspace --no-private --features $TEST_FEATURES --ignore-unknown-features $TARGET $BUILD_STD $RELEASE | |
test-bsd: | |
needs: tidy | |
name: test (${{ matrix.target }}${{ matrix.version }}) | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
- target: aarch64-unknown-freebsd | |
os: freebsd | |
version: '12.4' | |
- target: aarch64-unknown-freebsd | |
os: freebsd | |
version: '13.2' | |
- target: aarch64-unknown-openbsd | |
os: openbsd | |
version: '7.3' | |
runs-on: ubuntu-latest | |
timeout-minutes: 60 | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
persist-credentials: false | |
- uses: taiki-e/cross-platform-actions-action@neoverse-v1 | |
with: | |
environment_variables: CARGO_INCREMENTAL CARGO_NET_RETRY CARGO_TERM_COLOR RUST_BACKTRACE RUST_TEST_THREADS RUSTDOCFLAGS RUSTFLAGS RUSTUP_MAX_RETRIES TEST_FEATURES | |
operating_system: ${{ matrix.os }} | |
architecture: aarch64 | |
version: ${{ matrix.version }} | |
shell: bash | |
run: | | |
set -eEuxo pipefail | |
export RUSTFLAGS="${RUSTFLAGS} --cfg qemu" | |
# AArch64 FreeBSD/OpenBSD are tier 3 targets, so install rust from package manager instead of rustup. | |
case "$(uname -s)" in | |
FreeBSD) sudo pkg install -y rust ;; | |
OpenBSD) | |
# As of OpenBSD 7.3, the built-in git library is very slow. | |
export CARGO_NET_GIT_FETCH_WITH_CLI=true | |
# OpenBSD 7.3's rustc version is 1.68, which sparse protocol is not default protocol. | |
export CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse | |
sudo pkg_add git rust | |
;; | |
esac | |
rustc -vV | |
cargo test --features std --tests -- aarch64 | |
build: | |
needs: tidy | |
name: build (${{ matrix.name || matrix.rust }}) | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
- rust: '1.34' | |
- rust: '1.59' | |
- rust: stable | |
- rust: beta | |
- rust: nightly | |
# The oldest nightly that can compile this crate is nightly-2019-01-27 | |
# which Atomic{I,U}{8,16,32,64} stabilized. | |
# https://github.com/rust-lang/rust/pull/57425 | |
# Note: Old nightly compilers are essentially fragile, so support for | |
# them is on a best-effort basis. | |
- rust: nightly-2019-01-27 | |
# https://github.com/taiki-e/portable-atomic/pull/52 | |
- rust: nightly-2020-06-21 | |
# for AVR: https://github.com/rust-lang/compiler-builtins/issues/400 | |
- rust: nightly-2020-12-26 | |
# Check that test suite can be built | |
- name: nightly, --tests | |
rust: nightly | |
tests: 1 | |
# Check that this crate can be built for all builtin targets | |
- name: stable, all tier1/tier2 | |
rust: stable | |
target-group: tier1/tier2 | |
# Skip targets that also checked by other matrix. | |
skip-default-target: 1 | |
- name: nightly, all tier1/tier2 | |
rust: nightly | |
target-group: tier1/tier2 | |
skip-default-target: 1 | |
- name: nightly, all tier3 | |
rust: nightly | |
target-group: tier3 | |
skip-default-target: 1 | |
runs-on: ubuntu-latest | |
timeout-minutes: 120 # TODO | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
persist-credentials: false | |
- uses: taiki-e/github-actions/free-device-space@main | |
if: matrix.target-group == '' | |
- name: Install Rust | |
run: rustup toolchain add ${{ matrix.rust }} --no-self-update && rustup default ${{ matrix.rust }} | |
- uses: taiki-e/install-action@cargo-hack | |
- run: tools/build.sh | |
env: | |
TESTS: ${{ matrix.tests }} | |
TARGET_GROUP: ${{ matrix.target-group }} | |
SKIP_DEFAULT_TARGET: ${{ matrix.skip-default-target }} | |
no-std: | |
needs: tidy | |
strategy: | |
fail-fast: false | |
matrix: | |
rust: | |
- '1.64' | |
- '1.72' | |
- stable | |
- nightly | |
runs-on: ubuntu-latest | |
timeout-minutes: 60 | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
persist-credentials: false | |
- name: Install Rust | |
run: rustup toolchain add ${{ matrix.rust }} --no-self-update && rustup default ${{ matrix.rust }} | |
- uses: taiki-e/install-action@cargo-hack | |
if: startsWith(matrix.rust, 'nightly') | |
- uses: taiki-e/install-action@v2 | |
with: | |
tool: espup | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
if: startsWith(matrix.rust, 'nightly') | |
- run: | | |
set -eEuxo pipefail | |
sudo apt-get -o Acquire::Retries=10 -qq update && sudo apt-get -o Acquire::Retries=10 -o Dpkg::Use-Pty=0 install -y --no-install-recommends \ | |
avr-libc \ | |
gcc-avr \ | |
qemu-system-arm \ | |
qemu-system-misc \ | |
simavr | |
# APT's qemu package doesn't provide firmware for riscv32: https://packages.ubuntu.com/en/jammy/all/qemu-system-data/filelist | |
OPENSBI_VERSION=1.3.1 # https://github.com/riscv-software-src/opensbi/releases | |
curl --proto '=https' --tlsv1.2 -fsSL --retry 10 --retry-connrefused "https://github.com/riscv-software-src/opensbi/releases/download/v${OPENSBI_VERSION}/opensbi-${OPENSBI_VERSION}-rv-bin.tar.xz" \ | |
| tar xJf - | |
sudo mv "opensbi-${OPENSBI_VERSION}-rv-bin/share/opensbi/ilp32/generic/firmware/fw_dynamic.bin" /usr/share/qemu/opensbi-riscv32-generic-fw_dynamic.bin | |
sudo mv "opensbi-${OPENSBI_VERSION}-rv-bin/share/opensbi/ilp32/generic/firmware/fw_dynamic.elf" /usr/share/qemu/opensbi-riscv32-generic-fw_dynamic.elf | |
rm -rf "opensbi-${OPENSBI_VERSION}-rv-bin" | |
- run: espup install --targets esp32 | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
if: startsWith(matrix.rust, 'nightly') | |
- run: tools/no-std.sh | |
- run: tools/build.sh +esp xtensa-esp32-none-elf | |
if: startsWith(matrix.rust, 'nightly') | |
- run: tools/no-std.sh +esp xtensa-esp32-none-elf | |
if: startsWith(matrix.rust, 'nightly') | |
miri: | |
needs: tidy | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
- target: x86_64-unknown-linux-gnu | |
- target: x86_64-unknown-linux-gnu | |
flags: -C target-feature=+cmpxchg16b | |
- target: aarch64-unknown-linux-gnu | |
- target: i686-unknown-linux-gnu | |
- target: powerpc64le-unknown-linux-gnu | |
- target: s390x-unknown-linux-gnu | |
runs-on: ubuntu-latest | |
timeout-minutes: 60 | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
persist-credentials: false | |
- name: Install Rust | |
run: rustup toolchain add nightly --no-self-update --component miri && rustup default nightly | |
# - run: sudo apt-get -o Acquire::Retries=10 -qq update && sudo apt-get -o Acquire::Retries=10 -o Dpkg::Use-Pty=0 install -y --no-install-recommends moreutils | |
- run: echo "TARGET=--target=${{ matrix.target }}" >>"${GITHUB_ENV}" | |
if: matrix.target != 'x86_64-unknown-linux-gnu' | |
- run: tools/test.sh miri $TARGET | |
env: | |
RUSTDOCFLAGS: ${{ env.RUSTDOCFLAGS }} ${{ matrix.flags }} | |
RUSTFLAGS: ${{ env.RUSTFLAGS }} ${{ matrix.flags }} | |
san: | |
needs: tidy | |
strategy: | |
fail-fast: false | |
matrix: | |
sanitizer: | |
- address | |
- memory | |
- thread | |
runs-on: ubuntu-latest | |
timeout-minutes: 60 | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
persist-credentials: false | |
- name: Install Rust | |
run: rustup toolchain add nightly --no-self-update && rustup default nightly | |
# - run: sudo apt-get -o Acquire::Retries=10 -qq update && sudo apt-get -o Acquire::Retries=10 -o Dpkg::Use-Pty=0 install -y --no-install-recommends moreutils | |
- run: | | |
echo "ASAN_OPTIONS=detect_stack_use_after_return=1" >>"${GITHUB_ENV}" | |
echo "RUSTFLAGS=${RUSTFLAGS} -Z sanitizer=address" >>"${GITHUB_ENV}" | |
echo "RUSTDOCFLAGS=${RUSTDOCFLAGS} -Z sanitizer=address" >>"${GITHUB_ENV}" | |
if: matrix.sanitizer == 'address' | |
- run: | | |
echo "MSAN_OPTIONS=verbosity=2" >>"${GITHUB_ENV}" | |
echo "RUSTFLAGS=${RUSTFLAGS} -Z sanitizer=memory -Z sanitizer-memory-track-origins" >>"${GITHUB_ENV}" | |
echo "RUSTDOCFLAGS=${RUSTDOCFLAGS} -Z sanitizer=memory -Z sanitizer-memory-track-origins" >>"${GITHUB_ENV}" | |
if: matrix.sanitizer == 'memory' | |
- run: | | |
echo "RUSTFLAGS=${RUSTFLAGS} -Z sanitizer=thread" >>"${GITHUB_ENV}" | |
echo "RUSTDOCFLAGS=${RUSTDOCFLAGS} -Z sanitizer=thread" >>"${GITHUB_ENV}" | |
if: matrix.sanitizer == 'thread' | |
- run: tools/test.sh -Z build-std -vv | |
# We test doctest only once with the default build conditions because doctest is slow. Both api-test | |
# and src/tests have extended copies of doctest, so this will not reduce test coverage. | |
# +cmpxchg16b | |
- run: tools/test.sh -Z build-std -vv --tests | |
env: | |
RUSTDOCFLAGS: ${{ env.RUSTDOCFLAGS }} -C target-feature=+cmpxchg16b --cfg portable_atomic_no_outline_atomics | |
RUSTFLAGS: ${{ env.RUSTFLAGS }} -C target-feature=+cmpxchg16b --cfg portable_atomic_no_outline_atomics | |
valgrind: | |
needs: tidy | |
runs-on: ubuntu-latest | |
timeout-minutes: 60 | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
persist-credentials: false | |
- name: Install Rust | |
run: rustup toolchain add nightly --no-self-update && rustup default nightly | |
# - run: sudo apt-get -o Acquire::Retries=10 -qq update && sudo apt-get -o Acquire::Retries=10 -o Dpkg::Use-Pty=0 install -y --no-install-recommends moreutils | |
- uses: taiki-e/install-action@valgrind | |
- run: tools/test.sh valgrind -vv | |
# +cmpxchg16b | |
- run: tools/test.sh valgrind -vv | |
env: | |
# vmovdqa load/store path has been tested above, disable outline-atomics and test cmpxchg16b load/store path. | |
RUSTDOCFLAGS: ${{ env.RUSTDOCFLAGS }} -C target-feature=+cmpxchg16b --cfg portable_atomic_no_outline_atomics | |
RUSTFLAGS: ${{ env.RUSTFLAGS }} -C target-feature=+cmpxchg16b --cfg portable_atomic_no_outline_atomics | |
codegen: | |
needs: tidy | |
runs-on: ubuntu-latest | |
timeout-minutes: 60 | |
permissions: | |
contents: write | |
pull-requests: write | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
persist-credentials: false | |
- name: Install Rust | |
run: rustup toolchain add nightly --no-self-update --component rustfmt && rustup default nightly | |
- run: tools/no_atomic.sh | |
- run: tools/gen.sh | |
- id: diff | |
run: tools/ci/gen.sh | |
if: github.repository_owner == 'taiki-e' && (github.event_name == 'schedule' || github.event_name == 'push' && github.ref == 'refs/heads/main') | |
- uses: peter-evans/create-pull-request@v5 | |
with: | |
title: Update generated code | |
body: | | |
Auto-generated by [create-pull-request][1] | |
[Please close and immediately reopen this pull request to run CI.][2] | |
[1]: https://github.com/peter-evans/create-pull-request | |
[2]: https://github.com/peter-evans/create-pull-request/blob/HEAD/docs/concepts-guidelines.md#workarounds-to-trigger-further-workflow-runs | |
branch: update-generated-code | |
if: github.repository_owner == 'taiki-e' && (github.event_name == 'schedule' || github.event_name == 'push' && github.ref == 'refs/heads/main') && steps.diff.outputs.success == 'false' | |
- run: git add -N . && git diff --exit-code |