Skip to content

Commit 1f75f0f

Browse files
committed
Move FileId caching to DebugContext::add_source_file
1 parent 41246b2 commit 1f75f0f

File tree

4 files changed

+58
-78
lines changed

4 files changed

+58
-78
lines changed

src/base.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,6 @@ pub(crate) fn codegen_fn<'tcx>(
9595
caller_location: None, // set by `codegen_fn_prelude`
9696

9797
clif_comments,
98-
last_source_file: None,
9998
next_ssa_var: 0,
10099
};
101100

src/common.rs

Lines changed: 2 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
use cranelift_codegen::isa::TargetFrontendConfig;
2-
use gimli::write::FileId;
3-
use rustc_data_structures::sync::Lrc;
42
use rustc_index::IndexVec;
53
use rustc_middle::ty::layout::{
64
FnAbiError, FnAbiOfHelpers, FnAbiRequest, LayoutError, LayoutOfHelpers,
75
};
86
use rustc_span::source_map::Spanned;
9-
use rustc_span::SourceFile;
107
use rustc_target::abi::call::FnAbi;
118
use rustc_target::abi::{Integer, Primitive};
129
use rustc_target::spec::{HasTargetSpec, Target};
@@ -305,11 +302,6 @@ pub(crate) struct FunctionCx<'m, 'clif, 'tcx: 'm> {
305302

306303
pub(crate) clif_comments: crate::pretty_clif::CommentWriter,
307304

308-
/// Last accessed source file and it's debuginfo file id.
309-
///
310-
/// For optimization purposes only
311-
pub(crate) last_source_file: Option<(Lrc<SourceFile>, FileId)>,
312-
313305
/// This should only be accessed by `CPlace::new_var`.
314306
pub(crate) next_ssa_var: u32,
315307
}
@@ -419,25 +411,8 @@ impl<'tcx> FunctionCx<'_, '_, 'tcx> {
419411

420412
pub(crate) fn set_debug_loc(&mut self, source_info: mir::SourceInfo) {
421413
if let Some(debug_context) = &mut self.cx.debug_context {
422-
let (file, line, column) =
423-
DebugContext::get_span_loc(self.tcx, self.mir.span, source_info.span);
424-
425-
// add_source_file is very slow.
426-
// Optimize for the common case of the current file not being changed.
427-
let mut cached_file_id = None;
428-
if let Some((ref last_source_file, last_file_id)) = self.last_source_file {
429-
// If the allocations are not equal, the files may still be equal, but that
430-
// doesn't matter, as this is just an optimization.
431-
if rustc_data_structures::sync::Lrc::ptr_eq(last_source_file, &file) {
432-
cached_file_id = Some(last_file_id);
433-
}
434-
}
435-
436-
let file_id = if let Some(file_id) = cached_file_id {
437-
file_id
438-
} else {
439-
debug_context.add_source_file(&file)
440-
};
414+
let (file_id, line, column) =
415+
debug_context.get_span_loc(self.tcx, self.mir.span, source_info.span);
441416

442417
let source_loc =
443418
self.func_debug_cx.as_mut().unwrap().add_dbg_loc(file_id, line, column);

src/debuginfo/line_info.rs

Lines changed: 52 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ use cranelift_codegen::MachSrcLoc;
88
use gimli::write::{
99
Address, AttributeValue, FileId, FileInfo, LineProgram, LineString, LineStringTable,
1010
};
11-
use rustc_data_structures::sync::Lrc;
1211
use rustc_span::{
1312
FileName, Pos, SourceFile, SourceFileAndLine, SourceFileHash, SourceFileHashAlgorithm,
1413
};
@@ -60,72 +59,78 @@ fn make_file_info(hash: SourceFileHash) -> Option<FileInfo> {
6059

6160
impl DebugContext {
6261
pub(crate) fn get_span_loc(
62+
&mut self,
6363
tcx: TyCtxt<'_>,
6464
function_span: Span,
6565
span: Span,
66-
) -> (Lrc<SourceFile>, u64, u64) {
66+
) -> (FileId, u64, u64) {
6767
// Based on https://github.com/rust-lang/rust/blob/e369d87b015a84653343032833d65d0545fd3f26/src/librustc_codegen_ssa/mir/mod.rs#L116-L131
6868
// In order to have a good line stepping behavior in debugger, we overwrite debug
6969
// locations of macro expansions with that of the outermost expansion site (when the macro is
7070
// annotated with `#[collapse_debuginfo]` or when `-Zdebug-macros` is provided).
7171
let span = tcx.collapsed_debuginfo(span, function_span);
7272
match tcx.sess.source_map().lookup_line(span.lo()) {
7373
Ok(SourceFileAndLine { sf: file, line }) => {
74+
let file_id = self.add_source_file(&file);
7475
let line_pos = file.lines()[line];
7576
let col = file.relative_position(span.lo()) - line_pos;
7677

77-
(file, u64::try_from(line).unwrap() + 1, u64::from(col.to_u32()) + 1)
78+
(file_id, u64::try_from(line).unwrap() + 1, u64::from(col.to_u32()) + 1)
7879
}
79-
Err(file) => (file, 0, 0),
80+
Err(file) => (self.add_source_file(&file), 0, 0),
8081
}
8182
}
8283

8384
pub(crate) fn add_source_file(&mut self, source_file: &SourceFile) -> FileId {
84-
let line_program: &mut LineProgram = &mut self.dwarf.unit.line_program;
85-
let line_strings: &mut LineStringTable = &mut self.dwarf.line_strings;
86-
87-
match &source_file.name {
88-
FileName::Real(path) => {
89-
let (dir_path, file_name) =
90-
split_path_dir_and_file(if self.should_remap_filepaths {
91-
path.remapped_path_if_available()
92-
} else {
93-
path.local_path_if_available()
94-
});
95-
let dir_name = osstr_as_utf8_bytes(dir_path.as_os_str());
96-
let file_name = osstr_as_utf8_bytes(file_name);
97-
98-
let dir_id = if !dir_name.is_empty() {
99-
let dir_name = LineString::new(dir_name, line_program.encoding(), line_strings);
100-
line_program.add_directory(dir_name)
101-
} else {
102-
line_program.default_directory()
103-
};
104-
let file_name = LineString::new(file_name, line_program.encoding(), line_strings);
105-
106-
let info = make_file_info(source_file.src_hash);
107-
108-
line_program.file_has_md5 &= info.is_some();
109-
line_program.add_file(file_name, dir_id, info)
110-
}
111-
// FIXME give more appropriate file names
112-
filename => {
113-
let dir_id = line_program.default_directory();
114-
let dummy_file_name = LineString::new(
115-
filename
116-
.display(if self.should_remap_filepaths {
117-
FileNameDisplayPreference::Remapped
85+
let cache_key = (source_file.stable_id, source_file.src_hash);
86+
*self.created_files.entry(cache_key).or_insert_with(|| {
87+
let line_program: &mut LineProgram = &mut self.dwarf.unit.line_program;
88+
let line_strings: &mut LineStringTable = &mut self.dwarf.line_strings;
89+
90+
match &source_file.name {
91+
FileName::Real(path) => {
92+
let (dir_path, file_name) =
93+
split_path_dir_and_file(if self.should_remap_filepaths {
94+
path.remapped_path_if_available()
11895
} else {
119-
FileNameDisplayPreference::Local
120-
})
121-
.to_string()
122-
.into_bytes(),
123-
line_program.encoding(),
124-
line_strings,
125-
);
126-
line_program.add_file(dummy_file_name, dir_id, None)
96+
path.local_path_if_available()
97+
});
98+
let dir_name = osstr_as_utf8_bytes(dir_path.as_os_str());
99+
let file_name = osstr_as_utf8_bytes(file_name);
100+
101+
let dir_id = if !dir_name.is_empty() {
102+
let dir_name =
103+
LineString::new(dir_name, line_program.encoding(), line_strings);
104+
line_program.add_directory(dir_name)
105+
} else {
106+
line_program.default_directory()
107+
};
108+
let file_name =
109+
LineString::new(file_name, line_program.encoding(), line_strings);
110+
111+
let info = make_file_info(source_file.src_hash);
112+
113+
line_program.file_has_md5 &= info.is_some();
114+
line_program.add_file(file_name, dir_id, info)
115+
}
116+
filename => {
117+
let dir_id = line_program.default_directory();
118+
let dummy_file_name = LineString::new(
119+
filename
120+
.display(if self.should_remap_filepaths {
121+
FileNameDisplayPreference::Remapped
122+
} else {
123+
FileNameDisplayPreference::Local
124+
})
125+
.to_string()
126+
.into_bytes(),
127+
line_program.encoding(),
128+
line_strings,
129+
);
130+
line_program.add_file(dummy_file_name, dir_id, None)
131+
}
127132
}
128-
}
133+
})
129134
}
130135
}
131136

src/debuginfo/mod.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ use indexmap::IndexSet;
1616
use rustc_codegen_ssa::debuginfo::type_names;
1717
use rustc_hir::def_id::DefIdMap;
1818
use rustc_session::Session;
19+
use rustc_span::{SourceFileHash, StableSourceFileId};
1920

2021
pub(crate) use self::emit::{DebugReloc, DebugRelocName};
2122
pub(crate) use self::unwind::UnwindContext;
@@ -30,6 +31,7 @@ pub(crate) struct DebugContext {
3031

3132
dwarf: DwarfUnit,
3233
unit_range_list: RangeList,
34+
created_files: FxHashMap<(StableSourceFileId, SourceFileHash), FileId>,
3335
stack_pointer_register: Register,
3436
namespace_map: DefIdMap<UnitEntryId>,
3537

@@ -130,6 +132,7 @@ impl DebugContext {
130132
endian,
131133
dwarf,
132134
unit_range_list: RangeList(Vec::new()),
135+
created_files: FxHashMap::default(),
133136
stack_pointer_register,
134137
namespace_map: DefIdMap::default(),
135138
should_remap_filepaths,
@@ -169,9 +172,7 @@ impl DebugContext {
169172
linkage_name: &str,
170173
function_span: Span,
171174
) -> FunctionDebugContext {
172-
let (file, line, column) = DebugContext::get_span_loc(tcx, function_span, function_span);
173-
174-
let file_id = self.add_source_file(&file);
175+
let (file_id, line, column) = self.get_span_loc(tcx, function_span, function_span);
175176

176177
// FIXME: add to appropriate scope instead of root
177178
let scope = self.item_namespace(tcx, tcx.parent(instance.def_id()));

0 commit comments

Comments
 (0)