@@ -7,20 +7,23 @@ use stable_mir::{
7
7
CrateItem ,
8
8
} ;
9
9
10
- use super :: { run , RustcInternal } ;
10
+ use super :: { internal , run } ;
11
11
12
12
pub fn write_smir_pretty < ' tcx > ( tcx : TyCtxt < ' tcx > , w : & mut dyn io:: Write ) -> io:: Result < ( ) > {
13
+ writeln ! ( w, "// WARNING: This is highly experimental output it's intended for stable-mir developers only." ) . unwrap ( ) ;
14
+ writeln ! ( w, "// If you find a bug or want to improve the output open a issue at https://github.com/rust-lang/project-stable-mir." ) . unwrap ( ) ;
13
15
run ( tcx, || {
14
16
let items = stable_mir:: all_local_items ( ) ;
15
17
items. iter ( ) . for_each ( |item| {
16
18
// Because we can't return a Result from a closure, we have to unwrap here.
17
19
writeln ! ( w, "{}" , function_name( * item, tcx) ) . unwrap ( ) ;
18
20
writeln ! ( w, "{}" , function_body( * item, tcx) ) . unwrap ( ) ;
19
- writeln ! ( w , "------------------" ) . unwrap ( ) ;
20
- item . body ( ) . blocks . iter ( ) . for_each ( |block| {
21
+ item . body ( ) . blocks . iter ( ) . enumerate ( ) . for_each ( | ( index , block ) | {
22
+ writeln ! ( w , " bb{}: {{" , index ) . unwrap ( ) ;
21
23
block. statements . iter ( ) . for_each ( |statement| {
22
24
writeln ! ( w, "{}" , pretty_statement( & statement. kind, tcx) ) . unwrap ( ) ;
23
25
} ) ;
26
+ writeln ! ( w, " }}" ) . unwrap ( ) ;
24
27
} )
25
28
} )
26
29
} ) ;
@@ -76,8 +79,8 @@ pub fn pretty_statement(statement: &StatementKind, tcx: TyCtxt<'_>) -> String {
76
79
let mut pretty = String :: new ( ) ;
77
80
match statement {
78
81
StatementKind :: Assign ( place, rval) => {
79
- pretty. push_str ( format ! ( "_{} = " , place. local) . as_str ( ) ) ;
80
- pretty. push_str ( & pretty_rvalue ( rval, tcx) )
82
+ pretty. push_str ( format ! ( " _{} = " , place. local) . as_str ( ) ) ;
83
+ pretty. push_str ( format ! ( "{}" , & pretty_rvalue( rval, tcx) ) . as_str ( ) ) ;
81
84
}
82
85
StatementKind :: FakeRead ( _, _) => todo ! ( ) ,
83
86
StatementKind :: SetDiscriminant { .. } => todo ! ( ) ,
@@ -103,12 +106,12 @@ pub fn pretty_operand(operand: &Operand, _tcx: TyCtxt<'_>) -> String {
103
106
pretty. push_str ( format ! ( "{}" , copy. local) . as_str ( ) ) ;
104
107
}
105
108
Operand :: Move ( mv) => {
106
- pretty. push_str ( "move" ) ;
107
- pretty. push_str ( format ! ( "{}" , mv. local) . as_str ( ) ) ;
109
+ pretty. push_str ( "move " ) ;
110
+ pretty. push_str ( format ! ( "_ {}" , mv. local) . as_str ( ) ) ;
108
111
}
109
112
Operand :: Constant ( cnst) => {
110
113
pretty. push_str ( "const " ) ;
111
- pretty. push_str ( cnst. literal . internal_via_tls ( ) . to_string ( ) . as_str ( ) ) ;
114
+ pretty. push_str ( internal ( & cnst. literal ) . to_string ( ) . as_str ( ) ) ;
112
115
}
113
116
}
114
117
pretty
@@ -118,9 +121,9 @@ pub fn pretty_rvalue(rval: &Rvalue, tcx: TyCtxt<'_>) -> String {
118
121
let mut pretty = String :: new ( ) ;
119
122
match rval {
120
123
Rvalue :: AddressOf ( muta, addr) => {
121
- pretty. push_str ( "address_of " ) ;
124
+ pretty. push_str ( "&raw " ) ;
122
125
pretty. push_str ( & ret_mutability ( & muta) ) ;
123
- pretty. push_str ( format ! ( "{} " , addr. local) . as_str ( ) ) ;
126
+ pretty. push_str ( format ! ( "(*_{}) " , addr. local) . as_str ( ) ) ;
124
127
}
125
128
Rvalue :: Aggregate ( aggregatekind, operands) => {
126
129
pretty. push_str ( format ! ( "{:#?}" , aggregatekind) . as_str ( ) ) ;
@@ -222,21 +225,45 @@ pub fn pretty_ty(ty: TyKind, tcx: TyCtxt<'_>) -> String {
222
225
stable_mir:: ty:: FloatTy :: F64 => "f64" . to_string ( ) ,
223
226
} ,
224
227
RigidTy :: Adt ( def, _) => {
225
- format ! ( "{:#? }" , tcx. type_of( def. 0 . internal_via_tls ( ) ) . instantiate_identity( ) )
228
+ format ! ( "{}" , tcx. type_of( internal ( & def. 0 ) ) . instantiate_identity( ) )
226
229
}
227
230
RigidTy :: Foreign ( _) => format ! ( "{:#?}" , rigid_ty) ,
228
231
RigidTy :: Str => "str" . to_string ( ) ,
229
- RigidTy :: Array ( _ty, len) => {
230
- format ! ( "[{};{:#?}]" , 1 , len. internal_via_tls( ) )
232
+ RigidTy :: Array ( ty, len) => {
233
+ format ! (
234
+ "[{}; {}]" ,
235
+ pretty_ty( ty. kind( ) , tcx) ,
236
+ internal( & len) . try_to_scalar( ) . unwrap( )
237
+ )
238
+ }
239
+ RigidTy :: Slice ( ty) => {
240
+ format ! ( "[{}]" , pretty_ty( ty. kind( ) , tcx) )
241
+ }
242
+ RigidTy :: RawPtr ( ty, mutability) => {
243
+ pretty. push_str ( "*" ) ;
244
+ match mutability {
245
+ Mutability :: Not => pretty. push_str ( "const " ) ,
246
+ Mutability :: Mut => pretty. push_str ( "mut " ) ,
247
+ }
248
+ pretty. push_str ( & pretty_ty ( ty. kind ( ) , tcx) ) ;
249
+ pretty
231
250
}
232
- RigidTy :: Slice ( ty) => pretty_ty ( ty. kind ( ) , tcx) ,
233
- RigidTy :: RawPtr ( _, _) => format ! ( "{:#?}" , rigid_ty) ,
234
251
RigidTy :: Ref ( _, ty, _) => pretty_ty ( ty. kind ( ) , tcx) ,
235
252
RigidTy :: FnDef ( _, _) => format ! ( "{:#?}" , rigid_ty) ,
236
253
RigidTy :: FnPtr ( _) => format ! ( "{:#?}" , rigid_ty) ,
237
254
RigidTy :: Closure ( _, _) => format ! ( "{:#?}" , rigid_ty) ,
238
255
RigidTy :: Coroutine ( _, _, _) => format ! ( "{:#?}" , rigid_ty) ,
239
- RigidTy :: Dynamic ( _, _, _) => format ! ( "{:#?}" , rigid_ty) ,
256
+ RigidTy :: Dynamic ( data, region, repr) => {
257
+ // FIXME: Fix binder printing, it looks ugly now
258
+ pretty. push_str ( "(" ) ;
259
+ match repr {
260
+ stable_mir:: ty:: DynKind :: Dyn => pretty. push_str ( "dyn " ) ,
261
+ stable_mir:: ty:: DynKind :: DynStar => pretty. push_str ( "dyn* " ) ,
262
+ }
263
+ pretty. push_str ( format ! ( "{:#?}" , data) . as_str ( ) ) ;
264
+ pretty. push_str ( format ! ( " + {:#?} )" , region) . as_str ( ) ) ;
265
+ pretty
266
+ }
240
267
RigidTy :: Never => "!" . to_string ( ) ,
241
268
RigidTy :: Tuple ( tuple) => {
242
269
if tuple. is_empty ( ) {
@@ -256,7 +283,9 @@ pub fn pretty_ty(ty: TyKind, tcx: TyCtxt<'_>) -> String {
256
283
}
257
284
} ,
258
285
TyKind :: Alias ( _, _) => format ! ( "{:#?}" , ty) ,
259
- TyKind :: Param ( _) => format ! ( "{:#?}" , ty) ,
286
+ TyKind :: Param ( param_ty) => {
287
+ format ! ( "{:#?}" , param_ty. name)
288
+ }
260
289
TyKind :: Bound ( _, _) => format ! ( "{:#?}" , ty) ,
261
290
}
262
291
}
0 commit comments