Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 11 additions & 1 deletion .github/workflows/main.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ jobs:
rustup default "$channel"
rustup target add "${{ matrix.target }}"
rustup component add llvm-tools-preview
- uses: taiki-e/install-action@nextest
- uses: Swatinem/rust-cache@v2
with:
key: ${{ matrix.target }}
Expand All @@ -107,7 +108,7 @@ jobs:
path: /tmp/.buildx-cache
key: ${{ matrix.target }}-buildx-${{ github.sha }}
restore-keys: ${{ matrix.target }}-buildx-

- name: Cache compiler-rt
id: cache-compiler-rt
uses: actions/cache@v4
Expand All @@ -121,6 +122,10 @@ jobs:
- run: echo "RUST_COMPILER_RT_ROOT=$(realpath ./compiler-rt)" >> "$GITHUB_ENV"
shell: bash

- name: Verify API list
if: matrix.os == 'ubuntu-24.04'
run: python3 etc/update-api-list.py --check

# Non-linux tests just use our raw script
- name: Run locally
if: matrix.os != 'ubuntu-24.04'
Expand All @@ -136,6 +141,11 @@ jobs:
if: matrix.os == 'ubuntu-24.04'
run: cargo generate-lockfile && ./ci/run-docker.sh ${{ matrix.target }}

- name: Print test logs if available
if: always()
run: if [ -f "target/test-log.txt" ]; then cat target/test-log.txt; fi
shell: bash

# Workaround to keep Docker cache smaller
# https://github.com/docker/build-push-action/issues/252
# https://github.com/moby/buildkit/issues/1896
Expand Down
35 changes: 16 additions & 19 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -31,22 +31,19 @@ panic = "abort"
[profile.dev]
panic = "abort"

# FIXME(libm): these profiles are needed for testing
# # The default release profile is unchanged.

# # Release mode with debug assertions
# [profile.release-checked]
# inherits = "release"
# debug-assertions = true
# overflow-checks = true

# # Release with maximum optimizations, which is very slow to build. This is also
# # what is needed to check `no-panic`.
# [profile.release-opt]
# inherits = "release"
# codegen-units = 1
# lto = "fat"

# [profile.bench]
# # Required for iai-callgrind
# debug = true
# Release mode with debug assertions
[profile.release-checked]
inherits = "release"
debug-assertions = true
overflow-checks = true

# Release with maximum optimizations, which is very slow to build. This is also
# what is needed to check `no-panic`.
[profile.release-opt]
inherits = "release"
codegen-units = 1
lto = "fat"

[profile.bench]
# Required for iai-callgrind
debug = true
167 changes: 146 additions & 21 deletions ci/run.sh
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,11 @@ if [ -z "$target" ]; then
target="$host_target"
fi

if [[ "$target" = *"wasm"* ]]; then
# Enable the random backend
export RUSTFLAGS="${RUSTFLAGS:-} --cfg getrandom_backend=\"wasm_js\""
fi

if [ "${USING_CONTAINER_RUSTC:-}" = 1 ]; then
# Install nonstandard components if we have control of the environment
rustup target list --installed |
Expand All @@ -22,27 +27,27 @@ fi

# Test our implementation
if [ "${BUILD_ONLY:-}" = "1" ]; then
echo "nothing to do for no_std"
echo "no tests to run for build-only targets"
else
run="cargo test --package builtins-test --no-fail-fast --target $target"
$run
$run --release
$run --features c
$run --features c --release
$run --features no-asm
$run --features no-asm --release
$run --features no-f16-f128
$run --features no-f16-f128 --release
$run --benches
$run --benches --release
fi
test_builtins=(cargo test --package builtins-test --no-fail-fast --target "$target")
"${test_builtins[@]}"
"${test_builtins[@]}" --release
"${test_builtins[@]}" --features c
"${test_builtins[@]}" --features c --release
"${test_builtins[@]}" --features no-asm
"${test_builtins[@]}" --features no-asm --release
"${test_builtins[@]}" --features no-f16-f128
"${test_builtins[@]}" --features no-f16-f128 --release
"${test_builtins[@]}" --benches
"${test_builtins[@]}" --benches --release

if [ "${TEST_VERBATIM:-}" = "1" ]; then
verb_path=$(cmd.exe //C echo \\\\?\\%cd%\\builtins-test\\target2)
cargo build --package builtins-test \
--target "$target" --target-dir "$verb_path" --features c
if [ "${TEST_VERBATIM:-}" = "1" ]; then
verb_path=$(cmd.exe //C echo \\\\?\\%cd%\\builtins-test\\target2)
"${test_builtins[@]}" --target-dir "$verb_path" --features c
fi
fi


declare -a rlib_paths

# Set the `rlib_paths` global array to a list of all compiler-builtins rlibs
Expand All @@ -61,11 +66,11 @@ rm -f "${rlib_paths[@]}"
cargo build -p compiler_builtins --target "$target"
cargo build -p compiler_builtins --target "$target" --release
cargo build -p compiler_builtins --target "$target" --features c
cargo build -p compiler_builtins --target "$target" --release --features c
cargo build -p compiler_builtins --target "$target" --features c --release
cargo build -p compiler_builtins --target "$target" --features no-asm
cargo build -p compiler_builtins --target "$target" --release --features no-asm
cargo build -p compiler_builtins --target "$target" --features no-asm --release
cargo build -p compiler_builtins --target "$target" --features no-f16-f128
cargo build -p compiler_builtins --target "$target" --release --features no-f16-f128
cargo build -p compiler_builtins --target "$target" --features no-f16-f128 --release

PREFIX=${target//unknown-/}-
case "$target" in
Expand Down Expand Up @@ -167,4 +172,124 @@ for rlib in "${rlib_paths[@]}"; do
fi
done

true
# Test libm

mflags=()

# We enumerate features manually.
mflags+=(--no-default-features)

# Enable arch-specific routines when available.
mflags+=(--features arch)

# Always enable `unstable-float` since it expands available API but does not
# change any implementations.
mflags+=(--features unstable-float)

# We need to specifically skip tests for musl-math-sys on systems that can't
# build musl since otherwise `--all` will activate it.
case "$target" in
# Can't build at all on MSVC, WASM, or thumb
*windows-msvc*) mflags+=(--exclude musl-math-sys) ;;
*wasm*) mflags+=(--exclude musl-math-sys) ;;
*thumb*) mflags+=(--exclude musl-math-sys) ;;

# We can build musl on MinGW but running tests gets a stack overflow
*windows-gnu*) ;;
# FIXME(#309): LE PPC crashes calling the musl version of some functions. It
# seems like a qemu bug but should be investigated further at some point.
# See <https://github.com/rust-lang/libm/issues/309>.
*powerpc64le*) ;;

# Everything else gets musl enabled
*) mflags+=(--features libm-test/build-musl) ;;
esac


# Configure which targets test against MPFR
case "$target" in
# MSVC cannot link MPFR
*windows-msvc*) ;;
# FIXME: MinGW should be able to build MPFR, but setup in CI is nontrivial.
*windows-gnu*) ;;
# Targets that aren't cross compiled in CI work fine
aarch64*apple*) mflags+=(--features libm-test/build-mpfr) ;;
aarch64*linux*) mflags+=(--features libm-test/build-mpfr) ;;
i586*) mflags+=(--features libm-test/build-mpfr --features gmp-mpfr-sys/force-cross) ;;
i686*) mflags+=(--features libm-test/build-mpfr) ;;
x86_64*) mflags+=(--features libm-test/build-mpfr) ;;
esac

# FIXME: `STATUS_DLL_NOT_FOUND` testing macros on CI.
# <https://github.com/rust-lang/rust/issues/128944>
case "$target" in
*windows-gnu) mflags+=(--exclude libm-macros) ;;
esac

# Make sure a simple build works
cargo check -p libm --no-default-features --target "$target"


if [ "${BUILD_ONLY:-}" = "1" ]; then
# If we are on targets that can't run tests, verify that we can build.
cmd=(cargo build --target "$target" --package libm)
"${cmd[@]}"
"${cmd[@]}" --features unstable-intrinsics

echo "can't run tests on $target; skipping"
else
mflags+=(--workspace --target "$target")
cmd=(cargo test "${mflags[@]}")
profile_flag="--profile"

# If nextest is available, use that
command -v cargo-nextest && nextest=1 || nextest=0
if [ "$nextest" = "1" ]; then
cmd=(cargo nextest run --max-fail=10)

# Workaround for https://github.com/nextest-rs/nextest/issues/2066
if [ -f /.dockerenv ]; then
cfg_file="/tmp/nextest-config.toml"
echo "[store]" >> "$cfg_file"
echo "dir = \"$CARGO_TARGET_DIR/nextest\"" >> "$cfg_file"
cmd+=(--config-file "$cfg_file")
fi

cmd+=("${mflags[@]}")
profile_flag="--cargo-profile"
fi

# Test once without intrinsics
"${cmd[@]}"

# Run doctests if they were excluded by nextest
[ "$nextest" = "1" ] && cargo test --doc --exclude compiler_builtins "${mflags[@]}"

# Exclude the macros and utile crates from the rest of the tests to save CI
# runtime, they shouldn't have anything feature- or opt-level-dependent.
cmd+=(--exclude util --exclude libm-macros)

# Test once with intrinsics enabled
"${cmd[@]}" --features unstable-intrinsics
"${cmd[@]}" --features unstable-intrinsics --benches

# Test the same in release mode, which also increases coverage. Also ensure
# the soft float routines are checked.
"${cmd[@]}" "$profile_flag" release-checked
"${cmd[@]}" "$profile_flag" release-checked --features force-soft-floats
"${cmd[@]}" "$profile_flag" release-checked --features unstable-intrinsics
"${cmd[@]}" "$profile_flag" release-checked --features unstable-intrinsics --benches

# Ensure that the routines do not panic.
#
# `--tests` must be passed because no-panic is only enabled as a dev
# dependency. The `release-opt` profile must be used to enable LTO and a
# single CGU.
ENSURE_NO_PANIC=1 cargo build \
-p libm \
--target "$target" \
--no-default-features \
--features unstable-float \
--tests \
--profile release-opt
fi
2 changes: 1 addition & 1 deletion crates/musl-math-sys/musl
Submodule musl updated from 078437 to 61399d
56 changes: 0 additions & 56 deletions etc/libm/ci/run-docker.sh

This file was deleted.

Loading
Loading