From da061047afae84039f4551b5fc1f6cc7bb84ca36 Mon Sep 17 00:00:00 2001 From: Weihang Lo Date: Tue, 26 Mar 2024 13:03:27 -0400 Subject: [PATCH 1/2] Do not strip debuginfo by default for MSVC MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jakub Beránek --- src/cargo/ops/cargo_compile/mod.rs | 13 ++++++++++++- tests/testsuite/profiles.rs | 27 +++++++++++++++++++++++++++ tests/testsuite/run.rs | 2 ++ 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/cargo/ops/cargo_compile/mod.rs b/src/cargo/ops/cargo_compile/mod.rs index 04ebe7db1e4..43c4935c665 100644 --- a/src/cargo/ops/cargo_compile/mod.rs +++ b/src/cargo/ops/cargo_compile/mod.rs @@ -35,6 +35,7 @@ //! [`drain_the_queue`]: crate::core::compiler::job_queue //! ["Cargo Target"]: https://doc.rust-lang.org/nightly/cargo/reference/cargo-targets.html +use cargo_platform::Cfg; use std::collections::{HashMap, HashSet}; use std::hash::{Hash, Hasher}; use std::sync::Arc; @@ -443,6 +444,7 @@ pub fn create_bcx<'a, 'cfg>( &units, &scrape_units, host_kind_requested.then_some(explicit_host_kind), + &target_data, ); } @@ -574,6 +576,7 @@ fn rebuild_unit_graph_shared( roots: &[Unit], scrape_units: &[Unit], to_host: Option, + target_data: &RustcTargetData<'_>, ) -> (Vec, Vec, UnitGraph) { let mut result = UnitGraph::new(); // Map of the old unit to the new unit, used to avoid recursing into units @@ -590,6 +593,7 @@ fn rebuild_unit_graph_shared( root, false, to_host, + target_data, ) }) .collect(); @@ -616,6 +620,7 @@ fn traverse_and_share( unit: &Unit, unit_is_for_host: bool, to_host: Option, + target_data: &RustcTargetData<'_>, ) -> Unit { if let Some(new_unit) = memo.get(unit) { // Already computed, no need to recompute. @@ -633,6 +638,7 @@ fn traverse_and_share( &dep.unit, dep.unit_for.is_for_host(), to_host, + target_data, ); new_dep_unit.hash(&mut dep_hash); UnitDep { @@ -656,8 +662,13 @@ fn traverse_and_share( _ => unit.kind, }; + let cfg = target_data.cfg(unit.kind); + let is_target_windows_msvc = cfg.contains(&Cfg::Name("windows".to_string())) + && cfg.contains(&Cfg::KeyPair("target_env".to_string(), "msvc".to_string())); let mut profile = unit.profile.clone(); - if profile.strip.is_deferred() { + // For MSVC, rustc currently treats -Cstrip=debuginfo same as -Cstrip=symbols, which causes + // this optimization to also remove symbols and thus break backtraces. + if profile.strip.is_deferred() && !is_target_windows_msvc { // If strip was not manually set, and all dependencies of this unit together // with this unit have debuginfo turned off, we enable debuginfo stripping. // This will remove pre-existing debug symbols coming from the standard library. diff --git a/tests/testsuite/profiles.rs b/tests/testsuite/profiles.rs index 20368ff3e8f..ee4adadbfe1 100644 --- a/tests/testsuite/profiles.rs +++ b/tests/testsuite/profiles.rs @@ -611,7 +611,9 @@ fn strip_accepts_false_to_disable_strip() { .run(); } +// Temporarily disabled on Windows due to https://github.com/rust-lang/rust/issues/122857 #[cargo_test] +#[cfg(not(windows))] fn strip_debuginfo_in_release() { let p = project() .file( @@ -630,7 +632,32 @@ fn strip_debuginfo_in_release() { .run(); } +// Using -Cstrip=debuginfo in release mode by default is temporarily disabled on Windows due to +// https://github.com/rust-lang/rust/issues/122857 #[cargo_test] +#[cfg(all(target_os = "windows", target_env = "msvc"))] +fn do_not_strip_debuginfo_in_release_on_windows() { + let p = project() + .file( + "Cargo.toml", + r#" + [package] + name = "foo" + version = "0.1.0" + edition = "2015" + "#, + ) + .file("src/main.rs", "fn main() {}") + .build(); + + p.cargo("build --release -v") + .with_stderr_does_not_contain("[..]strip=debuginfo[..]") + .run(); +} + +// Temporarily disabled on Windows due to https://github.com/rust-lang/rust/issues/122857 +#[cargo_test] +#[cfg(not(windows))] fn strip_debuginfo_without_debug() { let p = project() .file( diff --git a/tests/testsuite/run.rs b/tests/testsuite/run.rs index 8d983b2e02c..33595767cbe 100644 --- a/tests/testsuite/run.rs +++ b/tests/testsuite/run.rs @@ -735,7 +735,9 @@ fn one_bin_multiple_examples() { .run(); } +// Temporarily disabled on Windows due to https://github.com/rust-lang/rust/issues/122857 #[cargo_test] +#[cfg(not(windows))] fn example_with_release_flag() { let p = project() .file( From 2cb25a237b60ed972fd364760acb8a92f5e4cf93 Mon Sep 17 00:00:00 2001 From: Weihang Lo Date: Tue, 26 Mar 2024 13:52:27 -0400 Subject: [PATCH 2/2] chore: bump Cargo to 0.78.1 --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d70a6b4fb93..8fa8ac98350 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -252,7 +252,7 @@ dependencies = [ [[package]] name = "cargo" -version = "0.78.0" +version = "0.78.1" dependencies = [ "annotate-snippets", "anstream", diff --git a/Cargo.toml b/Cargo.toml index 1d7cc8509b7..ce6513c01de 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -124,7 +124,7 @@ self_named_module_files = "warn" [package] name = "cargo" -version = "0.78.0" +version = "0.78.1" edition.workspace = true license.workspace = true rust-version = "1.75.0" # MSRV:1