Skip to content

Commit 9e82791

Browse files
committed
support change to miri backtrace
1 parent 5e15d73 commit 9e82791

File tree

3 files changed

+37
-12
lines changed

3 files changed

+37
-12
lines changed

src/backtrace/miri.rs

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,16 @@ use alloc::boxed::Box;
22
use core::ffi::c_void;
33

44
extern "Rust" {
5-
fn miri_get_backtrace(flags: u64) -> Box<[*mut ()]>;
5+
fn miri_get_backtrace(flags: u64) -> *mut [*mut ()];
66
fn miri_resolve_frame(ptr: *mut (), flags: u64) -> MiriFrame;
7+
fn miri_deallocate_backtrace(ptr: *mut ());
78
}
89

910
#[derive(Clone, Debug)]
1011
#[repr(C)]
1112
pub struct MiriFrame {
12-
pub name: Box<[u8]>,
13-
pub filename: Box<[u8]>,
13+
pub name: *mut [u8],
14+
pub filename: *mut [u8],
1415
pub lineno: u32,
1516
pub colno: u32,
1617
pub fn_ptr: *mut c_void,
@@ -19,7 +20,11 @@ pub struct MiriFrame {
1920
#[derive(Debug, Clone)]
2021
pub struct Frame {
2122
pub addr: *mut c_void,
22-
pub inner: MiriFrame,
23+
pub name: Box<[u8]>,
24+
pub filename: Box<[u8]>,
25+
pub lineno: u32,
26+
pub colno: u32,
27+
pub fn_ptr: *mut c_void,
2328
}
2429

2530
// SAFETY: Miri guarantees that the returned pointer
@@ -37,7 +42,7 @@ impl Frame {
3742
}
3843

3944
pub fn symbol_address(&self) -> *mut c_void {
40-
self.inner.fn_ptr
45+
self.fn_ptr
4146
}
4247

4348
pub fn module_base_address(&self) -> Option<*mut c_void> {
@@ -55,16 +60,35 @@ pub fn resolve_addr(ptr: *mut c_void) -> Frame {
5560
// SAFETY: Miri will stop execution with an error if this pointer
5661
// is invalid.
5762
let frame: MiriFrame = unsafe { miri_resolve_frame(ptr as *mut (), 0) };
63+
64+
// SAFETY: Miri guarantees that these pointers are valid
65+
let name = unsafe { (&*frame.name).into() };
66+
let filename = unsafe { (&*frame.filename).into() };
67+
68+
// SAFETY: these pointers are from `miri_resolve_frame`
69+
unsafe {
70+
miri_deallocate_backtrace(frame.name as *mut ());
71+
miri_deallocate_backtrace(frame.filename as *mut ());
72+
}
73+
5874
Frame {
5975
addr: ptr,
60-
inner: frame,
76+
name,
77+
filename,
78+
lineno: frame.lineno,
79+
colno: frame.colno,
80+
fn_ptr: frame.fn_ptr,
6181
}
6282
}
6383

6484
pub unsafe fn trace_unsynchronized<F: FnMut(&super::Frame) -> bool>(mut cb: F) {
65-
let frames = miri_get_backtrace(0);
85+
let frames_ptr = miri_get_backtrace(0);
86+
let frames = &*frames_ptr;
87+
6688
for ptr in frames.iter() {
6789
let frame = resolve_addr(*ptr as *mut c_void);
6890
cb(&super::Frame { inner: frame });
6991
}
92+
93+
miri_deallocate_backtrace(frames_ptr as *mut ());
7094
}

src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@
9393
all(feature = "std", target_env = "sgx", target_vendor = "fortanix"),
9494
feature(sgx_platform)
9595
)]
96+
#![cfg_attr(miri, feature(allocator_api))]
9697
#![warn(rust_2018_idioms)]
9798
// When we're building as part of libstd, silence all warnings since they're
9899
// irrelevant as this crate is developed out-of-tree.

src/symbolize/miri.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,29 +26,29 @@ pub struct Symbol<'a> {
2626

2727
impl<'a> Symbol<'a> {
2828
pub fn name(&self) -> Option<SymbolName<'_>> {
29-
Some(SymbolName::new(&self.inner.inner.name))
29+
Some(SymbolName::new(&self.inner.name))
3030
}
3131

3232
pub fn addr(&self) -> Option<*mut c_void> {
3333
Some(self.inner.addr)
3434
}
3535

3636
pub fn filename_raw(&self) -> Option<BytesOrWideString<'_>> {
37-
Some(BytesOrWideString::Bytes(&self.inner.inner.filename))
37+
Some(BytesOrWideString::Bytes(&self.inner.filename))
3838
}
3939

4040
pub fn lineno(&self) -> Option<u32> {
41-
Some(self.inner.inner.lineno)
41+
Some(self.inner.lineno)
4242
}
4343

4444
pub fn colno(&self) -> Option<u32> {
45-
Some(self.inner.inner.colno)
45+
Some(self.inner.colno)
4646
}
4747

4848
#[cfg(feature = "std")]
4949
pub fn filename(&self) -> Option<&std::path::Path> {
5050
Some(std::path::Path::new(
51-
core::str::from_utf8(&self.inner.inner.filename).unwrap(),
51+
core::str::from_utf8(&self.inner.filename).unwrap(),
5252
))
5353
}
5454
}

0 commit comments

Comments
 (0)