summaryrefslogtreecommitdiff
path: root/src/tools
diff options
context:
space:
mode:
authorOli Scherer <git-spam-no-reply9815368754983@oli-obk.de>2023-05-12 10:04:55 +0000
committerOli Scherer <git-spam-no-reply9815368754983@oli-obk.de>2023-05-12 10:04:55 +0000
commit756c243e50dafea95d78d11890a8e7d33e7ce06f (patch)
treea05e71e622df98ccfdd761a36b391f89fb64727b /src/tools
parent9642e40076b0bf9480d8a090de64ed8dd4e4a8b5 (diff)
downloadrust-756c243e50dafea95d78d11890a8e7d33e7ce06f.tar.gz
Pass arguments to the interpreted program via `run-dep`
Diffstat (limited to 'src/tools')
-rw-r--r--src/tools/miri/Cargo.lock4
-rw-r--r--src/tools/miri/Cargo.toml2
-rw-r--r--src/tools/miri/tests/compiletest.rs83
3 files changed, 42 insertions, 47 deletions
diff --git a/src/tools/miri/Cargo.lock b/src/tools/miri/Cargo.lock
index e2a7d484c23..737423a2cd1 100644
--- a/src/tools/miri/Cargo.lock
+++ b/src/tools/miri/Cargo.lock
@@ -820,9 +820,9 @@ dependencies = [
[[package]]
name = "ui_test"
-version = "0.9.0"
+version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "95033b0e41b8018013d99a6f1486c1ae5bd080378ced60c5f797e93842423b33"
+checksum = "191a442639ea102fa62671026047e51d574bfda44b7fdf32151d7314624c1cd2"
dependencies = [
"bstr",
"cargo-platform",
diff --git a/src/tools/miri/Cargo.toml b/src/tools/miri/Cargo.toml
index f6f81836804..5987b0df8d6 100644
--- a/src/tools/miri/Cargo.toml
+++ b/src/tools/miri/Cargo.toml
@@ -39,7 +39,7 @@ libloading = "0.7"
[dev-dependencies]
colored = "2"
-ui_test = "0.9"
+ui_test = "0.10"
rustc_version = "0.4"
# Features chosen to match those required by env_logger, to avoid rebuilds
regex = { version = "1.5.5", default-features = false, features = ["perf", "std"] }
diff --git a/src/tools/miri/tests/compiletest.rs b/src/tools/miri/tests/compiletest.rs
index d57d3d22d5e..435771c2f39 100644
--- a/src/tools/miri/tests/compiletest.rs
+++ b/src/tools/miri/tests/compiletest.rs
@@ -1,6 +1,6 @@
use colored::*;
use regex::bytes::Regex;
-use std::io::Write;
+use std::ffi::OsString;
use std::path::{Path, PathBuf};
use std::{env, process::Command};
use ui_test::status_emitter::StatusEmitter;
@@ -46,13 +46,7 @@ fn build_so_for_c_ffi_tests() -> PathBuf {
so_file_path
}
-fn test_config(
- args: impl Iterator<Item = String>,
- target: &str,
- path: &str,
- mode: Mode,
- with_dependencies: bool,
-) -> Config {
+fn test_config(target: &str, path: &str, mode: Mode, with_dependencies: bool) -> Config {
// Miri is rustc-like, so we create a default builder for rustc and modify it
let mut program = CommandBuilder::rustc();
program.program = miri_path();
@@ -110,9 +104,29 @@ fn test_config(
..Config::default()
};
+ let use_std = env::var_os("MIRI_NO_STD").is_none();
+
+ if with_dependencies && use_std {
+ config.dependencies_crate_manifest_path =
+ Some(Path::new("test_dependencies").join("Cargo.toml"));
+ config.dependency_builder.args = vec![
+ "run".into(),
+ "--manifest-path".into(),
+ "cargo-miri/Cargo.toml".into(),
+ "--".into(),
+ "miri".into(),
+ "run".into(), // There is no `cargo miri build` so we just use `cargo miri run`.
+ ];
+ }
+ config
+}
+
+fn run_tests(mode: Mode, path: &str, target: &str, with_dependencies: bool) -> Result<()> {
+ let mut config = test_config(target, path, mode, with_dependencies);
+
// Handle command-line arguments.
let mut after_dashdash = false;
- config.path_filter.extend(args.filter(|arg| {
+ config.path_filter.extend(std::env::args().skip(1).filter(|arg| {
if after_dashdash {
// Just propagate everything.
return true;
@@ -133,26 +147,6 @@ fn test_config(
}
}));
- let use_std = env::var_os("MIRI_NO_STD").is_none();
-
- if with_dependencies && use_std {
- config.dependencies_crate_manifest_path =
- Some(Path::new("test_dependencies").join("Cargo.toml"));
- config.dependency_builder.args = vec![
- "run".into(),
- "--manifest-path".into(),
- "cargo-miri/Cargo.toml".into(),
- "--".into(),
- "miri".into(),
- "run".into(), // There is no `cargo miri build` so we just use `cargo miri run`.
- ];
- }
- config
-}
-
-fn run_tests(mode: Mode, path: &str, target: &str, with_dependencies: bool) -> Result<()> {
- let config = test_config(std::env::args().skip(1), target, path, mode, with_dependencies);
-
eprintln!(" Compiler: {}", config.program.display());
ui_test::run_tests_generic(
config,
@@ -241,9 +235,12 @@ fn main() -> Result<()> {
let target = get_target();
- if let Some(first) = std::env::args().nth(1) {
+ let mut args = std::env::args_os();
+
+ // Skip the program name and check whether this is a `./miri run-dep` invocation
+ if let Some(first) = args.nth(1) {
if first == "--miri-run-dep-mode" {
- return run_dep_mode(target);
+ return run_dep_mode(target, args);
}
}
@@ -269,19 +266,17 @@ fn main() -> Result<()> {
Ok(())
}
-fn run_dep_mode(target: String) -> Result<()> {
- let files = std::env::args().skip(2);
- for path in files {
- let mut config = test_config(std::iter::empty(), &target, &path, Mode::Yolo, true);
- config.program.args.remove(0); // remove the `--error-format=json` argument
- config.program.args.push("--color".into());
- config.program.args.push("always".into());
- let output = ui_test::run_file(config, Path::new(&path))?;
- std::io::stderr().write_all(&output.stderr)?;
- std::io::stdout().write_all(&output.stdout)?;
- std::process::exit(output.status.code().unwrap());
- }
- Ok(())
+fn run_dep_mode(target: String, mut args: impl Iterator<Item = OsString>) -> Result<()> {
+ let path = args.next().expect("./miri run-dep must be followed by a file name");
+ let mut config = test_config(&target, "", Mode::Yolo, true);
+ config.program.args.remove(0); // remove the `--error-format=json` argument
+ config.program.args.push("--color".into());
+ config.program.args.push("always".into());
+ let mut cmd = ui_test::test_command(config, Path::new(&path))?;
+ cmd.arg("--");
+ cmd.args(args);
+ println!("{cmd:?}");
+ if cmd.spawn()?.wait()?.success() { Ok(()) } else { std::process::exit(1) }
}
/// This is a custom renderer for `ui_test` output that does not emit github actions