Rollup merge of #128627 - khuey:DUMMY_SP-line-no, r=nnethercote
Special case DUMMY_SP to emit line 0/column 0 locations on DWARF platforms. Line 0 has a special meaning in DWARF. From the version 5 spec: The compiler may emit the value 0 in cases where an instruction cannot be attributed to any source line. DUMMY_SP spans cannot be attributed to any line. However, because rustc internally stores line numbers starting at zero, lookup_debug_loc() adjusts every line number by one. Special casing DUMMY_SP to actually emit line 0 ensures rustc communicates to the debugger that there's no meaningful source code for this instruction, rather than telling the debugger to jump to line 1 randomly.
This commit is contained in:
commit
dea325e583
2 changed files with 56 additions and 1 deletions
|
@ -570,7 +570,17 @@ impl<'ll, 'tcx> DebugInfoMethods<'tcx> for CodegenCx<'ll, 'tcx> {
|
||||||
inlined_at: Option<&'ll DILocation>,
|
inlined_at: Option<&'ll DILocation>,
|
||||||
span: Span,
|
span: Span,
|
||||||
) -> &'ll DILocation {
|
) -> &'ll DILocation {
|
||||||
let DebugLoc { line, col, .. } = self.lookup_debug_loc(span.lo());
|
// When emitting debugging information, DWARF (i.e. everything but MSVC)
|
||||||
|
// treats line 0 as a magic value meaning that the code could not be
|
||||||
|
// attributed to any line in the source. That's also exactly what dummy
|
||||||
|
// spans are. Make that equivalence here, rather than passing dummy spans
|
||||||
|
// to lookup_debug_loc, which will return line 1 for them.
|
||||||
|
let (line, col) = if span.is_dummy() && !self.sess().target.is_like_msvc {
|
||||||
|
(0, 0)
|
||||||
|
} else {
|
||||||
|
let DebugLoc { line, col, .. } = self.lookup_debug_loc(span.lo());
|
||||||
|
(line, col)
|
||||||
|
};
|
||||||
|
|
||||||
unsafe { llvm::LLVMRustDIBuilderCreateDebugLocation(line, col, scope, inlined_at) }
|
unsafe { llvm::LLVMRustDIBuilderCreateDebugLocation(line, col, scope, inlined_at) }
|
||||||
}
|
}
|
||||||
|
|
45
tests/debuginfo/dummy_span.rs
Normal file
45
tests/debuginfo/dummy_span.rs
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
//@ min-lldb-version: 310
|
||||||
|
|
||||||
|
//@ compile-flags:-g
|
||||||
|
|
||||||
|
// === GDB TESTS ===================================================================================
|
||||||
|
|
||||||
|
// gdb-command:run 7
|
||||||
|
|
||||||
|
// gdb-command:next
|
||||||
|
// gdb-command:next
|
||||||
|
// gdb-check:[...]#loc1[...]
|
||||||
|
// gdb-command:next
|
||||||
|
// gdb-check:[...]#loc2[...]
|
||||||
|
|
||||||
|
// === LLDB TESTS ==================================================================================
|
||||||
|
|
||||||
|
// lldb-command:run 7
|
||||||
|
|
||||||
|
// lldb-command:next
|
||||||
|
// lldb-command:next
|
||||||
|
// lldb-command:frame select
|
||||||
|
// lldb-check:[...]#loc1[...]
|
||||||
|
// lldb-command:next
|
||||||
|
// lldb-command:frame select
|
||||||
|
// lldb-check:[...]#loc2[...]
|
||||||
|
|
||||||
|
use std::env;
|
||||||
|
use std::num::ParseIntError;
|
||||||
|
|
||||||
|
fn main() -> Result<(), ParseIntError> {
|
||||||
|
let args = env::args();
|
||||||
|
let number_str = args.skip(1).next().unwrap();
|
||||||
|
let number = number_str.parse::<i32>()?;
|
||||||
|
zzz(); // #break
|
||||||
|
if number % 7 == 0 {
|
||||||
|
// This generates code with a dummy span for
|
||||||
|
// some reason. If that ever changes this
|
||||||
|
// test will not test what it wants to test.
|
||||||
|
return Ok(()); // #loc1
|
||||||
|
}
|
||||||
|
println!("{}", number);
|
||||||
|
Ok(())
|
||||||
|
} // #loc2
|
||||||
|
|
||||||
|
fn zzz() { () }
|
Loading…
Add table
Add a link
Reference in a new issue