]> git.lizzy.rs Git - rust.git/commitdiff
Use macro callsite spans in backtrace
authorAaron Hill <aa1ronham@gmail.com>
Mon, 5 Oct 2020 21:29:55 +0000 (17:29 -0400)
committerAaron Hill <aa1ronham@gmail.com>
Mon, 5 Oct 2020 21:29:55 +0000 (17:29 -0400)
This mirrors what we do in the debuginfo used for runtime backtraces.

src/shims/backtrace.rs
tests/run-pass/backtrace-api.rs
tests/run-pass/backtrace-api.stderr
tests/run-pass/backtrace-api.stdout

index 75cd61b0f59e7e7eeae0de3e23d50e0b4653867a..bd36587116a06f5822b2da1c30fff69b62b88177 100644 (file)
@@ -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)| {
index 80e64c2e1c8ba232331fc44c373db5d7fafcd5c8..eaf29abfd9f48d16d864367ea8b68e0cfc0f0d1e 100644 (file)
@@ -18,7 +18,13 @@ struct MiriFrame {
 
 #[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;
index 15851a1cc7257a75740c86a0254ea35eade158d3..02e7a7e1eaf9c88635b6c5d449b0b702ceb60840 100644 (file)
@@ -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 (<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})
index 453cf0b774a109f7cc80a5c2fe680d597e3046cd..90ab4bb96e625c5e2ac20904f8e273e56bd8ed27 100644 (file)
@@ -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::<u8>)
 $DIR/backtrace-api.rs:19:50 (func_a)
-$DIR/backtrace-api.rs:25:18 (main)
+$DIR/backtrace-api.rs:31:18 (main)