171 lines
6.8 KiB
Bash
Executable file
171 lines
6.8 KiB
Bash
Executable file
#!/bin/bash
|
|
set -euo pipefail
|
|
|
|
function begingroup {
|
|
echo "::group::$@"
|
|
set -x
|
|
}
|
|
|
|
function endgroup {
|
|
set +x
|
|
echo "::endgroup"
|
|
}
|
|
|
|
begingroup "Building Miri"
|
|
|
|
# Global configuration
|
|
export RUSTFLAGS="-D warnings"
|
|
export CARGO_INCREMENTAL=0
|
|
export CARGO_EXTRA_FLAGS="--locked"
|
|
|
|
# Determine configuration for installed build (used by test-cargo-miri).
|
|
echo "Installing release version of Miri"
|
|
time ./miri install
|
|
|
|
# Prepare debug build for direct `./miri` invocations.
|
|
# We enable all features to make sure the Stacked Borrows consistency check runs.
|
|
echo "Building debug version of Miri"
|
|
export CARGO_EXTRA_FLAGS="$CARGO_EXTRA_FLAGS --all-features"
|
|
time ./miri build --all-targets # the build that all the `./miri test` below will use
|
|
|
|
endgroup
|
|
|
|
# Run tests. Recognizes these variables:
|
|
# - MIRI_TEST_TARGET: the target to test. Empty for host target.
|
|
# - GC_STRESS: if non-empty, run the GC stress test for the main test suite.
|
|
# - MIR_OPT: if non-empty, re-run test `pass` tests with mir-opt-level=4
|
|
# - MANY_SEEDS: if set to N, run the "many-seeds" tests N times
|
|
# - TEST_BENCH: if non-empty, check that the benchmarks all build
|
|
# - CARGO_MIRI_ENV: if non-empty, set some env vars and config to potentially confuse cargo-miri
|
|
function run_tests {
|
|
if [ -n "${MIRI_TEST_TARGET-}" ]; then
|
|
begingroup "Testing foreign architecture $MIRI_TEST_TARGET"
|
|
else
|
|
begingroup "Testing host architecture"
|
|
fi
|
|
|
|
## ui test suite
|
|
if [ -n "${GC_STRESS-}" ]; then
|
|
time MIRIFLAGS="${MIRIFLAGS-} -Zmiri-provenance-gc=1" ./miri test
|
|
else
|
|
time ./miri test
|
|
fi
|
|
|
|
## advanced tests
|
|
if [ -n "${MIR_OPT-}" ]; then
|
|
# Tests with optimizations (`-O` is what cargo passes, but crank MIR optimizations up all the
|
|
# way, too).
|
|
# Optimizations change diagnostics (mostly backtraces), so we don't check
|
|
# them. Also error locations change so we don't run the failing tests.
|
|
# We explicitly enable debug-assertions here, they are disabled by -O but we have tests
|
|
# which exist to check that we panic on debug assertion failures.
|
|
time MIRIFLAGS="${MIRIFLAGS-} -O -Zmir-opt-level=4 -Cdebug-assertions=yes" MIRI_SKIP_UI_CHECKS=1 ./miri test -- tests/{pass,panic}
|
|
fi
|
|
if [ -n "${MANY_SEEDS-}" ]; then
|
|
# Also run some many-seeds tests.
|
|
time for FILE in tests/many-seeds/*.rs; do
|
|
./miri run "--many-seeds=0..$MANY_SEEDS" "$FILE"
|
|
done
|
|
fi
|
|
if [ -n "${TEST_BENCH-}" ]; then
|
|
# Check that the benchmarks build and run, but only once.
|
|
time HYPERFINE="hyperfine -w0 -r1" ./miri bench
|
|
fi
|
|
|
|
## test-cargo-miri
|
|
# On Windows, there is always "python", not "python3" or "python2".
|
|
if command -v python3 > /dev/null; then
|
|
PYTHON=python3
|
|
else
|
|
PYTHON=python
|
|
fi
|
|
# Some environment setup that attempts to confuse the heck out of cargo-miri.
|
|
if [ -n "${CARGO_MIRI_ENV-}" ]; then
|
|
# These act up on Windows (`which miri` produces a filename that does not exist?!?).
|
|
# RUSTC is the main thing to set (it changes the first argument our wrapper will see).
|
|
# Unless MIRI is also set, that produces a warning.
|
|
export RUSTC=$(which rustc)
|
|
export MIRI=$(rustc +miri --print sysroot)/bin/miri
|
|
# We entirely ignore other wrappers.
|
|
mkdir -p .cargo
|
|
echo 'build.rustc-wrapper = "thisdoesnotexist"' > .cargo/config.toml
|
|
fi
|
|
# Run the actual test
|
|
time ${PYTHON} test-cargo-miri/run-test.py
|
|
# Clean up
|
|
unset RUSTC MIRI
|
|
rm -rf .cargo
|
|
|
|
endgroup
|
|
}
|
|
|
|
function run_tests_minimal {
|
|
if [ -n "${MIRI_TEST_TARGET-}" ]; then
|
|
begingroup "Testing MINIMAL foreign architecture $MIRI_TEST_TARGET: only testing $@"
|
|
else
|
|
echo "run_tests_minimal requires MIRI_TEST_TARGET to be set"
|
|
exit 1
|
|
fi
|
|
|
|
time ./miri test -- "$@"
|
|
|
|
# Ensure that a small smoke test of cargo-miri works.
|
|
time cargo miri run --manifest-path test-cargo-miri/no-std-smoke/Cargo.toml --target ${MIRI_TEST_TARGET-$HOST_TARGET}
|
|
|
|
endgroup
|
|
}
|
|
|
|
## Main Testing Logic ##
|
|
|
|
# In particular, fully cover all tier 1 targets.
|
|
# We also want to run the many-seeds tests on all tier 1 targets.
|
|
case $HOST_TARGET in
|
|
x86_64-unknown-linux-gnu)
|
|
# Host
|
|
GC_STRESS=1 MIR_OPT=1 MANY_SEEDS=64 TEST_BENCH=1 CARGO_MIRI_ENV=1 run_tests
|
|
# Extra tier 1
|
|
# With reduced many-seed count to avoid spending too much time on that.
|
|
# (All OSes and ABIs are run with 64 seeds at least once though via the macOS runner.)
|
|
MANY_SEEDS=16 MIRI_TEST_TARGET=i686-unknown-linux-gnu run_tests
|
|
MANY_SEEDS=16 MIRI_TEST_TARGET=aarch64-unknown-linux-gnu run_tests
|
|
MANY_SEEDS=16 MIRI_TEST_TARGET=x86_64-apple-darwin run_tests
|
|
MANY_SEEDS=16 MIRI_TEST_TARGET=x86_64-pc-windows-gnu run_tests
|
|
;;
|
|
aarch64-apple-darwin)
|
|
# Host (tier 2)
|
|
GC_STRESS=1 MIR_OPT=1 MANY_SEEDS=64 TEST_BENCH=1 CARGO_MIRI_ENV=1 run_tests
|
|
# Extra tier 1
|
|
MANY_SEEDS=64 MIRI_TEST_TARGET=i686-pc-windows-gnu run_tests
|
|
MANY_SEEDS=64 MIRI_TEST_TARGET=x86_64-pc-windows-msvc CARGO_MIRI_ENV=1 run_tests
|
|
# Extra tier 2
|
|
MIRI_TEST_TARGET=arm-unknown-linux-gnueabi run_tests
|
|
MIRI_TEST_TARGET=s390x-unknown-linux-gnu run_tests # big-endian architecture of choice
|
|
# Partially supported targets (tier 2)
|
|
VERY_BASIC="integer vec string btreemap" # common things we test on all of them (if they have std), requires no target-specific shims
|
|
BASIC="$VERY_BASIC hello hashmap alloc align" # ensures we have the shims for stdout and basic data structures
|
|
MIRI_TEST_TARGET=x86_64-unknown-freebsd run_tests_minimal $BASIC panic/panic concurrency/simple atomic threadname libc-mem libc-misc libc-random libc-time fs env num_cpus
|
|
MIRI_TEST_TARGET=i686-unknown-freebsd run_tests_minimal $BASIC panic/panic concurrency/simple atomic threadname libc-mem libc-misc libc-random libc-time fs env num_cpus
|
|
MIRI_TEST_TARGET=x86_64-unknown-illumos run_tests_minimal $VERY_BASIC hello panic/panic concurrency/simple pthread-sync libc-mem libc-misc libc-random
|
|
MIRI_TEST_TARGET=x86_64-pc-solaris run_tests_minimal $VERY_BASIC hello panic/panic concurrency/simple pthread-sync libc-mem libc-misc libc-random
|
|
MIRI_TEST_TARGET=aarch64-linux-android run_tests_minimal $VERY_BASIC hello panic/panic
|
|
MIRI_TEST_TARGET=wasm32-wasi run_tests_minimal $VERY_BASIC wasm
|
|
MIRI_TEST_TARGET=wasm32-unknown-unknown run_tests_minimal $VERY_BASIC wasm
|
|
MIRI_TEST_TARGET=thumbv7em-none-eabihf run_tests_minimal no_std
|
|
# Custom target JSON file
|
|
MIRI_TEST_TARGET=tests/avr.json MIRI_NO_STD=1 run_tests_minimal no_std
|
|
;;
|
|
i686-pc-windows-msvc)
|
|
# Host
|
|
# Without GC_STRESS and with reduced many-seeds count as this is the slowest runner.
|
|
# (The macOS runner checks windows-msvc with full many-seeds count.)
|
|
MIR_OPT=1 MANY_SEEDS=16 TEST_BENCH=1 run_tests
|
|
# Extra tier 1
|
|
# We really want to ensure a Linux target works on a Windows host,
|
|
# and a 64bit target works on a 32bit host.
|
|
MIRI_TEST_TARGET=x86_64-unknown-linux-gnu run_tests
|
|
;;
|
|
*)
|
|
echo "FATAL: unknown host target: $HOST_TARGET"
|
|
exit 1
|
|
;;
|
|
esac
|