From d5235f91ad4807a955bace31668c03c5afa353eb Mon Sep 17 00:00:00 2001 From: Paul Gey Date: Tue, 28 May 2024 22:28:55 +0200 Subject: [PATCH 1/3] Fix "local crate" detection `PackageId` is an opaque identifier whose internal format is subject to change, so looking up the names of local crates by ID is more robust than parsing the ID. Resolves #3643. --- src/tools/miri/cargo-miri/src/util.rs | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/tools/miri/cargo-miri/src/util.rs b/src/tools/miri/cargo-miri/src/util.rs index 5b6a391aabcd..f36cff1f7981 100644 --- a/src/tools/miri/cargo-miri/src/util.rs +++ b/src/tools/miri/cargo-miri/src/util.rs @@ -1,3 +1,4 @@ +use std::collections::HashMap; use std::env; use std::ffi::OsString; use std::fs::File; @@ -233,21 +234,18 @@ pub fn get_cargo_metadata() -> Metadata { } /// Pulls all the crates in this workspace from the cargo metadata. -/// Workspace members are emitted like "miri 0.1.0 (path+file:///path/to/miri)" /// Additionally, somewhere between cargo metadata and TyCtxt, '-' gets replaced with '_' so we /// make that same transformation here. pub fn local_crates(metadata: &Metadata) -> String { assert!(!metadata.workspace_members.is_empty()); - let mut local_crates = String::new(); - for member in &metadata.workspace_members { - let name = member.repr.split(' ').next().unwrap(); - let name = name.replace('-', "_"); - local_crates.push_str(&name); - local_crates.push(','); - } - local_crates.pop(); // Remove the trailing ',' - - local_crates + let package_name_by_id: HashMap<_, _> = + metadata.packages.iter().map(|package| (&package.id, package.name.as_str())).collect(); + metadata + .workspace_members + .iter() + .map(|id| package_name_by_id[id].replace('-', "_")) + .collect::>() + .join(",") } /// Debug-print a command that is going to be run. From a9631038983cf01c4e47823ff4dd24ab0a507869 Mon Sep 17 00:00:00 2001 From: Paul Gey Date: Tue, 28 May 2024 23:07:44 +0200 Subject: [PATCH 2/3] add tests for local crate detection --- src/tools/miri/test-cargo-miri/Cargo.lock | 4 ++++ src/tools/miri/test-cargo-miri/Cargo.toml | 2 +- src/tools/miri/test-cargo-miri/run-test.py | 4 ++++ src/tools/miri/test-cargo-miri/run.local_crate.stderr.ref | 0 src/tools/miri/test-cargo-miri/run.local_crate.stdout.ref | 1 + .../test-cargo-miri/test-local-crate-detection/Cargo.toml | 4 ++++ .../test-cargo-miri/test-local-crate-detection/src/main.rs | 3 +++ 7 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 src/tools/miri/test-cargo-miri/run.local_crate.stderr.ref create mode 100644 src/tools/miri/test-cargo-miri/run.local_crate.stdout.ref create mode 100644 src/tools/miri/test-cargo-miri/test-local-crate-detection/Cargo.toml create mode 100644 src/tools/miri/test-cargo-miri/test-local-crate-detection/src/main.rs diff --git a/src/tools/miri/test-cargo-miri/Cargo.lock b/src/tools/miri/test-cargo-miri/Cargo.lock index 4783f79ea8fb..8f618e7ffb38 100644 --- a/src/tools/miri/test-cargo-miri/Cargo.lock +++ b/src/tools/miri/test-cargo-miri/Cargo.lock @@ -123,6 +123,10 @@ dependencies = [ "byteorder 1.5.0", ] +[[package]] +name = "test-local-crate-detection" +version = "0.1.0" + [[package]] name = "unicode-ident" version = "1.0.12" diff --git a/src/tools/miri/test-cargo-miri/Cargo.toml b/src/tools/miri/test-cargo-miri/Cargo.toml index bfef388669d1..574f1d05a6fa 100644 --- a/src/tools/miri/test-cargo-miri/Cargo.toml +++ b/src/tools/miri/test-cargo-miri/Cargo.toml @@ -1,5 +1,5 @@ [workspace] -members = ["subcrate", "issue-1567", "exported-symbol-dep"] +members = ["subcrate", "issue-1567", "exported-symbol-dep", "test-local-crate-detection"] exclude = ["no-std-smoke"] # it wants to be panic="abort" [package] diff --git a/src/tools/miri/test-cargo-miri/run-test.py b/src/tools/miri/test-cargo-miri/run-test.py index 83f3e4c919b9..d855c333a756 100755 --- a/src/tools/miri/test-cargo-miri/run-test.py +++ b/src/tools/miri/test-cargo-miri/run-test.py @@ -131,6 +131,10 @@ def test_cargo_miri_run(): cargo_miri("run") + ["--target-dir=custom-run", "--", "--target-dir=target/custom-run"], "run.args.stdout.ref", "run.custom-target-dir.stderr.ref", ) + test("`cargo miri run --package=test-local-crate-detection` (test local crate detection)", + cargo_miri("run") + ["--package=test-local-crate-detection"], + "run.local_crate.stdout.ref", "run.local_crate.stderr.ref", + ) def test_cargo_miri_test(): # rustdoc is not run on foreign targets diff --git a/src/tools/miri/test-cargo-miri/run.local_crate.stderr.ref b/src/tools/miri/test-cargo-miri/run.local_crate.stderr.ref new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/src/tools/miri/test-cargo-miri/run.local_crate.stdout.ref b/src/tools/miri/test-cargo-miri/run.local_crate.stdout.ref new file mode 100644 index 000000000000..1587de9ff3f8 --- /dev/null +++ b/src/tools/miri/test-cargo-miri/run.local_crate.stdout.ref @@ -0,0 +1 @@ +subcrate,issue_1567,exported_symbol_dep,test_local_crate_detection,cargo_miri_test,cdylib,exported_symbol,issue_1691,issue_1705,issue_rust_86261,proc_macro_crate diff --git a/src/tools/miri/test-cargo-miri/test-local-crate-detection/Cargo.toml b/src/tools/miri/test-cargo-miri/test-local-crate-detection/Cargo.toml new file mode 100644 index 000000000000..2d41b210d4c1 --- /dev/null +++ b/src/tools/miri/test-cargo-miri/test-local-crate-detection/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "test-local-crate-detection" +version = "0.1.0" +edition = "2021" diff --git a/src/tools/miri/test-cargo-miri/test-local-crate-detection/src/main.rs b/src/tools/miri/test-cargo-miri/test-local-crate-detection/src/main.rs new file mode 100644 index 000000000000..94acf9b7b229 --- /dev/null +++ b/src/tools/miri/test-cargo-miri/test-local-crate-detection/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("{}", env!("MIRI_LOCAL_CRATES")); +} From 00644c12ed77e6f3e5bf38d98e359d101e3f9188 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Thu, 30 May 2024 10:23:54 +0200 Subject: [PATCH 3/3] add a comment --- .../miri/test-cargo-miri/test-local-crate-detection/src/main.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/tools/miri/test-cargo-miri/test-local-crate-detection/src/main.rs b/src/tools/miri/test-cargo-miri/test-local-crate-detection/src/main.rs index 94acf9b7b229..0991aa384607 100644 --- a/src/tools/miri/test-cargo-miri/test-local-crate-detection/src/main.rs +++ b/src/tools/miri/test-cargo-miri/test-local-crate-detection/src/main.rs @@ -1,3 +1,5 @@ fn main() { + // Make sure we detect all crates from this workspace as "local". + // The env var is set during the "build" so we can use `env!` to access it directly. println!("{}", env!("MIRI_LOCAL_CRATES")); }