Skip to content

Commit efe3d84

Browse files
committed
Don't lookup span position when the span hasn't changed
This improves performance of FunctionDebugContext::define by ~60% Fixes #807
1 parent 660b5c3 commit efe3d84

File tree

1 file changed

+10
-1
lines changed

1 file changed

+10
-1
lines changed

src/debuginfo/line_info.rs

+10-1
Original file line numberDiff line numberDiff line change
@@ -123,8 +123,17 @@ impl<'a, 'tcx> FunctionDebugContext<'a, 'tcx> {
123123

124124
let line_strings = &mut self.debug_context.dwarf.line_strings;
125125
let function_span = self.mir.span;
126+
let mut last_span = None;
126127
let mut last_file = None;
127128
let mut create_row_for_span = |line_program: &mut LineProgram, span: Span| {
129+
if let Some(last_span) = last_span {
130+
if span == last_span {
131+
line_program.generate_row();
132+
return;
133+
}
134+
}
135+
last_span = Some(span);
136+
128137
// Based on https://github.com/rust-lang/rust/blob/e369d87b015a84653343032833d65d0545fd3f26/src/librustc_codegen_ssa/mir/mod.rs#L116-L131
129138
// In order to have a good line stepping behavior in debugger, we overwrite debug
130139
// locations of macro expansions with that of the outermost expansion site
@@ -150,7 +159,7 @@ impl<'a, 'tcx> FunctionDebugContext<'a, 'tcx> {
150159

151160
// line_program_add_file is very slow.
152161
// Optimize for the common case of the current file not being changed.
153-
let current_file_changed = if let Some(last_file) = &mut last_file {
162+
let current_file_changed = if let Some(last_file) = &last_file {
154163
// If the allocations are not equal, then the files may still be equal, but that
155164
// is not a problem, as this is just an optimization.
156165
!Lrc::ptr_eq(last_file, &file)

0 commit comments

Comments
 (0)