@@ -38,14 +38,15 @@ use rustc_data_structures::small_c_str::SmallCStr;
3838use rustc_target:: abi:: HasDataLayout ;
3939
4040use libc:: { c_uint, c_longlong} ;
41+ use std:: collections:: hash_map:: Entry ;
4142use std:: ffi:: CString ;
4243use std:: fmt:: { self , Write } ;
4344use std:: hash:: { Hash , Hasher } ;
4445use std:: iter;
4546use std:: ptr;
4647use std:: path:: { Path , PathBuf } ;
4748use syntax:: ast;
48- use syntax:: symbol:: { Interner , InternedString , Symbol } ;
49+ use syntax:: symbol:: { Interner , InternedString } ;
4950use syntax_pos:: { self , Span , FileName } ;
5051
5152impl PartialEq for llvm:: Metadata {
@@ -787,49 +788,48 @@ pub fn file_metadata(cx: &CodegenCx<'ll, '_>,
787788 file_name,
788789 defining_crate) ;
789790
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 ( ) )
796794 } else {
797795 // If the path comes from an upstream crate we assume it has been made
798796 // 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)
801800}
802801
803802pub fn unknown_file_metadata ( cx : & CodegenCx < ' ll , ' _ > ) -> & ' ll DIFile {
804- file_metadata_raw ( cx, "<unknown>" , None , "" , None )
803+ file_metadata_raw ( cx, None , None )
805804}
806805
807806fn 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 > )
812809 -> & ' 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+ } ;
814828
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+ }
817832 }
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
833833}
834834
835835fn basic_type_metadata ( cx : & CodegenCx < ' ll , ' tcx > , t : Ty < ' tcx > ) -> & ' ll DIType {
0 commit comments