diff --git a/src/backtrace/miri.rs b/src/backtrace/miri.rs index 036d39b4..6cfef10f 100644 --- a/src/backtrace/miri.rs +++ b/src/backtrace/miri.rs @@ -4,8 +4,8 @@ use std::vec::Vec; use std::boxed::Box; extern "Rust" { - fn miri_get_backtrace() -> Box<[*mut ()]>; - fn miri_resolve_frame(version: u8, ptr: *mut ()) -> MiriFrame; + fn miri_get_backtrace(flags: u64) -> Box<[*mut ()]>; + fn miri_resolve_frame(ptr: *mut (), flags: u64) -> MiriFrame; } #[derive(Debug)] @@ -27,9 +27,8 @@ pub struct Frame { pub inner: MiriFrame } -// Miri is single threaded, and the raw -// pointer isn't really a pointer (it's a magic value -// returned by Miri) +// SAFETY: Miri guarantees that the returned pointer +// can be used from any thread. unsafe impl Send for Frame {} unsafe impl Sync for Frame {} @@ -52,13 +51,14 @@ impl Frame { } pub fn trace bool>(cb: F) { - // Miri is single threaded + // SAFETY: Miri guarnatees that the backtrace API functions + // can be called from any thread. unsafe { trace_unsynchronized(cb) }; } pub fn resolve_addr(ptr: *mut c_void) -> Frame { - let frame: MiriFrame = unsafe { miri_resolve_frame(0, ptr as *mut ()) }; + let frame: MiriFrame = unsafe { miri_resolve_frame(ptr as *mut (), 0) }; Frame { addr: ptr, inner: frame @@ -66,7 +66,7 @@ pub fn resolve_addr(ptr: *mut c_void) -> Frame { } pub unsafe fn trace_unsynchronized bool>(mut cb: F) { - let frames = miri_get_backtrace(); + let frames = miri_get_backtrace(0); for ptr in frames.iter() { let frame = resolve_addr(*ptr as *mut c_void); cb(&super::Frame {