Auto merge of #115214 - Urgau:rfc-3127-trim-paths, r=compiler-errors · rust-lang/rust@94c4e5c (original) (raw)
`@@ -547,48 +547,77 @@ pub fn file_metadata<'ll>(cx: &CodegenCx<'ll, '_>, source_file: &SourceFile) ->
`
547
547
`) -> &'ll DIFile {
`
548
548
`debug!(?source_file.name);
`
549
549
``
``
550
`+
use rustc_session::RemapFileNameExt;
`
550
551
`let (directory, file_name) = match &source_file.name {
`
551
552
`FileName::Real(filename) => {
`
552
553
`let working_directory = &cx.sess().opts.working_dir;
`
553
554
`debug!(?working_directory);
`
554
555
``
555
``
`-
let filename = cx
`
556
``
`-
.sess()
`
557
``
`-
.source_map()
`
558
``
`-
.path_mapping()
`
559
``
`-
.to_embeddable_absolute_path(filename.clone(), working_directory);
`
560
``
-
561
``
`-
// Construct the absolute path of the file
`
562
``
`-
let abs_path = filename.remapped_path_if_available();
`
563
``
`-
debug!(?abs_path);
`
564
``
-
565
``
`-
if let Ok(rel_path) =
`
566
``
`-
abs_path.strip_prefix(working_directory.remapped_path_if_available())
`
567
``
`-
{
`
568
``
`-
// If the compiler's working directory (which also is the DW_AT_comp_dir of
`
569
``
`-
// the compilation unit) is a prefix of the path we are about to emit, then
`
570
``
`-
// only emit the part relative to the working directory.
`
571
``
`` -
// Because of path remapping we sometimes see strange things here: abs_path
``
572
``
`-
// might actually look like a relative path
`
573
``
`` -
// (e.g. <crate-name-and-version>/src/lib.rs
), so if we emit it without
``
574
``
`-
// taking the working directory into account, downstream tooling will
`
575
``
`` -
// interpret it as <working-directory>/<crate-name-and-version>/src/lib.rs
,
``
576
``
`-
// which makes no sense. Usually in such cases the working directory will also
`
577
``
`` -
// be remapped to <crate-name-and-version>
or some other prefix of the path
``
578
``
`-
// we are remapping, so we end up with
`
579
``
`` -
// <crate-name-and-version>/<crate-name-and-version>/src/lib.rs
.
``
580
``
`` -
// By moving the working directory portion into the directory
part of the
``
581
``
`-
// DIFile, we allow LLVM to emit just the relative path for DWARF, while
`
582
``
`-
// still emitting the correct absolute path for CodeView.
`
583
``
`-
(
`
584
``
`-
working_directory.to_string_lossy(FileNameDisplayPreference::Remapped),
`
585
``
`-
rel_path.to_string_lossy().into_owned(),
`
586
``
`-
)
`
``
556
`+
if cx.sess().should_prefer_remapped_for_codegen() {
`
``
557
`+
let filename = cx
`
``
558
`+
.sess()
`
``
559
`+
.source_map()
`
``
560
`+
.path_mapping()
`
``
561
`+
.to_embeddable_absolute_path(filename.clone(), working_directory);
`
``
562
+
``
563
`+
// Construct the absolute path of the file
`
``
564
`+
let abs_path = filename.remapped_path_if_available();
`
``
565
`+
debug!(?abs_path);
`
``
566
+
``
567
`+
if let Ok(rel_path) =
`
``
568
`+
abs_path.strip_prefix(working_directory.remapped_path_if_available())
`
``
569
`+
{
`
``
570
`+
// If the compiler's working directory (which also is the DW_AT_comp_dir of
`
``
571
`+
// the compilation unit) is a prefix of the path we are about to emit, then
`
``
572
`+
// only emit the part relative to the working directory.
`
``
573
`` +
// Because of path remapping we sometimes see strange things here: abs_path
``
``
574
`+
// might actually look like a relative path
`
``
575
`` +
// (e.g. <crate-name-and-version>/src/lib.rs
), so if we emit it without
``
``
576
`+
// taking the working directory into account, downstream tooling will
`
``
577
`` +
// interpret it as <working-directory>/<crate-name-and-version>/src/lib.rs
,
``
``
578
`+
// which makes no sense. Usually in such cases the working directory will also
`
``
579
`` +
// be remapped to <crate-name-and-version>
or some other prefix of the path
``
``
580
`+
// we are remapping, so we end up with
`
``
581
`` +
// <crate-name-and-version>/<crate-name-and-version>/src/lib.rs
.
``
``
582
`` +
// By moving the working directory portion into the directory
part of the
``
``
583
`+
// DIFile, we allow LLVM to emit just the relative path for DWARF, while
`
``
584
`+
// still emitting the correct absolute path for CodeView.
`
``
585
`+
(
`
``
586
`+
working_directory.to_string_lossy(FileNameDisplayPreference::Remapped),
`
``
587
`+
rel_path.to_string_lossy().into_owned(),
`
``
588
`+
)
`
``
589
`+
} else {
`
``
590
`+
("".into(), abs_path.to_string_lossy().into_owned())
`
``
591
`+
}
`
587
592
`} else {
`
588
``
`-
("".into(), abs_path.to_string_lossy().into_owned())
`
``
593
`+
let working_directory = working_directory.local_path_if_available();
`
``
594
`+
let filename = filename.local_path_if_available();
`
``
595
+
``
596
`+
debug!(?working_directory, ?filename);
`
``
597
+
``
598
`+
let abs_path: Cow<'_, Path> = if filename.is_absolute() {
`
``
599
`+
filename.into()
`
``
600
`+
} else {
`
``
601
`+
let mut p = PathBuf::new();
`
``
602
`+
p.push(working_directory);
`
``
603
`+
p.push(filename);
`
``
604
`+
p.into()
`
``
605
`+
};
`
``
606
+
``
607
`+
if let Ok(rel_path) = abs_path.strip_prefix(working_directory) {
`
``
608
`+
(
`
``
609
`+
working_directory.to_string_lossy().into(),
`
``
610
`+
rel_path.to_string_lossy().into_owned(),
`
``
611
`+
)
`
``
612
`+
} else {
`
``
613
`+
("".into(), abs_path.to_string_lossy().into_owned())
`
``
614
`+
}
`
589
615
`}
`
590
616
`}
`
591
``
`-
other => ("".into(), other.prefer_remapped().to_string_lossy().into_owned()),
`
``
617
`+
other => {
`
``
618
`+
debug!(?other);
`
``
619
`+
("".into(), other.for_codegen(cx.sess()).to_string_lossy().into_owned())
`
``
620
`+
}
`
592
621
`};
`
593
622
``
594
623
`let hash_kind = match source_file.src_hash.kind {
`
`@@ -822,8 +851,9 @@ pub fn build_compile_unit_di_node<'ll, 'tcx>(
`
822
851
`// FIXME(#41252) Remove "clang LLVM" if we can get GDB and LLVM to play nice.
`
823
852
`let producer = format!("clang LLVM ({rustc_producer})");
`
824
853
``
``
854
`+
use rustc_session::RemapFileNameExt;
`
825
855
`let name_in_debuginfo = name_in_debuginfo.to_string_lossy();
`
826
``
`-
let work_dir = tcx.sess.opts.working_dir.to_string_lossy(FileNameDisplayPreference::Remapped);
`
``
856
`+
let work_dir = tcx.sess.opts.working_dir.for_codegen(&tcx.sess).to_string_lossy();
`
827
857
`let flags = "\0";
`
828
858
`let output_filenames = tcx.output_filenames(());
`
829
859
`let split_name = if tcx.sess.target_can_use_split_dwarf() {
`
`@@ -834,7 +864,13 @@ pub fn build_compile_unit_di_node<'ll, 'tcx>(
`
834
864
`Some(codegen_unit_name),
`
835
865
`)
`
836
866
`// We get a path relative to the working directory from split_dwarf_path
`
837
``
`-
.map(|f| tcx.sess.source_map().path_mapping().map_prefix(f).0)
`
``
867
`+
.map(|f| {
`
``
868
`+
if tcx.sess.should_prefer_remapped_for_split_debuginfo_paths() {
`
``
869
`+
tcx.sess.source_map().path_mapping().map_prefix(f).0
`
``
870
`+
} else {
`
``
871
`+
f.into()
`
``
872
`+
}
`
``
873
`+
})
`
838
874
`} else {
`
839
875
`None
`
840
876
`}
`