Skip to content

util: add portable_atomic_unstable_coerce_unsized cfg option #3662

util: add portable_atomic_unstable_coerce_unsized cfg option

util: add portable_atomic_unstable_coerce_unsized cfg option #3662

Workflow file for this run

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
PORTABLE_ATOMIC_DENY_WARNINGS: 1
# 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 --noprofile --norc -CeEuxo pipefail {0}
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
permissions:
contents: read
pull-requests: write # for gh pr edit --add-assignee
repository-projects: read # for gh pr edit --add-assignee
secrets: inherit
with:
clippy: false # covered by TESTS=1 ./tools/build.sh
test:
needs: tidy
strategy:
fail-fast: false
matrix:
# LLVM version table:
# - LLVM 3.9: stable 1.14 - 1.18, ? - ?
# - LLVM 4 : stable 1.19 - 1.24, ? - ?
# - LLVM 6 : stable 1.25 - 1.28, ? - ?
# - LLVM 7 : stable 1.29, ? - ?
# - LLVM 8 : stable 1.30 - 1.37, ? - ?
# - LLVM 9 : stable 1.38 - 1.44, ? - ?
# - LLVM 10 : stable 1.45 - 1.46, ? - ?
# - LLVM 11 : stable 1.47 - 1.51, ? - ?
# - LLVM 12 : stable 1.52 - 1.55, ? - nightly-2021-08-21 (1.56)
# - LLVM 13 : stable 1.56 - 1.59, nightly-2021-08-22 (1.56) - 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 - 1.77, nightly-2023-08-09 (1.73) - nightly-2024-02-13 (1.78)
# - LLVM 18 : stable 1.78 - 1.81, nightly-2024-02-14 (1.78) - nightly-2024-07-31 (1.82)
# - LLVM 19 : stable 1.82 - , nightly-2024-08-01 (1.82) -
# (see also https://github.com/rust-lang/rust/commits/master/src/llvm-project)
# Minimum external LLVM version table:
# - LLVM 3.9: stable 1.23 - 1.28, since https://github.com/rust-lang/rust/pull/45326
# - LLVM 5 : stable 1.29 - 1.32, since https://github.com/rust-lang/rust/pull/51899
# - LLVM 6 : stable 1.33 - 1.40, since https://github.com/rust-lang/rust/pull/56642
# - LLVM 7 : stable 1.41 - 1.43, since https://github.com/rust-lang/rust/pull/66973
# - LLVM 8 : stable 1.44 - 1.49, since https://github.com/rust-lang/rust/pull/71147
# - LLVM 9 : stable 1.50 - 1.52, since https://github.com/rust-lang/rust/pull/78848
# - LLVM 10 : stable 1.53 - 1.57, since https://github.com/rust-lang/rust/pull/83387
# - LLVM 12 : stable 1.58 - 1.64, since https://github.com/rust-lang/rust/pull/90175
# - LLVM 13 : stable 1.65 - 1.68, since https://github.com/rust-lang/rust/pull/100460
# - LLVM 14 : stable 1.69 - 1.72, since https://github.com/rust-lang/rust/pull/107573
# - LLVM 15 : stable 1.73 - 1.75, since https://github.com/rust-lang/rust/pull/114148
# - LLVM 16 : stable 1.76 - 1.78, since https://github.com/rust-lang/rust/pull/117947
# - LLVM 17 : stable 1.79 - 1.82, since https://github.com/rust-lang/rust/pull/122649
# - LLVM 18 : stable 1.83 - , since https://github.com/rust-lang/rust/pull/130487
# NOTE that some commented-out LLVM version entries are kept here, which may be temporarily uncommented if
# needed to investigate possible issues that may arise between LLVM and code generated for certain targets.
include:
- rust: '1.56'
- rust: nightly-2021-08-21 # Rust 1.56, LLVM 12
- rust: '1.59' # LLVM 13
# - rust: '1.64' # LLVM 14
# - rust: '1.69' # LLVM 15
# - rust: '1.72' # LLVM 16
# - rust: '1.77' # LLVM 17
# - rust: '1.81' # LLVM 18
- rust: stable
- rust: beta
- rust: nightly
- rust: nightly
flags: -C panic=abort -Z panic_abort_tests
- rust: nightly
flags: -Z codegen-backend=cranelift
- rust: nightly
# target: x86_64-apple-darwin
os: macos-13 # x86_64
- rust: nightly
# target: x86_64-pc-windows-msvc
os: windows-latest
- rust: nightly-x86_64-pc-windows-gnu
# target: x86_64-pc-windows-gnu
os: windows-latest
- rust: nightly-i686-pc-windows-msvc
# target: i686-pc-windows-msvc
os: windows-latest
- rust: nightly-i686-pc-windows-gnu
# target: i686-pc-windows-gnu
os: windows-latest
- rust: nightly
target: aarch64-apple-darwin
os: macos-latest # AArch64
- rust: nightly
target: aarch64-apple-ios-macabi
os: macos-latest # AArch64
- rust: nightly-2021-08-21 # Rust 1.56, LLVM 12
target: aarch64-unknown-linux-gnu
- 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: '1.77' # LLVM 17
# target: aarch64-unknown-linux-gnu
# - rust: '1.81' # LLVM 18
# 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-unknown-linux-gnu
flags: -Z codegen-backend=cranelift
- rust: nightly-2024-11-07 # TODO: https://github.com/BurntSushi/memchr/pull/162
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
# TODO: flaky
# - rust: nightly
# target: aarch64-pc-windows-gnullvm
- rust: nightly-2021-08-21 # Rust 1.56, LLVM 12
target: armv5te-unknown-linux-gnueabi
- rust: '1.59' # LLVM 13
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
# TODO: backtrace bug: panicked at /home/runner/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/../../backtrace/src/symbolize/gimli/libs_dl_iterate_phdr.rs:48:30:
- rust: nightly-2024-08-30
target: arm-linux-androideabi
- rust: nightly
target: i586-unknown-linux-gnu
- rust: nightly-2021-08-21 # Rust 1.56, LLVM 12
target: i686-unknown-linux-gnu
- rust: '1.59' # LLVM 13
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
target: mipsisa32r6-unknown-linux-gnu
- rust: nightly
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-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-2022-08-12 # Rust 1.65, LLVM 14
# target: powerpc64-unknown-linux-gnu
# - rust: nightly-2023-03-25 # Rust 1.70, LLVM 15
# target: powerpc64-unknown-linux-gnu
# - rust: nightly-2023-08-08 # Rust 1.73, LLVM 16
# target: powerpc64-unknown-linux-gnu
# - rust: nightly-2024-02-13 # Rust 1.78, LLVM 17
# target: powerpc64-unknown-linux-gnu
# - rust: nightly-2024-07-31 # Rust 1.82, LLVM 18
# target: powerpc64-unknown-linux-gnu
- rust: nightly
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: powerpc64le-unknown-linux-gnu
# - rust: nightly-2022-08-12 # Rust 1.65, LLVM 14
# target: powerpc64le-unknown-linux-gnu
# - rust: nightly-2023-03-25 # Rust 1.70, LLVM 15
# target: powerpc64le-unknown-linux-gnu
# - rust: nightly-2023-08-08 # Rust 1.73, LLVM 16
# target: powerpc64le-unknown-linux-gnu
# - rust: nightly-2024-02-13 # Rust 1.78, LLVM 17
# target: powerpc64le-unknown-linux-gnu
# - rust: nightly-2024-07-31 # Rust 1.82, LLVM 18
# target: powerpc64le-unknown-linux-gnu
- rust: nightly
target: powerpc64le-unknown-linux-gnu
- rust: nightly-2022-08-12 # Rust 1.65, LLVM 14
target: riscv32gc-unknown-linux-gnu
# - rust: nightly-2023-03-25 # Rust 1.70, LLVM 15
# target: riscv32gc-unknown-linux-gnu
# - rust: nightly-2023-08-08 # Rust 1.73, LLVM 16
# target: riscv32gc-unknown-linux-gnu
# - rust: nightly-2024-02-13 # Rust 1.78, LLVM 17
# target: riscv32gc-unknown-linux-gnu
# - rust: nightly-2024-07-31 # Rust 1.82, LLVM 18
# target: riscv32gc-unknown-linux-gnu
- rust: nightly
target: riscv32gc-unknown-linux-gnu
- rust: nightly-2021-08-21 # Rust 1.56, LLVM 12
target: riscv64gc-unknown-linux-gnu
- rust: '1.59' # LLVM 13
target: riscv64gc-unknown-linux-gnu
# - rust: '1.64' # LLVM 14
# target: riscv64gc-unknown-linux-gnu
# - rust: '1.69' # LLVM 15
# target: riscv64gc-unknown-linux-gnu
# - rust: '1.72' # LLVM 16
# target: riscv64gc-unknown-linux-gnu
# - rust: '1.77' # LLVM 17
# target: riscv64gc-unknown-linux-gnu
# - rust: '1.81' # LLVM 18
# target: riscv64gc-unknown-linux-gnu
- rust: stable
target: riscv64gc-unknown-linux-gnu
- rust: nightly
target: riscv64gc-unknown-linux-gnu
- rust: nightly
target: riscv64gc-unknown-linux-gnu
flags: -Z codegen-backend=cranelift
# - rust: '1.84' # LLVM 19 (oldest stable version we can use asm on this target)
# 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-2024-02-13 # Rust 1.78, LLVM 17
# target: s390x-unknown-linux-gnu
# - rust: nightly-2024-07-31 # Rust 1.82, LLVM 18
# target: s390x-unknown-linux-gnu
- rust: nightly
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: taiki-e/checkout-action@v1
- 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')
- uses: taiki-e/github-actions/install-rust@main
with:
toolchain: ${{ matrix.rust }}
- 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: printf '%s\n' "RUSTFLAGS=${RUSTFLAGS} --cfg qemu" >>"${GITHUB_ENV}"
if: matrix.target != '' && !startsWith(matrix.target, 'i686') && !startsWith(matrix.target, 'x86_64') && !startsWith(matrix.os, 'macos')
- run: |
printf '%s\n' "RUSTFLAGS=${RUSTFLAGS} ${{ matrix.flags }}" >>"${GITHUB_ENV}"
printf '%s\n' "RUSTDOCFLAGS=${RUSTDOCFLAGS} ${{ matrix.flags }}" >>"${GITHUB_ENV}"
if: matrix.flags != ''
- run: printf '%s\n' "TARGET=--target=${{ matrix.target }}" >>"${GITHUB_ENV}"
if: matrix.target != '' && !contains(matrix.target, '-darwin')
# TODO: LLVM bug: Undefined temporary symbol error when building std.
- run: printf 'RELEASE=--release\n' >>"${GITHUB_ENV}"
if: startsWith(matrix.target, 'mips-') || startsWith(matrix.target, 'mipsel-')
# for serde
- run: printf '%s\n' "RUSTFLAGS=${RUSTFLAGS} --cfg no_diagnostic_namespace" >>"${GITHUB_ENV}"
if: matrix.rust == 'nightly-2024-02-13'
- run: tools/test.sh -vv ${TARGET:-} ${DOCTEST_XCOMPILE:-} ${BUILD_STD:-} ${RELEASE:-}
- run: tools/test.sh -vv ${TARGET:-} ${BUILD_STD:-} ${RELEASE:-}
env:
RUSTFLAGS: ${{ env.RUSTFLAGS }} --cfg portable_atomic_unstable_coerce_unsized
if: startsWith(matrix.rust, 'nightly')
# 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.
# portable_atomic_no_outline_atomics only affects x86_64, AArch64, Arm, powerpc64, and RISC-V Linux.
# outline-atomics is disabled by default on AArch64/powerpc64 musl with static linking
# powerpc64le- (little-endian) is skipped because it is pwr8 by default
# RISC-V Linux is skipped because outline-atomics is currently disabled by default on riscv.
- 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
if: (matrix.target == '' && !contains(matrix.rust, 'i686') || startsWith(matrix.target, 'x86_64')) || (startsWith(matrix.target, 'aarch64') || startsWith(matrix.target, 'powerpc64-')) && !(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
# PowerPC 64-bit is skipped because it is tested below.
# arm-linux-androideabi is removed due to an apparent issue between Rust nightly & QEmu in CI testing
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')
- run: tools/test.sh -vv --tests ${TARGET:-} ${BUILD_STD:-} ${RELEASE:-}
env:
QEMU_CPU: power7 # no quadword-atomics
if: startsWith(matrix.target, 'powerpc64-')
# portable_atomic_outline_atomics only affects AArch64 non-glibc-Linux/illumos, powerpc64, and RISC-V Linux.
# powerpc64le- (little-endian) is skipped because it is pwr8 by default
- run: tools/test.sh -vv --tests ${TARGET:-} ${BUILD_STD:-} ${RELEASE:-} --exclude api-test
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-') || startsWith(matrix.target, 'riscv')
- run: tools/test.sh -vv --tests ${TARGET:-} ${BUILD_STD:-} ${RELEASE:-} --exclude api-test
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
# powerpc64 and RISC-V are skipped because tested below.
if: startsWith(matrix.target, 'aarch64') && contains(matrix.target, '-musl') && matrix.flags == ''
- run: tools/test.sh -vv --tests ${TARGET:-} ${BUILD_STD:-} ${RELEASE:-} --exclude api-test
env:
RUSTDOCFLAGS: ${{ env.RUSTDOCFLAGS }} --cfg portable_atomic_outline_atomics
RUSTFLAGS: ${{ env.RUSTFLAGS }} --cfg portable_atomic_outline_atomics
QEMU_CPU: power7 # no quadword-atomics
if: startsWith(matrix.target, 'powerpc64-')
- run: tools/test.sh -vv --tests ${TARGET:-} ${BUILD_STD:-} ${RELEASE:-} --exclude api-test
env:
RUSTDOCFLAGS: ${{ env.RUSTDOCFLAGS }} --cfg portable_atomic_outline_atomics
RUSTFLAGS: ${{ env.RUSTFLAGS }} --cfg portable_atomic_outline_atomics
QEMU_CPU: sifive-u34 # no zacas
if: startsWith(matrix.target, 'riscv32')
- run: tools/test.sh -vv --tests ${TARGET:-} ${BUILD_STD:-} ${RELEASE:-} --exclude api-test
env:
RUSTDOCFLAGS: ${{ env.RUSTDOCFLAGS }} --cfg portable_atomic_outline_atomics
RUSTFLAGS: ${{ env.RUSTFLAGS }} --cfg portable_atomic_outline_atomics
QEMU_CPU: sifive-u54 # no zacas
if: startsWith(matrix.target, 'riscv64')
# 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
# macOS is skipped because it is +lse,+lse2 by default
# QEMU + Wine is slow so test only cases where OS-specific code is called.
if: startsWith(matrix.target, 'aarch64') && !contains(matrix.target, '-darwin') && 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
# macOS is skipped because it is +lse,+lse2 by default
# QEMU + Wine is slow so test only cases where OS-specific code is called.
if: startsWith(matrix.target, 'aarch64') && !contains(matrix.target, '-darwin') && 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-')
# riscv +zabha
- run: tools/test.sh -vv --tests ${TARGET:-} ${BUILD_STD:-} ${RELEASE:-}
env:
RUSTDOCFLAGS: ${{ env.RUSTDOCFLAGS }} -C target-feature=+zabha
RUSTFLAGS: ${{ env.RUSTFLAGS }} -C target-feature=+zabha
QEMU_CPU: max
if: startsWith(matrix.target, 'riscv')
# riscv +experimental-zacas
- run: tools/test.sh -vv --tests ${TARGET:-} ${BUILD_STD:-} ${RELEASE:-}
env:
RUSTDOCFLAGS: ${{ env.RUSTDOCFLAGS }} -C target-feature=+experimental-zacas
RUSTFLAGS: ${{ env.RUSTFLAGS }} -C target-feature=+experimental-zacas
if: startsWith(matrix.target, 'riscv')
# 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:
RUSTDOCFLAGS: ${{ env.RUSTDOCFLAGS }} -C target-cpu=z15
RUSTFLAGS: ${{ env.RUSTFLAGS }} -C target-cpu=z15
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 --workspace --no-private --detach-path-deps=skip-exact --features "${TEST_FEATURES}" --ignore-unknown-features ${TARGET:-} ${BUILD_STD:-} ${RELEASE:-}
if: matrix.rust != 'nightly-2021-08-21'
- run: cargo minimal-versions build --workspace --no-private --detach-path-deps=skip-exact --features "${TEST_FEATURES}" --ignore-unknown-features ${TARGET:-} ${BUILD_STD:-} ${RELEASE:-} --direct
# -Z direct-minimal-versions requires Cargo 1.70.
if: (!(startsWith(matrix.rust, '1.5') || startsWith(matrix.rust, '1.6') || startsWith(matrix.rust, 'nightly-2021') || startsWith(matrix.rust, 'nightly-2022') || startsWith(matrix.rust, 'nightly-2023')))
test-bsd:
needs: tidy
name: test (${{ matrix.target }}${{ matrix.version }})
strategy:
fail-fast: false
matrix:
include:
- target: aarch64-unknown-freebsd
os: freebsd
version: '13.4'
- target: aarch64-unknown-freebsd
os: freebsd
version: '14.1'
# TODO: download error: https://cdn.NetBSD.org/pub/pkgsrc/packages/NetBSD/aarch64/10.0/All/rust-1.76.0nb3.tgz truncated
# - target: aarch64-unknown-netbsd
# os: netbsd
# version: '10.0'
- target: aarch64-unknown-openbsd
os: openbsd
version: '7.6'
runs-on: ubuntu-latest
timeout-minutes: 60
steps:
- uses: taiki-e/checkout-action@v1
- 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 PORTABLE_ATOMIC_DENY_WARNINGS TEST_FEATURES
operating_system: ${{ matrix.os }}
# We don't test x86_64 here because there is no OS-specific code on x86_64.
architecture: aarch64
version: ${{ matrix.version }}
shell: bash
sync_files: runner-to-vm
run: |
set -CeEuxo pipefail
retry() {
for i in {1..10}; do
if "$@"; then
return 0
else
sleep "${i}"
fi
done
"$@"
}
export CI=true
export RUSTFLAGS="${RUSTFLAGS} --cfg qemu"
# AArch64 FreeBSD/NetBSD/OpenBSD are tier 3 targets, so install Rust from package manager instead of rustup.
case "$(uname -s)" in
FreeBSD) retry sudo pkg install -y rust ;;
NetBSD) retry sudo pkgin -y install rust ;;
OpenBSD) retry sudo pkg_add rust ;;
esac
rustc -vV
# VM is very slow, so only test OS-specific code and code using them.
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.36'
- 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: reduce
steps:
- uses: taiki-e/checkout-action@v1
- uses: taiki-e/github-actions/free-device-space@main
if: matrix.target-group == ''
- uses: taiki-e/github-actions/install-rust@main
with:
toolchain: ${{ 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' # LLVM 14
# - '1.69' # LLVM 15
- '1.72' # LLVM 16
# - '1.77' # LLVM 17
# - '1.81' # LLVM 18
- stable
- nightly
runs-on: ubuntu-latest
timeout-minutes: 60
steps:
- uses: taiki-e/checkout-action@v1
- uses: taiki-e/github-actions/install-rust@main
with:
toolchain: ${{ matrix.rust }}
- uses: taiki-e/install-action@cargo-hack
if: matrix.rust == 'stable'
- uses: taiki-e/install-action@espup
if: matrix.rust == 'stable'
- run: |
retry() {
for i in {1..10}; do
if "$@"; then
return 0
else
sleep "${i}"
fi
done
"$@"
}
apt_packages=(
qemu-system-arm
qemu-system-misc
)
if [[ "${{ matrix.rust }}" == "nightly"* ]]; then
apt_packages+=(
avr-libc
gcc-avr
libelf-dev
mspdebug
simavr
)
fi
retry sudo apt-get -o Acquire::Retries=10 -qq update
retry sudo apt-get -o Acquire::Retries=10 -o Dpkg::Use-Pty=0 install -y --no-install-recommends "${apt_packages[@]}"
# APT's qemu package doesn't provide firmware for riscv32: https://packages.ubuntu.com/en/jammy/all/qemu-system-data/filelist
opensbi_version=1.5.1 # https://github.com/riscv-software-src/opensbi/releases
retry 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"
if [[ "${{ matrix.rust }}" == "nightly"* ]]; then
mkdir -p -- "${HOME}"/msp430-gcc
# https://www.ti.com/tool/MSP430-GCC-OPENSOURCE
retry curl --proto '=https' --tlsv1.2 -fsSL --retry 10 --retry-connrefused https://dr-download.ti.com/software-development/ide-configuration-compiler-or-debugger/MD-LlCjWuAbzH/9.3.1.2/msp430-gcc-9.3.1.11_linux64.tar.bz2 \
| tar xjf - --strip-components 1 -C "${HOME}"/msp430-gcc
printf '%s\n' "${HOME}"/msp430-gcc/bin >>"${GITHUB_PATH}"
elif [[ "${{ matrix.rust }}" == "stable" ]]; then
retry espup install --targets esp32s2
fi
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- uses: taiki-e/cache-cargo-install-action@v2
with:
# https://github.com/agbrs/agb/tree/5fb928a/mgba-test-runner
# To install locally:
# apt install libelf-dev
# cargo install mgba-test-runner --git https://github.com/agbrs/agb.git --rev 5fb928a
tool: mgba-test-runner
git: https://github.com/agbrs/agb.git
rev: 5fb928a
env:
RUSTFLAGS: -W warnings
if: startsWith(matrix.rust, 'nightly')
- run: rm -- tests/avr/rust-toolchain.toml
if: startsWith(matrix.rust, 'nightly-')
- run: tools/no-std.sh
- run: tools/build.sh +esp xtensa-esp32s2-none-elf
if: matrix.rust == 'stable'
- run: tools/no-std.sh +esp xtensa-esp32s2-none-elf
if: matrix.rust == 'stable'
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: taiki-e/checkout-action@v1
- uses: taiki-e/github-actions/install-rust@nightly
- uses: taiki-e/install-action@cargo-hack
# - 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: printf '%s\n' "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: taiki-e/checkout-action@v1
- uses: taiki-e/github-actions/install-rust@nightly
# https://github.com/google/sanitizers/issues/1716 / https://github.com/actions/runner-images/issues/9491
- run: sudo sysctl vm.mmap_rnd_bits=28
- uses: taiki-e/install-action@cargo-hack
# - 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: |
printf 'ASAN_OPTIONS=detect_stack_use_after_return=1\n' >>"${GITHUB_ENV}"
printf '%s\n' "RUSTFLAGS=${RUSTFLAGS} -Z sanitizer=address" >>"${GITHUB_ENV}"
printf '%s\n' "RUSTDOCFLAGS=${RUSTDOCFLAGS} -Z sanitizer=address" >>"${GITHUB_ENV}"
if: matrix.sanitizer == 'address'
- run: |
printf 'MSAN_OPTIONS=verbosity=2\n' >>"${GITHUB_ENV}"
printf '%s\n' "RUSTFLAGS=${RUSTFLAGS} -Z sanitizer=memory -Z sanitizer-memory-track-origins" >>"${GITHUB_ENV}"
printf '%s\n' "RUSTDOCFLAGS=${RUSTDOCFLAGS} -Z sanitizer=memory -Z sanitizer-memory-track-origins" >>"${GITHUB_ENV}"
if: matrix.sanitizer == 'memory'
- run: |
printf '%s\n' "RUSTFLAGS=${RUSTFLAGS} -Z sanitizer=thread" >>"${GITHUB_ENV}"
printf '%s\n' "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: taiki-e/checkout-action@v1
- uses: taiki-e/github-actions/install-rust@nightly
- uses: taiki-e/install-action@cargo-hack
# - 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-24.04 # old clang doesn't support AArch64 illumos # TODO: use ubuntu-latest once https://github.com/actions/runner-images/issues/10636 done
timeout-minutes: 60
permissions:
contents: read
pull-requests: write # for gh pr edit --add-assignee
repository-projects: read # for gh pr edit --add-assignee
steps:
- uses: taiki-e/checkout-action@v1
- uses: taiki-e/github-actions/install-rust@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')
- id: create-pull-request
uses: peter-evans/create-pull-request@v7
with:
title: Update generated code
body: |
Auto-generated by CI using [create-pull-request](https://github.com/peter-evans/create-pull-request).
branch: update-generated-code
token: ${{ secrets.CREATE_PR_TOKEN }}
if: github.repository_owner == 'taiki-e' && (github.event_name == 'schedule' || github.event_name == 'push' && github.ref == 'refs/heads/main') && steps.diff.outputs.success == 'false'
- name: Notify PR author by assigning PR
run: gh pr edit --add-assignee taiki-e "${PR_NUMBER:?}"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PR_NUMBER: ${{ steps.create-pull-request.outputs.pull-request-number }}
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