From de87e7ca34ae172c2b2d0e25a49b8101c61275f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Ber=C3=A1nek?= Date: Sat, 23 Mar 2024 15:30:55 +0100 Subject: [PATCH] Do not strip debuginfo by default for MSVC --- src/cargo/ops/cargo_compile/mod.rs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/cargo/ops/cargo_compile/mod.rs b/src/cargo/ops/cargo_compile/mod.rs index 7eed3cc1ef22..e9e58d69b762 100644 --- a/src/cargo/ops/cargo_compile/mod.rs +++ b/src/cargo/ops/cargo_compile/mod.rs @@ -436,6 +436,7 @@ pub fn create_bcx<'a, 'gctx>( &units, &scrape_units, host_kind_requested.then_some(explicit_host_kind), + &target_data, ); let mut extra_compiler_args = HashMap::new(); @@ -575,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 @@ -591,6 +593,7 @@ fn rebuild_unit_graph_shared( root, false, to_host, + target_data, ) }) .collect(); @@ -617,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. @@ -634,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 { @@ -657,8 +662,13 @@ fn traverse_and_share( _ => unit.kind, }; + let is_target_windows_msvc = target_data + .short_name(&unit.kind) + .ends_with("-pc-windows-msvc"); 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.