@@ -2,15 +2,16 @@ use alloc::boxed::Box;
2
2
use core:: ffi:: c_void;
3
3
4
4
extern "Rust" {
5
- fn miri_get_backtrace ( flags : u64 ) -> Box < [ * mut ( ) ] > ;
5
+ fn miri_get_backtrace ( flags : u64 ) -> * mut [ * mut ( ) ] ;
6
6
fn miri_resolve_frame ( ptr : * mut ( ) , flags : u64 ) -> MiriFrame ;
7
+ fn miri_deallocate_backtrace ( ptr : * mut ( ) ) ;
7
8
}
8
9
9
10
#[ derive( Clone , Debug ) ]
10
11
#[ repr( C ) ]
11
12
pub struct MiriFrame {
12
- pub name : Box < [ u8 ] > ,
13
- pub filename : Box < [ u8 ] > ,
13
+ pub name : * mut [ u8 ] ,
14
+ pub filename : * mut [ u8 ] ,
14
15
pub lineno : u32 ,
15
16
pub colno : u32 ,
16
17
pub fn_ptr : * mut c_void ,
@@ -19,7 +20,11 @@ pub struct MiriFrame {
19
20
#[ derive( Debug , Clone ) ]
20
21
pub struct Frame {
21
22
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 ,
23
28
}
24
29
25
30
// SAFETY: Miri guarantees that the returned pointer
@@ -37,7 +42,7 @@ impl Frame {
37
42
}
38
43
39
44
pub fn symbol_address ( & self ) -> * mut c_void {
40
- self . inner . fn_ptr
45
+ self . fn_ptr
41
46
}
42
47
43
48
pub fn module_base_address ( & self ) -> Option < * mut c_void > {
@@ -55,16 +60,35 @@ pub fn resolve_addr(ptr: *mut c_void) -> Frame {
55
60
// SAFETY: Miri will stop execution with an error if this pointer
56
61
// is invalid.
57
62
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
+
58
74
Frame {
59
75
addr : ptr,
60
- inner : frame,
76
+ name,
77
+ filename,
78
+ lineno : frame. lineno ,
79
+ colno : frame. colno ,
80
+ fn_ptr : frame. fn_ptr ,
61
81
}
62
82
}
63
83
64
84
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
+
66
88
for ptr in frames. iter ( ) {
67
89
let frame = resolve_addr ( * ptr as * mut c_void ) ;
68
90
cb ( & super :: Frame { inner : frame } ) ;
69
91
}
92
+
93
+ miri_deallocate_backtrace ( frames_ptr as * mut ( ) ) ;
70
94
}
0 commit comments