From 735a6a4212eb658b59564bf5bdc3adc28afc6c75 Mon Sep 17 00:00:00 2001 From: Ben Kimock Date: Sat, 16 Dec 2023 15:55:56 -0500 Subject: [PATCH] Run Miri and mir-opt tests without a target linker --- src/bootstrap/src/core/build_steps/compile.rs | 34 ++++++++++++++++--- src/bootstrap/src/core/build_steps/test.rs | 9 +++-- src/bootstrap/src/core/sanity.rs | 8 ++++- .../x86_64-gnu-tools/checktools.sh | 2 -- tests/mir-opt/remove_never_const.rs | 3 -- 5 files changed, 43 insertions(+), 13 deletions(-) diff --git a/src/bootstrap/src/core/build_steps/compile.rs b/src/bootstrap/src/core/build_steps/compile.rs index d699c4fe536..b240ab9ec6f 100644 --- a/src/bootstrap/src/core/build_steps/compile.rs +++ b/src/bootstrap/src/core/build_steps/compile.rs @@ -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 { @@ -56,6 +57,7 @@ pub fn new(compiler: Compiler, target: TargetSelection) -> Self { crates: Default::default(), force_recompile: false, extra_rust_args: &[], + is_for_mir_opt_tests: false, } } @@ -66,6 +68,18 @@ pub fn force_recompile(compiler: Compiler, target: TargetSelection) -> Self { 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, } } @@ -80,6 +94,7 @@ pub fn new_with_extra_rust_args( crates: Default::default(), force_recompile: false, extra_rust_args, + is_for_mir_opt_tests: false, } } } @@ -109,6 +124,7 @@ fn make_run(run: RunConfig<'_>) { crates, force_recompile: false, extra_rust_args: &[], + is_for_mir_opt_tests: false, }); } @@ -206,11 +222,19 @@ fn run(self, builder: &Builder<'_>) { } } - 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() { diff --git a/src/bootstrap/src/core/build_steps/test.rs b/src/bootstrap/src/core/build_steps/test.rs index 7f46726b956..c5db8be959b 100644 --- a/src/bootstrap/src/core/build_steps/test.rs +++ b/src/bootstrap/src/core/build_steps/test.rs @@ -1611,7 +1611,12 @@ fn run(self, builder: &Builder<'_>) { .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)); @@ -1619,7 +1624,7 @@ fn run(self, builder: &Builder<'_>) { 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 }); } diff --git a/src/bootstrap/src/core/sanity.rs b/src/bootstrap/src/core/sanity.rs index 82755f41800..5f1ca5de74a 100644 --- a/src/bootstrap/src/core/sanity.rs +++ b/src/bootstrap/src/core/sanity.rs @@ -62,9 +62,15 @@ pub fn must_have>(&mut self, cmd: S) -> PathBuf { } 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"); + // Skip target sanity checks when we are doing anything with mir-opt tests or Miri + let skipped_paths = [OsStr::new("mir-opt"), OsStr::new("miri")]; + skip_target_sanity |= build.config.paths.iter().any(|path| { + path.components().any(|component| skipped_paths.contains(&component.as_os_str())) + }); + 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 diff --git a/src/ci/docker/host-x86_64/x86_64-gnu-tools/checktools.sh b/src/ci/docker/host-x86_64/x86_64-gnu-tools/checktools.sh index 205ee263217..cc0c658aabd 100755 --- a/src/ci/docker/host-x86_64/x86_64-gnu-tools/checktools.sh +++ b/src/ci/docker/host-x86_64/x86_64-gnu-tools/checktools.sh @@ -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. @@ -62,4 +61,3 @@ case $HOST_TARGET in exit 1 ;; esac -unset BOOTSTRAP_SKIP_TARGET_SANITY diff --git a/tests/mir-opt/remove_never_const.rs b/tests/mir-opt/remove_never_const.rs index c144edaffaf..81562058d80 100644 --- a/tests/mir-opt/remove_never_const.rs +++ b/tests/mir-opt/remove_never_const.rs @@ -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);