Skip to content

Commit c5d9401

Browse files
committed
Avoid symbol interning in file_metadata.
This commit changes `created_files` so it uses strings directly as keys, rather than symbols derived from the strings. This avoids the cost of having to do the hash table lookups to produce the symbols from the strings. The commit also uses `entry` to avoid doing a repeated hash table lookup (`get` + `insert`). Note that PR #60467 improved this code somewhat; this is a further improvement.
1 parent 128b4c8 commit c5d9401

File tree

2 files changed

+34
-34
lines changed

2 files changed

+34
-34
lines changed

src/librustc_codegen_llvm/debuginfo/metadata.rs

+32-32
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,15 @@ use rustc_data_structures::small_c_str::SmallCStr;
3838
use rustc_target::abi::HasDataLayout;
3939

4040
use libc::{c_uint, c_longlong};
41+
use std::collections::hash_map::Entry;
4142
use std::ffi::CString;
4243
use std::fmt::{self, Write};
4344
use std::hash::{Hash, Hasher};
4445
use std::iter;
4546
use std::ptr;
4647
use std::path::{Path, PathBuf};
4748
use syntax::ast;
48-
use syntax::symbol::{Interner, InternedString, Symbol};
49+
use syntax::symbol::{Interner, InternedString};
4950
use syntax_pos::{self, Span, FileName};
5051

5152
impl 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

803802
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)
805804
}
806805

807806
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>)
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

835835
fn basic_type_metadata(cx: &CodegenCx<'ll, 'tcx>, t: Ty<'tcx>) -> &'ll DIType {

src/librustc_codegen_llvm/debuginfo/mod.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ use std::ffi::CString;
3737

3838
use syntax_pos::{self, Span, Pos};
3939
use syntax::ast;
40-
use syntax::symbol::{Symbol, InternedString};
40+
use syntax::symbol::InternedString;
4141
use rustc::ty::layout::{self, LayoutOf, HasTyCtxt};
4242
use rustc_codegen_ssa::traits::*;
4343

@@ -63,7 +63,7 @@ pub struct CrateDebugContext<'a, 'tcx> {
6363
llcontext: &'a llvm::Context,
6464
llmod: &'a llvm::Module,
6565
builder: &'a mut DIBuilder<'a>,
66-
created_files: RefCell<FxHashMap<(Option<Symbol>, Option<Symbol>), &'a DIFile>>,
66+
created_files: RefCell<FxHashMap<(Option<String>, Option<String>), &'a DIFile>>,
6767
created_enum_disr_types: RefCell<FxHashMap<(DefId, layout::Primitive), &'a DIType>>,
6868

6969
type_map: RefCell<TypeMap<'a, 'tcx>>,

0 commit comments

Comments
 (0)