about summary refs log tree commit diff
path: root/tests/debuginfo
diff options
context:
space:
mode:
authorMatthias Krüger <matthias.krueger@famsik.de>2024-08-21 18:15:01 +0200
committerGitHub <noreply@github.com>2024-08-21 18:15:01 +0200
commitdea325e583adfcb9fec771da547dc304e79a5ee2 (patch)
tree504b1213a2f410b0570185c2a31f5bc9b4a337cf /tests/debuginfo
parent982c6f8721416431ec62bb0b9105c0578a9fc603 (diff)
parent4e9725cd2f5327f65f881c59d6bcbae46308318e (diff)
downloadrust-dea325e583adfcb9fec771da547dc304e79a5ee2.tar.gz
rust-dea325e583adfcb9fec771da547dc304e79a5ee2.zip
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.
Diffstat (limited to 'tests/debuginfo')
-rw-r--r--tests/debuginfo/dummy_span.rs45
1 files changed, 45 insertions, 0 deletions
diff --git a/tests/debuginfo/dummy_span.rs b/tests/debuginfo/dummy_span.rs
new file mode 100644
index 00000000000..d02eead470f
--- /dev/null
+++ b/tests/debuginfo/dummy_span.rs
@@ -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() { () }