From e5796c46de20856f2eee0d8651572343d4fea9db Mon Sep 17 00:00:00 2001 From: Andy Wang Date: Sun, 5 Dec 2021 20:49:23 +0000 Subject: [PATCH 1/8] Apply path remapping to DW_AT_GNU_dwo_name --- compiler/rustc_codegen_llvm/src/debuginfo/metadata.rs | 9 ++++++--- src/test/run-make-fulldeps/split-dwarf/Makefile | 11 ++++++++++- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/compiler/rustc_codegen_llvm/src/debuginfo/metadata.rs b/compiler/rustc_codegen_llvm/src/debuginfo/metadata.rs index 10c7bb2eaea94..f15f81a83b051 100644 --- a/compiler/rustc_codegen_llvm/src/debuginfo/metadata.rs +++ b/compiler/rustc_codegen_llvm/src/debuginfo/metadata.rs @@ -1057,9 +1057,12 @@ pub fn compile_unit_metadata( let output_filenames = tcx.output_filenames(()); let out_dir = &output_filenames.out_directory; let split_name = if tcx.sess.target_can_use_split_dwarf() { - output_filenames - .split_dwarf_path(tcx.sess.split_debuginfo(), Some(codegen_unit_name)) - .map(|f| out_dir.join(f)) + output_filenames.split_dwarf_path(tcx.sess.split_debuginfo(), Some(codegen_unit_name)).map( + |f| { + let joined = out_dir.join(f); + tcx.sess.source_map().path_mapping().map_prefix(joined).0 + }, + ) } else { None } diff --git a/src/test/run-make-fulldeps/split-dwarf/Makefile b/src/test/run-make-fulldeps/split-dwarf/Makefile index ef61ff0450157..5fef8eac3524e 100644 --- a/src/test/run-make-fulldeps/split-dwarf/Makefile +++ b/src/test/run-make-fulldeps/split-dwarf/Makefile @@ -2,7 +2,16 @@ # only-linux -all: +all: packed remapped + +remapped: + $(RUSTC) -Z unstable-options -C split-debuginfo=packed -C debuginfo=2 --remap-path-prefix $$PWD= foo.rs -g + objdump -Wi $(TMPDIR)/foo | grep $$PWD && exit 1 || exit 0 + + $(RUSTC) -Z unstable-options -C split-debuginfo=unpacked -C debuginfo=2 --remap-path-prefix $$PWD= foo.rs -g + objdump -Wi $(TMPDIR)/foo | grep $$PWD && exit 1 || exit 0 + +packed: $(RUSTC) -Z unstable-options -C split-debuginfo=packed -C debuginfo=2 foo.rs -g rm $(TMPDIR)/foo.dwp rm $(TMPDIR)/$(call BIN,foo) From 4abed5000b73efdbf12fda2148aa14185461b370 Mon Sep 17 00:00:00 2001 From: Andy Wang Date: Mon, 6 Dec 2021 13:46:14 +0000 Subject: [PATCH 2/8] Provide .dwo paths to llvm-dwp explicitly --- compiler/rustc_codegen_ssa/src/back/link.rs | 19 ++++++++++++++----- .../run-make-fulldeps/split-dwarf/Makefile | 4 ++-- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/compiler/rustc_codegen_ssa/src/back/link.rs b/compiler/rustc_codegen_ssa/src/back/link.rs index 638b2a7b5a9f2..1d0e661fc0aeb 100644 --- a/compiler/rustc_codegen_ssa/src/back/link.rs +++ b/compiler/rustc_codegen_ssa/src/back/link.rs @@ -35,7 +35,7 @@ use object::{Architecture, BinaryFormat, Endianness, FileFlags, SectionFlags, Se use regex::Regex; use tempfile::Builder as TempFileBuilder; -use std::ffi::OsString; +use std::ffi::{OsStr, OsString}; use std::lazy::OnceCell; use std::path::{Path, PathBuf}; use std::process::{ExitStatus, Output, Stdio}; @@ -639,15 +639,17 @@ const LLVM_DWP_EXECUTABLE: &'static str = "rust-llvm-dwp"; /// Invoke `llvm-dwp` (shipped alongside rustc) to link `dwo` files from Split DWARF into a `dwp` /// file. -fn link_dwarf_object<'a>(sess: &'a Session, executable_out_filename: &Path) { +fn link_dwarf_object<'a, I>(sess: &'a Session, executable_out_filename: &Path, dwo_files: I) +where + I: IntoIterator>, +{ info!("preparing dwp to {}.dwp", executable_out_filename.to_str().unwrap()); let dwp_out_filename = executable_out_filename.with_extension("dwp"); let mut cmd = Command::new(LLVM_DWP_EXECUTABLE); - cmd.arg("-e"); - cmd.arg(executable_out_filename); cmd.arg("-o"); cmd.arg(&dwp_out_filename); + cmd.args(dwo_files); let mut new_path = sess.get_tools_search_paths(false); if let Some(path) = env::var_os("PATH") { @@ -1031,7 +1033,14 @@ fn link_natively<'a, B: ArchiveBuilder<'a>>( SplitDebuginfo::Packed if sess.target.is_like_msvc => {} // ... and otherwise we're processing a `*.dwp` packed dwarf file. - SplitDebuginfo::Packed => link_dwarf_object(sess, &out_filename), + // We cannot rely on the .dwo paths in the exectuable because they may have been + // remapped by --remap-path-prefix and therefore invalid. So we need to provide + // the .dwo paths explicitly + SplitDebuginfo::Packed => link_dwarf_object( + sess, + &out_filename, + codegen_results.modules.iter().filter_map(|m| m.dwarf_object.as_ref()), + ), } let strip = strip_value(sess); diff --git a/src/test/run-make-fulldeps/split-dwarf/Makefile b/src/test/run-make-fulldeps/split-dwarf/Makefile index 5fef8eac3524e..c5f649a13b4cf 100644 --- a/src/test/run-make-fulldeps/split-dwarf/Makefile +++ b/src/test/run-make-fulldeps/split-dwarf/Makefile @@ -5,10 +5,10 @@ all: packed remapped remapped: - $(RUSTC) -Z unstable-options -C split-debuginfo=packed -C debuginfo=2 --remap-path-prefix $$PWD= foo.rs -g + $(RUSTC) -Z unstable-options -C split-debuginfo=packed -C debuginfo=2 --remap-path-prefix $$PWD=/a foo.rs -g objdump -Wi $(TMPDIR)/foo | grep $$PWD && exit 1 || exit 0 - $(RUSTC) -Z unstable-options -C split-debuginfo=unpacked -C debuginfo=2 --remap-path-prefix $$PWD= foo.rs -g + $(RUSTC) -Z unstable-options -C split-debuginfo=unpacked -C debuginfo=2 --remap-path-prefix $$PWD=/a foo.rs -g objdump -Wi $(TMPDIR)/foo | grep $$PWD && exit 1 || exit 0 packed: From 32810223c6b743de889eda96b442f621c293a848 Mon Sep 17 00:00:00 2001 From: Andy Wang Date: Mon, 6 Dec 2021 18:10:16 +0000 Subject: [PATCH 3/8] Produce .dwo file for Packed as well --- compiler/rustc_codegen_llvm/src/back/write.rs | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/compiler/rustc_codegen_llvm/src/back/write.rs b/compiler/rustc_codegen_llvm/src/back/write.rs index 460a8cc69128e..8a73890ba9dc7 100644 --- a/compiler/rustc_codegen_llvm/src/back/write.rs +++ b/compiler/rustc_codegen_llvm/src/back/write.rs @@ -901,17 +901,14 @@ pub(crate) unsafe fn codegen( .generic_activity_with_arg("LLVM_module_codegen_emit_obj", &module.name[..]); let dwo_out = cgcx.output_filenames.temp_path_dwo(module_name); - let dwo_out = match cgcx.split_debuginfo { - // Don't change how DWARF is emitted in single mode (or when disabled). - SplitDebuginfo::Off | SplitDebuginfo::Packed => None, + let dwo_out = if cgcx.target_can_use_split_dwarf + && cgcx.split_debuginfo != SplitDebuginfo::Off + { // Emit (a subset of the) DWARF into a separate file in split mode. - SplitDebuginfo::Unpacked => { - if cgcx.target_can_use_split_dwarf { - Some(dwo_out.as_path()) - } else { - None - } - } + Some(dwo_out.as_path()) + } else { + // Don't change how DWARF is emitted in single mode (or when disabled). + None }; with_codegen(tm, llmod, config.no_builtins, |cpm| { @@ -948,7 +945,7 @@ pub(crate) unsafe fn codegen( Ok(module.into_compiled_module( config.emit_obj != EmitObj::None, - cgcx.target_can_use_split_dwarf && cgcx.split_debuginfo == SplitDebuginfo::Unpacked, + cgcx.target_can_use_split_dwarf && cgcx.split_debuginfo != SplitDebuginfo::Off, config.emit_bc, &cgcx.output_filenames, )) From 95fd357d8ae371dbf85b82bfa7f926dc1f966c72 Mon Sep 17 00:00:00 2001 From: Andy Wang Date: Mon, 6 Dec 2021 19:51:58 +0000 Subject: [PATCH 4/8] Correct test which wasn't failing correctly --- src/test/run-make-fulldeps/split-dwarf/Makefile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/test/run-make-fulldeps/split-dwarf/Makefile b/src/test/run-make-fulldeps/split-dwarf/Makefile index c5f649a13b4cf..eef04c767fb7c 100644 --- a/src/test/run-make-fulldeps/split-dwarf/Makefile +++ b/src/test/run-make-fulldeps/split-dwarf/Makefile @@ -5,11 +5,11 @@ all: packed remapped remapped: - $(RUSTC) -Z unstable-options -C split-debuginfo=packed -C debuginfo=2 --remap-path-prefix $$PWD=/a foo.rs -g - objdump -Wi $(TMPDIR)/foo | grep $$PWD && exit 1 || exit 0 + $(RUSTC) -Z unstable-options -C split-debuginfo=packed -C debuginfo=2 --remap-path-prefix $(TMPDIR)=/a foo.rs -g + objdump -Wi $(TMPDIR)/foo | grep DW_AT_GNU_dwo_name | (! grep $(TMPDIR)) || exit 1 - $(RUSTC) -Z unstable-options -C split-debuginfo=unpacked -C debuginfo=2 --remap-path-prefix $$PWD=/a foo.rs -g - objdump -Wi $(TMPDIR)/foo | grep $$PWD && exit 1 || exit 0 + $(RUSTC) -Z unstable-options -C split-debuginfo=unpacked -C debuginfo=2 --remap-path-prefix $(TMPDIR)=/a foo.rs -g + objdump -Wi $(TMPDIR)/foo | grep DW_AT_GNU_dwo_name | (! grep $(TMPDIR)) || exit 1 packed: $(RUSTC) -Z unstable-options -C split-debuginfo=packed -C debuginfo=2 foo.rs -g From 42190bb42e06f87e24f9b4280a996175e97b73ab Mon Sep 17 00:00:00 2001 From: Andy Wang Date: Mon, 6 Dec 2021 23:59:59 +0000 Subject: [PATCH 5/8] Remove redundant path join --- compiler/rustc_codegen_llvm/src/debuginfo/metadata.rs | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/compiler/rustc_codegen_llvm/src/debuginfo/metadata.rs b/compiler/rustc_codegen_llvm/src/debuginfo/metadata.rs index f15f81a83b051..0549bf853b955 100644 --- a/compiler/rustc_codegen_llvm/src/debuginfo/metadata.rs +++ b/compiler/rustc_codegen_llvm/src/debuginfo/metadata.rs @@ -1055,14 +1055,11 @@ pub fn compile_unit_metadata( let work_dir = tcx.sess.opts.working_dir.to_string_lossy(FileNameDisplayPreference::Remapped); let flags = "\0"; let output_filenames = tcx.output_filenames(()); - let out_dir = &output_filenames.out_directory; let split_name = if tcx.sess.target_can_use_split_dwarf() { - output_filenames.split_dwarf_path(tcx.sess.split_debuginfo(), Some(codegen_unit_name)).map( - |f| { - let joined = out_dir.join(f); - tcx.sess.source_map().path_mapping().map_prefix(joined).0 - }, - ) + output_filenames + .split_dwarf_path(tcx.sess.split_debuginfo(), Some(codegen_unit_name)) + // We get a path relative to the working directory from split_dwarf_path + .map(|f| tcx.sess.source_map().path_mapping().map_prefix(f).0) } else { None } From 3d16a20c7aa117773a957db9893f83a1cb3bd653 Mon Sep 17 00:00:00 2001 From: Andy Wang Date: Sat, 11 Dec 2021 01:11:57 +0000 Subject: [PATCH 6/8] Remap path in MCOptions --- compiler/rustc_codegen_llvm/src/back/write.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/compiler/rustc_codegen_llvm/src/back/write.rs b/compiler/rustc_codegen_llvm/src/back/write.rs index 8a73890ba9dc7..1ddc0cf8b9b72 100644 --- a/compiler/rustc_codegen_llvm/src/back/write.rs +++ b/compiler/rustc_codegen_llvm/src/back/write.rs @@ -205,8 +205,11 @@ pub fn target_machine_factory( let use_init_array = !sess.opts.debugging_opts.use_ctors_section.unwrap_or(sess.target.use_ctors_section); + let path_mapping = sess.source_map().path_mapping().clone(); + Arc::new(move |config: TargetMachineFactoryConfig| { - let split_dwarf_file = config.split_dwarf_file.unwrap_or_default(); + let split_dwarf_file = + path_mapping.map_prefix(config.split_dwarf_file.unwrap_or_default()).0; let split_dwarf_file = CString::new(split_dwarf_file.to_str().unwrap()).unwrap(); let tm = unsafe { From 707f72c1dffc33f2980945371aa4fb2d9f77af6d Mon Sep 17 00:00:00 2001 From: Andy Wang Date: Mon, 13 Dec 2021 11:40:59 +0000 Subject: [PATCH 7/8] Revert "Produce .dwo file for Packed as well" This reverts commit 32810223c6b743de889eda96b442f621c293a848. --- compiler/rustc_codegen_llvm/src/back/write.rs | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/compiler/rustc_codegen_llvm/src/back/write.rs b/compiler/rustc_codegen_llvm/src/back/write.rs index 1ddc0cf8b9b72..10170bd7b0ebf 100644 --- a/compiler/rustc_codegen_llvm/src/back/write.rs +++ b/compiler/rustc_codegen_llvm/src/back/write.rs @@ -904,14 +904,17 @@ pub(crate) unsafe fn codegen( .generic_activity_with_arg("LLVM_module_codegen_emit_obj", &module.name[..]); let dwo_out = cgcx.output_filenames.temp_path_dwo(module_name); - let dwo_out = if cgcx.target_can_use_split_dwarf - && cgcx.split_debuginfo != SplitDebuginfo::Off - { - // Emit (a subset of the) DWARF into a separate file in split mode. - Some(dwo_out.as_path()) - } else { + let dwo_out = match cgcx.split_debuginfo { // Don't change how DWARF is emitted in single mode (or when disabled). - None + SplitDebuginfo::Off | SplitDebuginfo::Packed => None, + // Emit (a subset of the) DWARF into a separate file in split mode. + SplitDebuginfo::Unpacked => { + if cgcx.target_can_use_split_dwarf { + Some(dwo_out.as_path()) + } else { + None + } + } }; with_codegen(tm, llmod, config.no_builtins, |cpm| { @@ -948,7 +951,7 @@ pub(crate) unsafe fn codegen( Ok(module.into_compiled_module( config.emit_obj != EmitObj::None, - cgcx.target_can_use_split_dwarf && cgcx.split_debuginfo != SplitDebuginfo::Off, + cgcx.target_can_use_split_dwarf && cgcx.split_debuginfo == SplitDebuginfo::Unpacked, config.emit_bc, &cgcx.output_filenames, )) From 5e481d07d2f962cda0bdb76a1e6c19d99c1be847 Mon Sep 17 00:00:00 2001 From: Andy Wang Date: Mon, 13 Dec 2021 12:09:10 +0000 Subject: [PATCH 8/8] Provide object files to llvm-dwp instead of .dwo --- compiler/rustc_codegen_ssa/src/back/link.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/compiler/rustc_codegen_ssa/src/back/link.rs b/compiler/rustc_codegen_ssa/src/back/link.rs index 1d0e661fc0aeb..aaecb26f4a031 100644 --- a/compiler/rustc_codegen_ssa/src/back/link.rs +++ b/compiler/rustc_codegen_ssa/src/back/link.rs @@ -637,9 +637,9 @@ fn escape_stdout_stderr_string(s: &[u8]) -> String { const LLVM_DWP_EXECUTABLE: &'static str = "rust-llvm-dwp"; -/// Invoke `llvm-dwp` (shipped alongside rustc) to link `dwo` files from Split DWARF into a `dwp` +/// Invoke `llvm-dwp` (shipped alongside rustc) to link debuginfo in object files into a `dwp` /// file. -fn link_dwarf_object<'a, I>(sess: &'a Session, executable_out_filename: &Path, dwo_files: I) +fn link_dwarf_object<'a, I>(sess: &'a Session, executable_out_filename: &Path, object_files: I) where I: IntoIterator>, { @@ -649,7 +649,7 @@ where let mut cmd = Command::new(LLVM_DWP_EXECUTABLE); cmd.arg("-o"); cmd.arg(&dwp_out_filename); - cmd.args(dwo_files); + cmd.args(object_files); let mut new_path = sess.get_tools_search_paths(false); if let Some(path) = env::var_os("PATH") { @@ -1033,13 +1033,13 @@ fn link_natively<'a, B: ArchiveBuilder<'a>>( SplitDebuginfo::Packed if sess.target.is_like_msvc => {} // ... and otherwise we're processing a `*.dwp` packed dwarf file. - // We cannot rely on the .dwo paths in the exectuable because they may have been + // We cannot rely on the .o paths in the exectuable because they may have been // remapped by --remap-path-prefix and therefore invalid. So we need to provide - // the .dwo paths explicitly + // the .o paths explicitly SplitDebuginfo::Packed => link_dwarf_object( sess, &out_filename, - codegen_results.modules.iter().filter_map(|m| m.dwarf_object.as_ref()), + codegen_results.modules.iter().filter_map(|m| m.object.as_ref()), ), }