8
8
//! For now, we are developing everything inside `rustc`, thus, we keep this module private.
9
9
10
10
use crate :: rustc_internal:: { IndexMap , RustcInternal } ;
11
- use crate :: rustc_smir:: hir:: def:: DefKind ;
12
- use crate :: rustc_smir:: stable_mir:: ty:: { BoundRegion , EarlyParamRegion , Region } ;
11
+ use crate :: rustc_smir:: stable_mir:: ty:: { BoundRegion , Region } ;
13
12
use rustc_hir as hir;
13
+ use rustc_hir:: def:: DefKind ;
14
14
use rustc_middle:: mir;
15
15
use rustc_middle:: mir:: interpret:: { alloc_range, AllocId } ;
16
16
use rustc_middle:: mir:: mono:: MonoItem ;
@@ -20,10 +20,11 @@ use rustc_target::abi::FieldIdx;
20
20
use stable_mir:: mir:: mono:: InstanceDef ;
21
21
use stable_mir:: mir:: { Body , CopyNonOverlapping , Statement , UserTypeProjection , VariantIdx } ;
22
22
use stable_mir:: ty:: {
23
- Const , ConstId , ConstantKind , FloatTy , GenericParamDef , IntTy , LineInfo , Movability , RigidTy ,
24
- Span , TyKind , UintTy ,
23
+ AdtDef , AdtKind , ClosureDef , ClosureKind , Const , ConstId , ConstantKind , EarlyParamRegion ,
24
+ FloatTy , FnDef , GenericArgs , GenericParamDef , IntTy , LineInfo , Movability , RigidTy , Span ,
25
+ TyKind , UintTy ,
25
26
} ;
26
- use stable_mir:: { self , opaque, Context , Filename } ;
27
+ use stable_mir:: { self , opaque, Context , CrateItem , Filename , ItemKind } ;
27
28
use std:: cell:: RefCell ;
28
29
use tracing:: debug;
29
30
@@ -85,9 +86,23 @@ impl<'tcx> Context for TablesWrapper<'tcx> {
85
86
LineInfo { start_line : lines. 1 , start_col : lines. 2 , end_line : lines. 3 , end_col : lines. 4 }
86
87
}
87
88
88
- fn def_kind ( & self , def_id : stable_mir:: DefId ) -> stable_mir:: DefKind {
89
+ fn item_kind ( & self , item : CrateItem ) -> ItemKind {
90
+ let tables = self . 0 . borrow ( ) ;
91
+ new_item_kind ( tables. tcx . def_kind ( tables[ item. 0 ] ) )
92
+ }
93
+
94
+ fn adt_kind ( & self , def : AdtDef ) -> AdtKind {
95
+ let mut tables = self . 0 . borrow_mut ( ) ;
96
+ let ty = tables. tcx . type_of ( def. 0 . internal ( & mut * tables) ) . instantiate_identity ( ) . kind ( ) ;
97
+ let ty:: TyKind :: Adt ( def, _) = ty else {
98
+ panic ! ( "Expected an ADT definition, but found: {ty:?}" )
99
+ } ;
100
+ def. adt_kind ( ) . stable ( & mut * tables)
101
+ }
102
+
103
+ fn def_ty ( & self , item : stable_mir:: DefId ) -> stable_mir:: ty:: Ty {
89
104
let mut tables = self . 0 . borrow_mut ( ) ;
90
- tables. tcx . def_kind ( tables[ def_id ] ) . stable ( & mut * tables)
105
+ tables. tcx . type_of ( item . internal ( & mut * tables) ) . instantiate_identity ( ) . stable ( & mut * tables)
91
106
}
92
107
93
108
fn span_of_an_item ( & self , def_id : stable_mir:: DefId ) -> Span {
@@ -198,10 +213,12 @@ impl<'tcx> Context for TablesWrapper<'tcx> {
198
213
}
199
214
}
200
215
201
- fn instance_body ( & self , def : InstanceDef ) -> Body {
216
+ fn instance_body ( & self , def : InstanceDef ) -> Option < Body > {
202
217
let mut tables = self . 0 . borrow_mut ( ) ;
203
218
let instance = tables. instances [ def] ;
204
- builder:: BodyBuilder :: new ( tables. tcx , instance) . build ( & mut * tables)
219
+ tables
220
+ . has_body ( instance)
221
+ . then ( || builder:: BodyBuilder :: new ( tables. tcx , instance) . build ( & mut * tables) )
205
222
}
206
223
207
224
fn instance_ty ( & self , def : InstanceDef ) -> stable_mir:: ty:: Ty {
@@ -249,6 +266,42 @@ impl<'tcx> Context for TablesWrapper<'tcx> {
249
266
Ok ( None ) | Err ( _) => None ,
250
267
}
251
268
}
269
+
270
+ fn resolve_drop_in_place (
271
+ & self ,
272
+ ty : stable_mir:: ty:: Ty ,
273
+ ) -> Option < stable_mir:: mir:: mono:: Instance > {
274
+ let mut tables = self . 0 . borrow_mut ( ) ;
275
+ let internal_ty = ty. internal ( & mut * tables) ;
276
+ let instance = Instance :: resolve_drop_in_place ( tables. tcx , internal_ty) ;
277
+ matches ! ( instance. def, ty:: InstanceDef :: DropGlue ( _, Some ( _) ) )
278
+ . then ( || instance. stable ( & mut * tables) )
279
+ }
280
+
281
+ fn resolve_for_fn_ptr (
282
+ & self ,
283
+ def : FnDef ,
284
+ args : & GenericArgs ,
285
+ ) -> Option < stable_mir:: mir:: mono:: Instance > {
286
+ let mut tables = self . 0 . borrow_mut ( ) ;
287
+ let def_id = def. 0 . internal ( & mut * tables) ;
288
+ let args_ref = args. internal ( & mut * tables) ;
289
+ Instance :: resolve_for_fn_ptr ( tables. tcx , ParamEnv :: reveal_all ( ) , def_id, args_ref)
290
+ . stable ( & mut * tables)
291
+ }
292
+
293
+ fn resolve_closure (
294
+ & self ,
295
+ def : ClosureDef ,
296
+ args : & GenericArgs ,
297
+ kind : ClosureKind ,
298
+ ) -> Option < stable_mir:: mir:: mono:: Instance > {
299
+ let mut tables = self . 0 . borrow_mut ( ) ;
300
+ let def_id = def. 0 . internal ( & mut * tables) ;
301
+ let args_ref = args. internal ( & mut * tables) ;
302
+ let closure_kind = kind. internal ( & mut * tables) ;
303
+ Instance :: resolve_closure ( tables. tcx , def_id, args_ref, closure_kind) . stable ( & mut * tables)
304
+ }
252
305
}
253
306
254
307
pub ( crate ) struct TablesWrapper < ' tcx > ( pub ( crate ) RefCell < Tables < ' tcx > > ) ;
@@ -271,6 +324,16 @@ impl<'tcx> Tables<'tcx> {
271
324
fn intern_const ( & mut self , constant : mir:: Const < ' tcx > ) -> ConstId {
272
325
self . constants . create_or_fetch ( constant)
273
326
}
327
+
328
+ fn has_body ( & self , instance : Instance < ' tcx > ) -> bool {
329
+ let def_id = instance. def_id ( ) ;
330
+ !self . tcx . is_foreign_item ( def_id)
331
+ && self . tcx . is_mir_available ( def_id)
332
+ && !matches ! (
333
+ instance. def,
334
+ ty:: InstanceDef :: Virtual ( ..) | ty:: InstanceDef :: Intrinsic ( ..)
335
+ )
336
+ }
274
337
}
275
338
276
339
/// Build a stable mir crate from a given crate number.
@@ -281,6 +344,43 @@ fn smir_crate(tcx: TyCtxt<'_>, crate_num: CrateNum) -> stable_mir::Crate {
281
344
stable_mir:: Crate { id : crate_num. into ( ) , name : crate_name, is_local }
282
345
}
283
346
347
+ fn new_item_kind ( kind : DefKind ) -> ItemKind {
348
+ match kind {
349
+ DefKind :: Mod
350
+ | DefKind :: Struct
351
+ | DefKind :: Union
352
+ | DefKind :: Enum
353
+ | DefKind :: Variant
354
+ | DefKind :: Trait
355
+ | DefKind :: TyAlias
356
+ | DefKind :: ForeignTy
357
+ | DefKind :: TraitAlias
358
+ | DefKind :: AssocTy
359
+ | DefKind :: TyParam
360
+ | DefKind :: ConstParam
361
+ | DefKind :: Macro ( _)
362
+ | DefKind :: ExternCrate
363
+ | DefKind :: Use
364
+ | DefKind :: ForeignMod
365
+ | DefKind :: OpaqueTy
366
+ | DefKind :: Field
367
+ | DefKind :: LifetimeParam
368
+ | DefKind :: GlobalAsm => {
369
+ unreachable ! ( "Not a valid item kind: {kind:?}" ) ;
370
+ }
371
+ DefKind :: Closure
372
+ | DefKind :: Coroutine
373
+ | DefKind :: Ctor ( _, _)
374
+ | DefKind :: AssocFn
375
+ | DefKind :: Impl { .. }
376
+ | DefKind :: Fn => ItemKind :: Fn ,
377
+ DefKind :: Const | DefKind :: InlineConst | DefKind :: AssocConst | DefKind :: AnonConst => {
378
+ ItemKind :: Const
379
+ }
380
+ DefKind :: Static ( _) => ItemKind :: Static ,
381
+ }
382
+ }
383
+
284
384
/// Trait used to convert between an internal MIR type to a Stable MIR type.
285
385
pub trait Stable < ' tcx > {
286
386
/// The stable representation of the type implementing Stable.
@@ -926,6 +1026,18 @@ impl<'tcx> Stable<'tcx> for mir::AggregateKind<'tcx> {
926
1026
}
927
1027
}
928
1028
1029
+ impl < ' tcx > Stable < ' tcx > for ty:: AdtKind {
1030
+ type T = AdtKind ;
1031
+
1032
+ fn stable ( & self , _tables : & mut Tables < ' tcx > ) -> Self :: T {
1033
+ match self {
1034
+ ty:: AdtKind :: Struct => AdtKind :: Struct ,
1035
+ ty:: AdtKind :: Union => AdtKind :: Union ,
1036
+ ty:: AdtKind :: Enum => AdtKind :: Enum ,
1037
+ }
1038
+ }
1039
+ }
1040
+
929
1041
impl < ' tcx > Stable < ' tcx > for rustc_hir:: CoroutineSource {
930
1042
type T = stable_mir:: mir:: CoroutineSource ;
931
1043
fn stable ( & self , _: & mut Tables < ' tcx > ) -> Self :: T {
@@ -1062,8 +1174,6 @@ impl<'tcx> Stable<'tcx> for mir::TerminatorKind<'tcx> {
1062
1174
impl < ' tcx > Stable < ' tcx > for ty:: GenericArgs < ' tcx > {
1063
1175
type T = stable_mir:: ty:: GenericArgs ;
1064
1176
fn stable ( & self , tables : & mut Tables < ' tcx > ) -> Self :: T {
1065
- use stable_mir:: ty:: GenericArgs ;
1066
-
1067
1177
GenericArgs ( self . iter ( ) . map ( |arg| arg. unpack ( ) . stable ( tables) ) . collect ( ) )
1068
1178
}
1069
1179
}
@@ -1486,7 +1596,7 @@ impl<'tcx> Stable<'tcx> for ty::TraitRef<'tcx> {
1486
1596
fn stable ( & self , tables : & mut Tables < ' tcx > ) -> Self :: T {
1487
1597
use stable_mir:: ty:: TraitRef ;
1488
1598
1489
- TraitRef { def_id : tables. trait_def ( self . def_id ) , args : self . args . stable ( tables) }
1599
+ TraitRef :: try_new ( tables. trait_def ( self . def_id ) , self . args . stable ( tables) ) . unwrap ( )
1490
1600
}
1491
1601
}
1492
1602
@@ -1762,15 +1872,6 @@ impl<'tcx> Stable<'tcx> for rustc_span::Span {
1762
1872
}
1763
1873
}
1764
1874
1765
- impl < ' tcx > Stable < ' tcx > for DefKind {
1766
- type T = stable_mir:: DefKind ;
1767
-
1768
- fn stable ( & self , _: & mut Tables < ' tcx > ) -> Self :: T {
1769
- // FIXME: add a real implementation of stable DefKind
1770
- opaque ( self )
1771
- }
1772
- }
1773
-
1774
1875
impl < ' tcx > Stable < ' tcx > for ty:: Instance < ' tcx > {
1775
1876
type T = stable_mir:: mir:: mono:: Instance ;
1776
1877
@@ -1805,3 +1906,25 @@ impl<'tcx> Stable<'tcx> for MonoItem<'tcx> {
1805
1906
}
1806
1907
}
1807
1908
}
1909
+
1910
+ impl < ' tcx , T > Stable < ' tcx > for & T
1911
+ where
1912
+ T : Stable < ' tcx > ,
1913
+ {
1914
+ type T = T :: T ;
1915
+
1916
+ fn stable ( & self , tables : & mut Tables < ' tcx > ) -> Self :: T {
1917
+ ( * self ) . stable ( tables)
1918
+ }
1919
+ }
1920
+
1921
+ impl < ' tcx , T > Stable < ' tcx > for Option < T >
1922
+ where
1923
+ T : Stable < ' tcx > ,
1924
+ {
1925
+ type T = Option < T :: T > ;
1926
+
1927
+ fn stable ( & self , tables : & mut Tables < ' tcx > ) -> Self :: T {
1928
+ self . as_ref ( ) . map ( |value| value. stable ( tables) )
1929
+ }
1930
+ }
0 commit comments