Skip to content

Commit

Permalink
Auto merge of #11572 - khuey:dwp, r=weihanglo
Browse files Browse the repository at this point in the history
Make cargo aware of dwp files.

When using -Csplit-debuginfo=packed on Linux, rustc will produce a dwp file. Unlike the dwo files, whose paths are embedded into the binary, there's no information in the binary to help a debugger locate a dwp file. By convention, the dwp file for `<EXE>` is given the name `<EXE>.dwp` and placed next to `<EXE>`.

When cargo hardlinks the executable file rustc put in target/debug/deps into target/debug, it also needs to hardlink the dwp file along with it. Failing to do this prevents the debugger from finding the dwp file when the binary is executed from target/debug, as there's no way for the debugger to know to look in the deps subdirectory.

The split_debuginfo option is passed down into file_types to make this possible. For cargo clean manual handling is added to match the other split_debuginfo files. bin_link_for_target also passes in None because it won't care about the dwp file.
  • Loading branch information
bors committed Jan 30, 2023
2 parents f6cf5ab + a393267 commit 99b1369
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 4 deletions.
13 changes: 9 additions & 4 deletions crates/cargo-test-support/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -832,12 +832,17 @@ impl Execs {
self
}

pub fn enable_split_debuginfo_packed(&mut self) -> &mut Self {
self.env("CARGO_PROFILE_DEV_SPLIT_DEBUGINFO", "packed")
.env("CARGO_PROFILE_TEST_SPLIT_DEBUGINFO", "packed")
.env("CARGO_PROFILE_RELEASE_SPLIT_DEBUGINFO", "packed")
.env("CARGO_PROFILE_BENCH_SPLIT_DEBUGINFO", "packed");
self
}

pub fn enable_mac_dsym(&mut self) -> &mut Self {
if cfg!(target_os = "macos") {
self.env("CARGO_PROFILE_DEV_SPLIT_DEBUGINFO", "packed")
.env("CARGO_PROFILE_TEST_SPLIT_DEBUGINFO", "packed")
.env("CARGO_PROFILE_RELEASE_SPLIT_DEBUGINFO", "packed")
.env("CARGO_PROFILE_BENCH_SPLIT_DEBUGINFO", "packed");
return self.enable_split_debuginfo_packed();
}
self
}
Expand Down
19 changes: 19 additions & 0 deletions src/cargo/core/compiler/build_context/target_info.rs
Original file line number Diff line number Diff line change
Expand Up @@ -473,6 +473,25 @@ impl TargetInfo {
// preserved.
should_replace_hyphens: true,
})
} else {
// Because DWARF Package (dwp) files are produced after the
// fact by another tool, there is nothing in the binary that
// provides a means to locate them. By convention, debuggers
// take the binary filename and append ".dwp" (including to
// binaries that already have an extension such as shared libs)
// to find the dwp.
ret.push(FileType {
// It is important to preserve the existing suffix for
// e.g. shared libraries, where the dwp for libfoo.so is
// expected to be at libfoo.so.dwp.
suffix: format!("{suffix}.dwp"),
prefix: prefix.clone(),
flavor: FileFlavor::DebugInfo,
crate_type: Some(crate_type.clone()),
// Likewise, the dwp needs to match the primary artifact's
// hyphenation exactly.
should_replace_hyphens: crate_type != CrateType::Bin,
})
}
}

Expand Down
2 changes: 2 additions & 0 deletions src/cargo/ops/cargo_clean.rs
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,8 @@ pub fn clean(ws: &Workspace<'_>, opts: &CleanOptions<'_>) -> CargoResult<()> {
rm_rf_glob(&split_debuginfo_obj, config, &mut progress)?;
let split_debuginfo_dwo = dir_glob.join(format!("{}.*.dwo", crate_name));
rm_rf_glob(&split_debuginfo_dwo, config, &mut progress)?;
let split_debuginfo_dwp = dir_glob.join(format!("{}.*.dwp", crate_name));
rm_rf_glob(&split_debuginfo_dwp, config, &mut progress)?;

// Remove the uplifted copy.
if let Some(uplift_dir) = uplift_dir {
Expand Down
23 changes: 23 additions & 0 deletions tests/testsuite/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5216,6 +5216,29 @@ fn uplift_pdb_of_bin_on_windows() {
assert!(!p.target_debug_dir().join("d.pdb").exists());
}

#[cargo_test]
#[cfg(target_os = "linux")]
fn uplift_dwp_of_bin_on_linux() {
let p = project()
.file("src/main.rs", "fn main() { panic!(); }")
.file("src/bin/b.rs", "fn main() { panic!(); }")
.file("src/bin/foo-bar.rs", "fn main() { panic!(); }")
.file("examples/c.rs", "fn main() { panic!(); }")
.file("tests/d.rs", "fn main() { panic!(); }")
.build();

p.cargo("build --bins --examples --tests")
.enable_split_debuginfo_packed()
.run();
assert!(p.target_debug_dir().join("foo.dwp").is_file());
assert!(p.target_debug_dir().join("b.dwp").is_file());
assert!(p.target_debug_dir().join("examples/c.dwp").exists());
assert!(p.target_debug_dir().join("foo-bar").is_file());
assert!(p.target_debug_dir().join("foo-bar.dwp").is_file());
assert!(!p.target_debug_dir().join("c.dwp").exists());
assert!(!p.target_debug_dir().join("d.dwp").exists());
}

// Ensure that `cargo build` chooses the correct profile for building
// targets based on filters (assuming `--profile` is not specified).
#[cargo_test]
Expand Down

0 comments on commit 99b1369

Please sign in to comment.