From 8e8828259ac1433dd3981fcec9670d7394c2ade5 Mon Sep 17 00:00:00 2001 From: Aaron Hill Date: Mon, 5 Oct 2020 17:29:55 -0400 Subject: [PATCH] Use macro callsite spans in backtrace This mirrors what we do in the debuginfo used for runtime backtraces. --- src/shims/backtrace.rs | 8 +++++++- tests/run-pass/backtrace-api.rs | 8 +++++++- tests/run-pass/backtrace-api.stderr | 5 +++-- tests/run-pass/backtrace-api.stdout | 5 +++-- 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/shims/backtrace.rs b/src/shims/backtrace.rs index 75cd61b0f59..bd36587116a 100644 --- a/src/shims/backtrace.rs +++ b/src/shims/backtrace.rs @@ -26,7 +26,13 @@ fn handle_miri_get_backtrace( let mut data = Vec::new(); for frame in this.active_thread_stack().iter().rev() { - data.push((frame.instance, frame.current_span().lo())); + let mut span = frame.current_span(); + // Match the behavior of runtime backtrace spans + // by using a non-macro span in our backtrace. See `FunctionCx::debug_loc`. + if span.from_expansion() && !tcx.sess.opts.debugging_opts.debug_macros { + span = rustc_span::hygiene::walk_chain(span, frame.body.span.ctxt()) + } + data.push((frame.instance, span.lo())); } let ptrs: Vec<_> = data.into_iter().map(|(instance, pos)| { diff --git a/tests/run-pass/backtrace-api.rs b/tests/run-pass/backtrace-api.rs index 80e64c2e1c8..eaf29abfd9f 100644 --- a/tests/run-pass/backtrace-api.rs +++ b/tests/run-pass/backtrace-api.rs @@ -18,7 +18,13 @@ struct MiriFrame { #[inline(never)] fn func_a() -> Box<[*mut ()]> { func_b::() } #[inline(never)] fn func_b() -> Box<[*mut ()]> { func_c() } -#[inline(never)] fn func_c() -> Box<[*mut ()]> { unsafe { miri_get_backtrace(0) } } + +macro_rules! invoke_func_d { + () => { func_d() } +} + +#[inline(never)] fn func_c() -> Box<[*mut ()]> { invoke_func_d!() } +#[inline(never)] fn func_d() -> Box<[*mut ()]> { unsafe { miri_get_backtrace(0) } } fn main() { let mut seen_main = false; diff --git a/tests/run-pass/backtrace-api.stderr b/tests/run-pass/backtrace-api.stderr index 15851a1cc72..02e7a7e1eaf 100644 --- a/tests/run-pass/backtrace-api.stderr +++ b/tests/run-pass/backtrace-api.stderr @@ -1,7 +1,8 @@ -$DIR/backtrace-api.rs:21:59 (func_c) +$DIR/backtrace-api.rs:27:59 (func_d) +$DIR/backtrace-api.rs:26:50 (func_c) $DIR/backtrace-api.rs:20:53 (func_b) $DIR/backtrace-api.rs:19:50 (func_a) -$DIR/backtrace-api.rs:25:18 (main) +$DIR/backtrace-api.rs:31:18 (main) RUSTLIB/core/src/ops/function.rs:LL:COL (>::call_once - shim(fn())) RUSTLIB/std/src/sys_common/backtrace.rs:LL:COL (std::sys_common::backtrace::__rust_begin_short_backtrace) RUSTLIB/std/src/rt.rs:LL:COL (std::rt::lang_start::{closure#0}) diff --git a/tests/run-pass/backtrace-api.stdout b/tests/run-pass/backtrace-api.stdout index 453cf0b774a..90ab4bb96e6 100644 --- a/tests/run-pass/backtrace-api.stdout +++ b/tests/run-pass/backtrace-api.stdout @@ -1,4 +1,5 @@ -$DIR/backtrace-api.rs:21:59 (func_c) +$DIR/backtrace-api.rs:27:59 (func_d) +$DIR/backtrace-api.rs:26:50 (func_c) $DIR/backtrace-api.rs:20:53 (func_b::) $DIR/backtrace-api.rs:19:50 (func_a) -$DIR/backtrace-api.rs:25:18 (main) +$DIR/backtrace-api.rs:31:18 (main) -- 2.44.0