@@ -539,48 +539,77 @@ pub fn file_metadata<'ll>(cx: &CodegenCx<'ll, '_>, source_file: &SourceFile) ->
539
539
) -> & ' ll DIFile {
540
540
debug ! ( ?source_file. name) ;
541
541
542
+ use rustc_session:: RemapFileNameExt ;
542
543
let ( directory, file_name) = match & source_file. name {
543
544
FileName :: Real ( filename) => {
544
545
let working_directory = & cx. sess ( ) . opts . working_dir ;
545
546
debug ! ( ?working_directory) ;
546
547
547
- let filename = cx
548
- . sess ( )
549
- . source_map ( )
550
- . path_mapping ( )
551
- . to_embeddable_absolute_path ( filename. clone ( ) , working_directory) ;
552
-
553
- // Construct the absolute path of the file
554
- let abs_path = filename. remapped_path_if_available ( ) ;
555
- debug ! ( ?abs_path) ;
556
-
557
- if let Ok ( rel_path) =
558
- abs_path. strip_prefix ( working_directory. remapped_path_if_available ( ) )
559
- {
560
- // If the compiler's working directory (which also is the DW_AT_comp_dir of
561
- // the compilation unit) is a prefix of the path we are about to emit, then
562
- // only emit the part relative to the working directory.
563
- // Because of path remapping we sometimes see strange things here: `abs_path`
564
- // might actually look like a relative path
565
- // (e.g. `<crate-name-and-version>/src/lib.rs`), so if we emit it without
566
- // taking the working directory into account, downstream tooling will
567
- // interpret it as `<working-directory>/<crate-name-and-version>/src/lib.rs`,
568
- // which makes no sense. Usually in such cases the working directory will also
569
- // be remapped to `<crate-name-and-version>` or some other prefix of the path
570
- // we are remapping, so we end up with
571
- // `<crate-name-and-version>/<crate-name-and-version>/src/lib.rs`.
572
- // By moving the working directory portion into the `directory` part of the
573
- // DIFile, we allow LLVM to emit just the relative path for DWARF, while
574
- // still emitting the correct absolute path for CodeView.
575
- (
576
- working_directory. to_string_lossy ( FileNameDisplayPreference :: Remapped ) ,
577
- rel_path. to_string_lossy ( ) . into_owned ( ) ,
578
- )
548
+ if cx. sess ( ) . should_prefer_remapped_for_codegen ( ) {
549
+ let filename = cx
550
+ . sess ( )
551
+ . source_map ( )
552
+ . path_mapping ( )
553
+ . to_embeddable_absolute_path ( filename. clone ( ) , working_directory) ;
554
+
555
+ // Construct the absolute path of the file
556
+ let abs_path = filename. remapped_path_if_available ( ) ;
557
+ debug ! ( ?abs_path) ;
558
+
559
+ if let Ok ( rel_path) =
560
+ abs_path. strip_prefix ( working_directory. remapped_path_if_available ( ) )
561
+ {
562
+ // If the compiler's working directory (which also is the DW_AT_comp_dir of
563
+ // the compilation unit) is a prefix of the path we are about to emit, then
564
+ // only emit the part relative to the working directory.
565
+ // Because of path remapping we sometimes see strange things here: `abs_path`
566
+ // might actually look like a relative path
567
+ // (e.g. `<crate-name-and-version>/src/lib.rs`), so if we emit it without
568
+ // taking the working directory into account, downstream tooling will
569
+ // interpret it as `<working-directory>/<crate-name-and-version>/src/lib.rs`,
570
+ // which makes no sense. Usually in such cases the working directory will also
571
+ // be remapped to `<crate-name-and-version>` or some other prefix of the path
572
+ // we are remapping, so we end up with
573
+ // `<crate-name-and-version>/<crate-name-and-version>/src/lib.rs`.
574
+ // By moving the working directory portion into the `directory` part of the
575
+ // DIFile, we allow LLVM to emit just the relative path for DWARF, while
576
+ // still emitting the correct absolute path for CodeView.
577
+ (
578
+ working_directory. to_string_lossy ( FileNameDisplayPreference :: Remapped ) ,
579
+ rel_path. to_string_lossy ( ) . into_owned ( ) ,
580
+ )
581
+ } else {
582
+ ( "" . into ( ) , abs_path. to_string_lossy ( ) . into_owned ( ) )
583
+ }
579
584
} else {
580
- ( "" . into ( ) , abs_path. to_string_lossy ( ) . into_owned ( ) )
585
+ let working_directory = working_directory. local_path_if_available ( ) ;
586
+ let filename = filename. local_path_if_available ( ) ;
587
+
588
+ debug ! ( ?working_directory, ?filename) ;
589
+
590
+ let abs_path: Cow < ' _ , Path > = if filename. is_absolute ( ) {
591
+ filename. into ( )
592
+ } else {
593
+ let mut p = PathBuf :: new ( ) ;
594
+ p. push ( working_directory) ;
595
+ p. push ( filename) ;
596
+ p. into ( )
597
+ } ;
598
+
599
+ if let Ok ( rel_path) = abs_path. strip_prefix ( working_directory) {
600
+ (
601
+ working_directory. to_string_lossy ( ) . into ( ) ,
602
+ rel_path. to_string_lossy ( ) . into_owned ( ) ,
603
+ )
604
+ } else {
605
+ ( "" . into ( ) , abs_path. to_string_lossy ( ) . into_owned ( ) )
606
+ }
581
607
}
582
608
}
583
- other => ( "" . into ( ) , other. prefer_remapped ( ) . to_string_lossy ( ) . into_owned ( ) ) ,
609
+ other => {
610
+ debug ! ( ?other) ;
611
+ ( "" . into ( ) , other. for_codegen ( cx. sess ( ) ) . to_string_lossy ( ) . into_owned ( ) )
612
+ }
584
613
} ;
585
614
586
615
let hash_kind = match source_file. src_hash . kind {
@@ -814,8 +843,9 @@ pub fn build_compile_unit_di_node<'ll, 'tcx>(
814
843
// FIXME(#41252) Remove "clang LLVM" if we can get GDB and LLVM to play nice.
815
844
let producer = format ! ( "clang LLVM ({rustc_producer})" ) ;
816
845
846
+ use rustc_session:: RemapFileNameExt ;
817
847
let name_in_debuginfo = name_in_debuginfo. to_string_lossy ( ) ;
818
- let work_dir = tcx. sess . opts . working_dir . to_string_lossy ( FileNameDisplayPreference :: Remapped ) ;
848
+ let work_dir = tcx. sess . opts . working_dir . for_codegen ( & tcx . sess ) . to_string_lossy ( ) ;
819
849
let flags = "\0 " ;
820
850
let output_filenames = tcx. output_filenames ( ( ) ) ;
821
851
let split_name = if tcx. sess . target_can_use_split_dwarf ( ) {
@@ -826,7 +856,13 @@ pub fn build_compile_unit_di_node<'ll, 'tcx>(
826
856
Some ( codegen_unit_name) ,
827
857
)
828
858
// We get a path relative to the working directory from split_dwarf_path
829
- . map ( |f| tcx. sess . source_map ( ) . path_mapping ( ) . map_prefix ( f) . 0 )
859
+ . map ( |f| {
860
+ if tcx. sess . should_prefer_remapped_for_split_debuginfo_paths ( ) {
861
+ tcx. sess . source_map ( ) . path_mapping ( ) . map_prefix ( f) . 0
862
+ } else {
863
+ f. into ( )
864
+ }
865
+ } )
830
866
} else {
831
867
None
832
868
}
0 commit comments