This mirrors what we do in the debuginfo used for runtime backtraces.
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)| {
#[inline(never)] fn func_a() -> Box<[*mut ()]> { func_b::<u8>() }
#[inline(never)] fn func_b<T>() -> 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;
-$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 (<fn() as std::ops::FnOnce<()>>::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})
-$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::<u8>)
$DIR/backtrace-api.rs:19:50 (func_a)
-$DIR/backtrace-api.rs:25:18 (main)
+$DIR/backtrace-api.rs:31:18 (main)