Skip to content

Commit 6a342a6

Browse files
committed
Auto merge of #1575 - Aaron1011:fix/macro-backtrace, r=oli-obk
Use macro callsite spans in backtrace This mirrors what we do in the debuginfo used for runtime backtraces.
2 parents dbdc127 + 8e88282 commit 6a342a6

File tree

4 files changed

+20
-6
lines changed

4 files changed

+20
-6
lines changed

src/shims/backtrace.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,13 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
2626

2727
let mut data = Vec::new();
2828
for frame in this.active_thread_stack().iter().rev() {
29-
data.push((frame.instance, frame.current_span().lo()));
29+
let mut span = frame.current_span();
30+
// Match the behavior of runtime backtrace spans
31+
// by using a non-macro span in our backtrace. See `FunctionCx::debug_loc`.
32+
if span.from_expansion() && !tcx.sess.opts.debugging_opts.debug_macros {
33+
span = rustc_span::hygiene::walk_chain(span, frame.body.span.ctxt())
34+
}
35+
data.push((frame.instance, span.lo()));
3036
}
3137

3238
let ptrs: Vec<_> = data.into_iter().map(|(instance, pos)| {

tests/run-pass/backtrace-api.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,13 @@ struct MiriFrame {
1818

1919
#[inline(never)] fn func_a() -> Box<[*mut ()]> { func_b::<u8>() }
2020
#[inline(never)] fn func_b<T>() -> Box<[*mut ()]> { func_c() }
21-
#[inline(never)] fn func_c() -> Box<[*mut ()]> { unsafe { miri_get_backtrace(0) } }
21+
22+
macro_rules! invoke_func_d {
23+
() => { func_d() }
24+
}
25+
26+
#[inline(never)] fn func_c() -> Box<[*mut ()]> { invoke_func_d!() }
27+
#[inline(never)] fn func_d() -> Box<[*mut ()]> { unsafe { miri_get_backtrace(0) } }
2228

2329
fn main() {
2430
let mut seen_main = false;

tests/run-pass/backtrace-api.stderr

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
$DIR/backtrace-api.rs:21:59 (func_c)
1+
$DIR/backtrace-api.rs:27:59 (func_d)
2+
$DIR/backtrace-api.rs:26:50 (func_c)
23
$DIR/backtrace-api.rs:20:53 (func_b)
34
$DIR/backtrace-api.rs:19:50 (func_a)
4-
$DIR/backtrace-api.rs:25:18 (main)
5+
$DIR/backtrace-api.rs:31:18 (main)
56
RUSTLIB/core/src/ops/function.rs:LL:COL (<fn() as std::ops::FnOnce<()>>::call_once - shim(fn()))
67
RUSTLIB/std/src/sys_common/backtrace.rs:LL:COL (std::sys_common::backtrace::__rust_begin_short_backtrace)
78
RUSTLIB/std/src/rt.rs:LL:COL (std::rt::lang_start::{closure#0})

tests/run-pass/backtrace-api.stdout

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
$DIR/backtrace-api.rs:21:59 (func_c)
1+
$DIR/backtrace-api.rs:27:59 (func_d)
2+
$DIR/backtrace-api.rs:26:50 (func_c)
23
$DIR/backtrace-api.rs:20:53 (func_b::<u8>)
34
$DIR/backtrace-api.rs:19:50 (func_a)
4-
$DIR/backtrace-api.rs:25:18 (main)
5+
$DIR/backtrace-api.rs:31:18 (main)

0 commit comments

Comments
 (0)