2024-04-15 18:44:39 +00:00
|
|
|
#!/bin/bash
|
|
|
|
|
2024-04-13 04:42:36 +00:00
|
|
|
set -eux
|
|
|
|
|
|
|
|
target="${1:-}"
|
|
|
|
|
|
|
|
if [ -z "${1:-}" ]; then
|
|
|
|
host_target=$(rustc -vV | awk '/^host/ { print $2 }')
|
|
|
|
echo "Defaulted to host target $host_target"
|
|
|
|
target="$host_target"
|
|
|
|
fi
|
|
|
|
|
|
|
|
if [ "${USING_CONTAINER_RUSTC:-}" = 1 ]; then
|
|
|
|
# Install nonstandard components if we have control of the environment
|
|
|
|
rustup target list --installed |
|
|
|
|
grep -E "^$target\$" ||
|
|
|
|
rustup target add "$target"
|
|
|
|
fi
|
2016-10-01 00:04:48 +00:00
|
|
|
|
2016-09-29 23:50:04 +00:00
|
|
|
# Test our implementation
|
2024-04-13 04:42:36 +00:00
|
|
|
if [ "${NO_STD:-}" = "1" ]; then
|
|
|
|
echo "nothing to do for no_std"
|
2019-04-02 18:44:28 +00:00
|
|
|
else
|
2024-04-13 04:42:36 +00:00
|
|
|
run="cargo test --manifest-path testcrate/Cargo.toml --target $target"
|
2019-04-02 18:44:28 +00:00
|
|
|
$run
|
|
|
|
$run --release
|
|
|
|
$run --features c
|
|
|
|
$run --features c --release
|
2020-11-09 15:24:25 +00:00
|
|
|
$run --features no-asm
|
|
|
|
$run --features no-asm --release
|
2024-04-14 07:05:18 +00:00
|
|
|
$run --features no-f16-f128
|
|
|
|
$run --features no-f16-f128 --release
|
2019-04-02 18:44:28 +00:00
|
|
|
fi
|
2016-09-29 23:50:04 +00:00
|
|
|
|
2024-04-13 04:42:36 +00:00
|
|
|
if [ -d /builtins-target ]; then
|
2024-04-15 18:44:39 +00:00
|
|
|
rlib_paths=/builtins-target/"${target}"/debug/deps/libcompiler_builtins-*.rlib
|
2024-03-24 20:27:38 +00:00
|
|
|
else
|
2024-04-15 18:44:39 +00:00
|
|
|
rlib_paths=target/"${target}"/debug/deps/libcompiler_builtins-*.rlib
|
2024-03-24 20:27:38 +00:00
|
|
|
fi
|
|
|
|
|
|
|
|
# Remove any existing artifacts from previous tests that don't set #![compiler_builtins]
|
2024-04-15 18:44:39 +00:00
|
|
|
rm -f $rlib_paths
|
2024-03-24 20:27:38 +00:00
|
|
|
|
2024-04-13 04:42:36 +00:00
|
|
|
cargo build --target "$target"
|
|
|
|
cargo build --target "$target" --release
|
|
|
|
cargo build --target "$target" --features c
|
|
|
|
cargo build --target "$target" --release --features c
|
|
|
|
cargo build --target "$target" --features no-asm
|
|
|
|
cargo build --target "$target" --release --features no-asm
|
2024-04-14 07:05:18 +00:00
|
|
|
cargo build --target "$target" --features no-f16-f128
|
|
|
|
cargo build --target "$target" --release --features no-f16-f128
|
2019-05-14 19:26:09 +00:00
|
|
|
|
2024-04-15 18:44:39 +00:00
|
|
|
PREFIX=${target//unknown-/}-
|
2024-04-13 04:42:36 +00:00
|
|
|
case "$target" in
|
2016-09-29 23:50:04 +00:00
|
|
|
armv7-*)
|
|
|
|
PREFIX=arm-linux-gnueabihf-
|
|
|
|
;;
|
|
|
|
thumb*)
|
|
|
|
PREFIX=arm-none-eabi-
|
|
|
|
;;
|
2016-09-30 00:47:44 +00:00
|
|
|
*86*-*)
|
2016-09-29 23:50:04 +00:00
|
|
|
PREFIX=
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
2024-04-15 18:44:39 +00:00
|
|
|
NM=$(find "$(rustc --print sysroot)" \( -name llvm-nm -o -name llvm-nm.exe \) )
|
2020-05-29 19:38:29 +00:00
|
|
|
if [ "$NM" = "" ]; then
|
2024-04-13 04:42:36 +00:00
|
|
|
NM="${PREFIX}nm"
|
2020-05-29 19:38:29 +00:00
|
|
|
fi
|
2024-03-24 20:27:38 +00:00
|
|
|
# i686-pc-windows-gnu tools have a dependency on some DLLs, so run it with
|
|
|
|
# rustup run to ensure that those are in PATH.
|
2024-04-13 04:42:36 +00:00
|
|
|
TOOLCHAIN="$(rustup show active-toolchain | sed 's/ (default)//')"
|
|
|
|
if [[ "$TOOLCHAIN" == *i686-pc-windows-gnu ]]; then
|
2024-03-24 20:27:38 +00:00
|
|
|
NM="rustup run $TOOLCHAIN $NM"
|
2016-10-07 19:29:34 +00:00
|
|
|
fi
|
|
|
|
|
2017-06-23 18:52:22 +00:00
|
|
|
# Look out for duplicated symbols when we include the compiler-rt (C) implementation
|
2024-04-15 18:44:39 +00:00
|
|
|
for rlib in $rlib_paths; do
|
2017-06-23 17:44:29 +00:00
|
|
|
set +x
|
2019-05-02 20:35:50 +00:00
|
|
|
echo "================================================================"
|
2024-04-13 04:42:36 +00:00
|
|
|
echo "checking $rlib for duplicate symbols"
|
2019-05-02 20:35:50 +00:00
|
|
|
echo "================================================================"
|
2024-04-15 18:44:39 +00:00
|
|
|
|
|
|
|
duplicates_found=0
|
2019-05-02 20:35:50 +00:00
|
|
|
|
2017-06-24 17:12:17 +00:00
|
|
|
# NOTE On i586, It's normal that the get_pc_thunk symbol appears several
|
|
|
|
# times so ignore it
|
2024-04-15 18:44:39 +00:00
|
|
|
$NM -g --defined-only "$rlib" 2>&1 |
|
|
|
|
sort |
|
|
|
|
uniq -d |
|
|
|
|
grep -v __x86.get_pc_thunk --quiet |
|
|
|
|
grep 'T __' && duplicates_found=1
|
|
|
|
|
|
|
|
if [ "$duplicates_found" != 0 ]; then
|
|
|
|
echo "error: found duplicate symbols"
|
2016-12-31 04:18:17 +00:00
|
|
|
exit 1
|
2024-04-15 18:44:39 +00:00
|
|
|
else
|
|
|
|
echo "success; no duplicate symbols found"
|
2016-12-31 04:18:17 +00:00
|
|
|
fi
|
|
|
|
done
|
|
|
|
|
2024-04-15 18:44:39 +00:00
|
|
|
rm -f $rlib_paths
|
|
|
|
|
|
|
|
build_intrinsics() {
|
|
|
|
cargo build --target "$target" -v --example intrinsics "$@"
|
|
|
|
}
|
2017-06-23 22:16:07 +00:00
|
|
|
|
2017-06-24 17:04:00 +00:00
|
|
|
# Verify that we haven't drop any intrinsic/symbol
|
2024-04-15 18:44:39 +00:00
|
|
|
build_intrinsics
|
|
|
|
build_intrinsics --release
|
|
|
|
build_intrinsics --features c
|
|
|
|
build_intrinsics --features c --release
|
2017-06-24 17:04:00 +00:00
|
|
|
|
|
|
|
# Verify that there are no undefined symbols to `panic` within our
|
|
|
|
# implementations
|
2024-03-24 20:27:38 +00:00
|
|
|
CARGO_PROFILE_DEV_LTO=true \
|
2024-04-13 04:42:36 +00:00
|
|
|
cargo build --target "$target" --example intrinsics
|
2020-04-29 20:30:10 +00:00
|
|
|
CARGO_PROFILE_RELEASE_LTO=true \
|
2024-04-13 04:42:36 +00:00
|
|
|
cargo build --target "$target" --example intrinsics --release
|
2017-06-23 22:16:07 +00:00
|
|
|
|
2024-03-24 20:27:38 +00:00
|
|
|
# Ensure no references to any symbols from core
|
2024-04-15 18:44:39 +00:00
|
|
|
for rlib in $(echo $rlib_paths); do
|
2024-04-13 04:42:36 +00:00
|
|
|
set +x
|
2024-03-24 20:27:38 +00:00
|
|
|
echo "================================================================"
|
2024-04-13 04:42:36 +00:00
|
|
|
echo "checking $rlib for references to core"
|
2024-03-24 20:27:38 +00:00
|
|
|
echo "================================================================"
|
2024-04-13 04:42:36 +00:00
|
|
|
set -x
|
|
|
|
|
|
|
|
tmpdir="${CARGO_TARGET_DIR:-target}/tmp"
|
|
|
|
test -d "$tmpdir" || mkdir "$tmpdir"
|
|
|
|
defined="$tmpdir/defined_symbols.txt"
|
|
|
|
undefined="$tmpdir/defined_symbols.txt"
|
|
|
|
|
2024-04-15 18:44:39 +00:00
|
|
|
$NM --quiet -U "$rlib" | grep 'T _ZN4core' | awk '{print $3}' | sort | uniq > "$defined"
|
|
|
|
$NM --quiet -u "$rlib" | grep 'U _ZN4core' | awk '{print $2}' | sort | uniq > "$undefined"
|
|
|
|
grep_has_results=0
|
|
|
|
grep -v -F -x -f "$defined" "$undefined" && grep_has_results=1
|
2024-04-13 04:42:36 +00:00
|
|
|
|
|
|
|
if [ "$target" = "powerpc64-unknown-linux-gnu" ]; then
|
|
|
|
echo "FIXME: powerpc64 fails these tests"
|
2024-04-15 18:44:39 +00:00
|
|
|
elif [ "$grep_has_results" != 0 ]; then
|
2024-04-13 04:42:36 +00:00
|
|
|
echo "error: found unexpected references to core"
|
2017-06-23 18:52:22 +00:00
|
|
|
exit 1
|
2024-04-13 04:42:36 +00:00
|
|
|
else
|
|
|
|
echo "success; no references to core found"
|
2017-06-23 18:52:22 +00:00
|
|
|
fi
|
|
|
|
done
|
|
|
|
|
2016-12-31 04:18:17 +00:00
|
|
|
true
|