Skip to content

Commit

Permalink
Run Miri and mir-opt tests without a target linker
Browse files Browse the repository at this point in the history
  • Loading branch information
saethlin committed Jan 1, 2024
1 parent 3cdd004 commit 1397d2e
Show file tree
Hide file tree
Showing 6 changed files with 50 additions and 16 deletions.
3 changes: 0 additions & 3 deletions library/test/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,6 @@ name = "test"
version = "0.0.0"
edition = "2021"

[lib]
crate-type = ["dylib", "rlib"]

[dependencies]
getopts = { version = "0.2.21", features = ['rustc-dep-of-std'] }
std = { path = "../std" }
Expand Down
34 changes: 29 additions & 5 deletions src/bootstrap/src/core/build_steps/compile.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ pub struct Std {
/// but we need to use the downloaded copy of std for linking to rustdoc. Allow this to be overriden by `builder.ensure` from other steps.
force_recompile: bool,
extra_rust_args: &'static [&'static str],
is_for_mir_opt_tests: bool,
}

impl Std {
Expand All @@ -56,6 +57,7 @@ impl Std {
crates: Default::default(),
force_recompile: false,
extra_rust_args: &[],
is_for_mir_opt_tests: false,
}
}

Expand All @@ -66,6 +68,18 @@ impl Std {
crates: Default::default(),
force_recompile: true,
extra_rust_args: &[],
is_for_mir_opt_tests: false,
}
}

pub fn new_for_mir_opt_tests(compiler: Compiler, target: TargetSelection) -> Self {
Self {
target,
compiler,
crates: Default::default(),
force_recompile: false,
extra_rust_args: &[],
is_for_mir_opt_tests: true,
}
}

Expand All @@ -80,6 +94,7 @@ impl Std {
crates: Default::default(),
force_recompile: false,
extra_rust_args,
is_for_mir_opt_tests: false,
}
}
}
Expand Down Expand Up @@ -109,6 +124,7 @@ impl Step for Std {
crates,
force_recompile: false,
extra_rust_args: &[],
is_for_mir_opt_tests: false,
});
}

Expand Down Expand Up @@ -206,11 +222,19 @@ impl Step for Std {
}
}

let mut cargo = builder.cargo(compiler, Mode::Std, SourceType::InTree, target, "build");
std_cargo(builder, target, compiler.stage, &mut cargo);
for krate in &*self.crates {
cargo.arg("-p").arg(krate);
}
let mut cargo = if self.is_for_mir_opt_tests {
let mut cargo = builder.cargo(compiler, Mode::Std, SourceType::InTree, target, "rustc");
cargo.arg("-p").arg("std").arg("--crate-type=lib");
std_cargo(builder, target, compiler.stage, &mut cargo);
cargo
} else {
let mut cargo = builder.cargo(compiler, Mode::Std, SourceType::InTree, target, "build");
std_cargo(builder, target, compiler.stage, &mut cargo);
for krate in &*self.crates {
cargo.arg("-p").arg(krate);
}
cargo
};

// See src/bootstrap/synthetic_targets.rs
if target.is_synthetic() {
Expand Down
9 changes: 7 additions & 2 deletions src/bootstrap/src/core/build_steps/test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1611,15 +1611,20 @@ NOTE: if you're sure you want to do this, please open an issue as to why. In the
.ensure(dist::DebuggerScripts { sysroot: builder.sysroot(compiler), host: target });
}

builder.ensure(compile::Std::new(compiler, target));
if suite == "mir-opt" {
builder.ensure(compile::Std::new_for_mir_opt_tests(compiler, target));
} else {
builder.ensure(compile::Std::new(compiler, target));
}

// ensure that `libproc_macro` is available on the host.
builder.ensure(compile::Std::new(compiler, compiler.host));

// Also provide `rust_test_helpers` for the host.
builder.ensure(TestHelpers { target: compiler.host });

// As well as the target, except for plain wasm32, which can't build it
if !target.contains("wasm") || target.contains("emscripten") {
if suite != "mir-opt" && !target.contains("wasm") && !target.contains("emscripten") {
builder.ensure(TestHelpers { target });
}

Expand Down
15 changes: 14 additions & 1 deletion src/bootstrap/src/core/sanity.rs
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,22 @@ impl Finder {
}

pub fn check(build: &mut Build) {
let skip_target_sanity =
let mut skip_target_sanity =
env::var_os("BOOTSTRAP_SKIP_TARGET_SANITY").is_some_and(|s| s == "1" || s == "true");

let skipped_paths = [OsStr::new("mir-opt"), OsStr::new("miri")];

// Skip target sanity checks when we are doing anything with mir-opt tests or Miri
for path in &build.config.paths {
if path.components().any(|component| skipped_paths.contains(&component.as_os_str())) {
skip_target_sanity = true;
break;
}
}
if [std::path::PathBuf::from("mir-opt")].as_slice() == build.config.paths {
skip_target_sanity = true;
}

let path = env::var_os("PATH").unwrap_or_default();
// On Windows, quotes are invalid characters for filename paths, and if
// one is present as part of the PATH then that can lead to the system
Expand Down
2 changes: 0 additions & 2 deletions src/ci/docker/host-x86_64/x86_64-gnu-tools/checktools.sh
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ else
fi
# We natively run this script on x86_64-unknown-linux-gnu and x86_64-pc-windows-msvc.
# Also cover some other targets via cross-testing, in particular all tier 1 targets.
export BOOTSTRAP_SKIP_TARGET_SANITY=1 # we don't need `cc` for these targets
case $HOST_TARGET in
x86_64-unknown-linux-gnu)
# Only this branch runs in PR CI.
Expand All @@ -62,4 +61,3 @@ case $HOST_TARGET in
exit 1
;;
esac
unset BOOTSTRAP_SKIP_TARGET_SANITY
3 changes: 0 additions & 3 deletions tests/mir-opt/remove_never_const.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,6 @@
// consts in codegen. We also have tests for this that catches the error, see
// tests/ui/consts/const-eval/index-out-of-bounds-never-type.rs.

// Force generation of optimized mir for functions that do not reach codegen.
// compile-flags: --emit mir,link

#![feature(never_type)]

struct PrintName<T>(T);
Expand Down

0 comments on commit 1397d2e

Please sign in to comment.