@@ -2,15 +2,16 @@ use alloc::boxed::Box;
22use core:: ffi:: c_void;
33
44extern "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 ) ]
1112pub 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 ) ]
2021pub 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
6484pub 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}
0 commit comments