1
1
// normalize-stderr-test ".*/(rust[^/]*|checkout)/library/" -> "RUSTLIB/"
2
2
// normalize-stderr-test "RUSTLIB/(.*):\d+:\d+ "-> "RUSTLIB/$1:LL:COL "
3
3
// normalize-stderr-test "::<.*>" -> ""
4
- #![ feature( allocator_api) ]
5
4
6
- use std:: alloc:: System ;
7
-
8
- #[ inline( never) ] fn func_a ( ) -> Box < [ * mut ( ) ] , System > { func_b :: < u8 > ( ) }
9
- #[ inline( never) ] fn func_b < T > ( ) -> Box < [ * mut ( ) ] , System > { func_c ( ) }
5
+ #[ inline( never) ] fn func_a ( ) -> * mut [ * mut ( ) ] { func_b :: < u8 > ( ) }
6
+ #[ inline( never) ] fn func_b < T > ( ) -> * mut [ * mut ( ) ] { func_c ( ) }
10
7
11
8
macro_rules! invoke_func_d {
12
9
( ) => { func_d( ) }
13
10
}
14
11
15
- #[ inline( never) ] fn func_c ( ) -> Box < [ * mut ( ) ] , System > { invoke_func_d ! ( ) }
16
- #[ inline( never) ] fn func_d ( ) -> Box < [ * mut ( ) ] , System > { unsafe { miri_get_backtrace ( 0 ) } }
12
+ #[ inline( never) ] fn func_c ( ) -> * mut [ * mut ( ) ] { invoke_func_d ! ( ) }
13
+ #[ inline( never) ] fn func_d ( ) -> * mut [ * mut ( ) ] { unsafe { miri_get_backtrace ( 0 ) } }
17
14
18
15
fn main ( ) {
19
16
let mut seen_main = false ;
20
17
let frames = func_a ( ) ;
21
- for frame in frames. into_iter ( ) {
18
+ for frame in unsafe { & * frames } . into_iter ( ) {
22
19
let miri_frame = unsafe { miri_resolve_frame ( * frame, 0 ) } ;
23
- let name = std:: str:: from_utf8 ( & miri_frame. name ) . unwrap ( ) ;
24
- let filename = std:: str:: from_utf8 ( & miri_frame. filename ) . unwrap ( ) ;
20
+ let name = unsafe { std:: str:: from_utf8 ( & * miri_frame. name ) . unwrap ( ) } ;
21
+ let filename = unsafe { std:: str:: from_utf8 ( & * miri_frame. filename ) . unwrap ( ) } ;
25
22
26
23
if name == "func_a" {
27
24
assert_eq ! ( func_a as * mut ( ) , miri_frame. fn_ptr) ;
@@ -36,22 +33,32 @@ fn main() {
36
33
println ! ( "{}" , out) ;
37
34
seen_main = name == "main" ;
38
35
}
36
+
37
+ unsafe {
38
+ miri_deallocate_backtrace ( miri_frame. name as * mut ( ) ) ;
39
+ miri_deallocate_backtrace ( miri_frame. filename as * mut ( ) ) ;
40
+ }
41
+ }
42
+
43
+ unsafe {
44
+ miri_deallocate_backtrace ( frames as * mut ( ) ) ;
39
45
}
40
46
}
41
47
42
48
// This goes at the bottom of the file so that we can change it
43
49
// without disturbing line numbers of the functions in the backtrace.
44
50
45
51
extern "Rust" {
46
- fn miri_get_backtrace ( flags : u64 ) -> Box < [ * mut ( ) ] , System > ;
52
+ fn miri_get_backtrace ( flags : u64 ) -> * mut [ * mut ( ) ] ;
47
53
fn miri_resolve_frame ( ptr : * mut ( ) , flags : u64 ) -> MiriFrame ;
54
+ fn miri_deallocate_backtrace ( ptr : * mut ( ) ) ;
48
55
}
49
56
50
57
#[ derive( Debug ) ]
51
58
#[ repr( C ) ]
52
59
struct MiriFrame {
53
- name : Box < [ u8 ] , System > ,
54
- filename : Box < [ u8 ] , System > ,
60
+ name : * mut [ u8 ] ,
61
+ filename : * mut [ u8 ] ,
55
62
lineno : u32 ,
56
63
colno : u32 ,
57
64
fn_ptr : * mut ( ) ,
0 commit comments