@@ -38,14 +38,15 @@ use rustc_data_structures::small_c_str::SmallCStr;
38
38
use rustc_target:: abi:: HasDataLayout ;
39
39
40
40
use libc:: { c_uint, c_longlong} ;
41
+ use std:: collections:: hash_map:: Entry ;
41
42
use std:: ffi:: CString ;
42
43
use std:: fmt:: { self , Write } ;
43
44
use std:: hash:: { Hash , Hasher } ;
44
45
use std:: iter;
45
46
use std:: ptr;
46
47
use std:: path:: { Path , PathBuf } ;
47
48
use syntax:: ast;
48
- use syntax:: symbol:: { Interner , InternedString , Symbol } ;
49
+ use syntax:: symbol:: { Interner , InternedString } ;
49
50
use syntax_pos:: { self , Span , FileName } ;
50
51
51
52
impl PartialEq for llvm:: Metadata {
@@ -787,49 +788,48 @@ pub fn file_metadata(cx: &CodegenCx<'ll, '_>,
787
788
file_name,
788
789
defining_crate) ;
789
790
790
- let file_name = & file_name. to_string ( ) ;
791
- let file_name_symbol = Symbol :: intern ( file_name) ;
792
- if defining_crate == LOCAL_CRATE {
793
- let directory = & cx. sess ( ) . working_dir . 0 . to_string_lossy ( ) ;
794
- file_metadata_raw ( cx, file_name, Some ( file_name_symbol) ,
795
- directory, Some ( Symbol :: intern ( directory) ) )
791
+ let file_name = Some ( file_name. to_string ( ) ) ;
792
+ let directory = if defining_crate == LOCAL_CRATE {
793
+ Some ( cx. sess ( ) . working_dir . 0 . to_string_lossy ( ) . to_string ( ) )
796
794
} else {
797
795
// If the path comes from an upstream crate we assume it has been made
798
796
// independent of the compiler's working directory one way or another.
799
- file_metadata_raw ( cx, file_name, Some ( file_name_symbol) , "" , None )
800
- }
797
+ None
798
+ } ;
799
+ file_metadata_raw ( cx, file_name, directory)
801
800
}
802
801
803
802
pub fn unknown_file_metadata ( cx : & CodegenCx < ' ll , ' _ > ) -> & ' ll DIFile {
804
- file_metadata_raw ( cx, "<unknown>" , None , "" , None )
803
+ file_metadata_raw ( cx, None , None )
805
804
}
806
805
807
806
fn file_metadata_raw ( cx : & CodegenCx < ' ll , ' _ > ,
808
- file_name : & str ,
809
- file_name_symbol : Option < Symbol > ,
810
- directory : & str ,
811
- directory_symbol : Option < Symbol > )
807
+ file_name : Option < String > ,
808
+ directory : Option < String > )
812
809
-> & ' ll DIFile {
813
- let key = ( file_name_symbol, directory_symbol) ;
810
+ let key = ( file_name, directory) ;
811
+
812
+ match debug_context ( cx) . created_files . borrow_mut ( ) . entry ( key) {
813
+ Entry :: Occupied ( o) => return o. get ( ) ,
814
+ Entry :: Vacant ( v) => {
815
+ let ( file_name, directory) = v. key ( ) ;
816
+ debug ! ( "file_metadata: file_name: {:?}, directory: {:?}" , file_name, directory) ;
817
+
818
+ let file_name = SmallCStr :: new (
819
+ if let Some ( file_name) = file_name { & file_name } else { "<unknown>" } ) ;
820
+ let directory = SmallCStr :: new (
821
+ if let Some ( directory) = directory { & directory } else { "" } ) ;
822
+
823
+ let file_metadata = unsafe {
824
+ llvm:: LLVMRustDIBuilderCreateFile ( DIB ( cx) ,
825
+ file_name. as_ptr ( ) ,
826
+ directory. as_ptr ( ) )
827
+ } ;
814
828
815
- if let Some ( file_metadata) = debug_context ( cx) . created_files . borrow ( ) . get ( & key) {
816
- return * file_metadata;
829
+ v. insert ( file_metadata) ;
830
+ file_metadata
831
+ }
817
832
}
818
-
819
- debug ! ( "file_metadata: file_name: {}, directory: {}" , file_name, directory) ;
820
-
821
- let file_name = SmallCStr :: new ( file_name) ;
822
- let directory = SmallCStr :: new ( directory) ;
823
-
824
- let file_metadata = unsafe {
825
- llvm:: LLVMRustDIBuilderCreateFile ( DIB ( cx) ,
826
- file_name. as_ptr ( ) ,
827
- directory. as_ptr ( ) )
828
- } ;
829
-
830
- let mut created_files = debug_context ( cx) . created_files . borrow_mut ( ) ;
831
- created_files. insert ( key, file_metadata) ;
832
- file_metadata
833
833
}
834
834
835
835
fn basic_type_metadata ( cx : & CodegenCx < ' ll , ' tcx > , t : Ty < ' tcx > ) -> & ' ll DIType {
0 commit comments