@@ -7,6 +7,7 @@ use rustc_hir::def_id::DefId;
7
7
use rustc_hir:: lang_items:: LangItem ;
8
8
use rustc_index:: { Idx , IndexVec } ;
9
9
use rustc_middle:: mir:: patch:: MirPatch ;
10
+ use rustc_middle:: mir:: visit:: { MutVisitor , PlaceContext } ;
10
11
use rustc_middle:: mir:: * ;
11
12
use rustc_middle:: query:: Providers ;
12
13
use rustc_middle:: ty:: adjustment:: PointerCoercion ;
@@ -15,19 +16,56 @@ use rustc_middle::ty::{
15
16
} ;
16
17
use rustc_middle:: { bug, span_bug} ;
17
18
use rustc_mir_dataflow:: elaborate_drops:: { self , DropElaborator , DropFlagMode , DropStyle } ;
18
- use rustc_span:: source_map:: Spanned ;
19
+ use rustc_span:: source_map:: { Spanned , dummy_spanned } ;
19
20
use rustc_span:: { DUMMY_SP , Span } ;
20
21
use tracing:: { debug, instrument} ;
21
22
22
23
use crate :: {
23
24
abort_unwinding_calls, add_call_guards, add_moves_for_packed_drops, deref_separator, inline,
24
- instsimplify, mentioned_items, pass_manager as pm, remove_noop_landing_pads, simplify,
25
+ instsimplify, mentioned_items, pass_manager as pm, remove_noop_landing_pads,
26
+ run_optimization_passes, simplify,
25
27
} ;
26
28
29
+ mod async_destructor_ctor;
30
+
27
31
pub ( super ) fn provide ( providers : & mut Providers ) {
28
32
providers. mir_shims = make_shim;
29
33
}
30
34
35
+ // Replace Pin<&mut ImplCoroutine> accesses (_1.0) into Pin<&mut ProxyCoroutine> acceses
36
+ struct FixProxyFutureDropVisitor < ' tcx > {
37
+ tcx : TyCtxt < ' tcx > ,
38
+ replace_to : Local ,
39
+ }
40
+
41
+ impl < ' tcx > MutVisitor < ' tcx > for FixProxyFutureDropVisitor < ' tcx > {
42
+ fn tcx ( & self ) -> TyCtxt < ' tcx > {
43
+ self . tcx
44
+ }
45
+
46
+ fn visit_place (
47
+ & mut self ,
48
+ place : & mut Place < ' tcx > ,
49
+ _context : PlaceContext ,
50
+ _location : Location ,
51
+ ) {
52
+ if place. local == Local :: from_u32 ( 1 ) {
53
+ if place. projection . len ( ) == 1 {
54
+ assert ! ( matches!(
55
+ place. projection. first( ) ,
56
+ Some ( ProjectionElem :: Field ( FieldIdx :: ZERO , _) )
57
+ ) ) ;
58
+ * place = Place :: from ( self . replace_to ) ;
59
+ } else if place. projection . len ( ) == 2 {
60
+ assert ! ( matches!( place. projection[ 0 ] , ProjectionElem :: Field ( FieldIdx :: ZERO , _) ) ) ;
61
+ assert ! ( matches!( place. projection[ 1 ] , ProjectionElem :: Deref ) ) ;
62
+ * place =
63
+ Place :: from ( self . replace_to ) . project_deeper ( & [ ProjectionElem :: Deref ] , self . tcx ) ;
64
+ }
65
+ }
66
+ }
67
+ }
68
+
31
69
fn make_shim < ' tcx > ( tcx : TyCtxt < ' tcx > , instance : ty:: InstanceKind < ' tcx > ) -> Body < ' tcx > {
32
70
debug ! ( "make_shim({:?})" , instance) ;
33
71
@@ -128,14 +166,47 @@ fn make_shim<'tcx>(tcx: TyCtxt<'tcx>, instance: ty::InstanceKind<'tcx>) -> Body<
128
166
ty:: InstanceKind :: ThreadLocalShim ( ..) => build_thread_local_shim ( tcx, instance) ,
129
167
ty:: InstanceKind :: CloneShim ( def_id, ty) => build_clone_shim ( tcx, def_id, ty) ,
130
168
ty:: InstanceKind :: FnPtrAddrShim ( def_id, ty) => build_fn_ptr_addr_shim ( tcx, def_id, ty) ,
131
- ty:: InstanceKind :: FutureDropPollShim ( _def_id, _proxy_ty, _impl_ty) => {
132
- todo ! ( )
169
+ ty:: InstanceKind :: FutureDropPollShim ( def_id, proxy_ty, impl_ty) => {
170
+ let mut body =
171
+ async_destructor_ctor:: build_future_drop_poll_shim ( tcx, def_id, proxy_ty, impl_ty) ;
172
+
173
+ pm:: run_passes (
174
+ tcx,
175
+ & mut body,
176
+ & [
177
+ & mentioned_items:: MentionedItems ,
178
+ & abort_unwinding_calls:: AbortUnwindingCalls ,
179
+ & add_call_guards:: CriticalCallEdges ,
180
+ ] ,
181
+ Some ( MirPhase :: Runtime ( RuntimePhase :: Optimized ) ) ,
182
+ pm:: Optimizations :: Allowed ,
183
+ ) ;
184
+ debug ! ( "make_shim({:?}) = {:?}" , instance, body) ;
185
+ return body;
133
186
}
134
- ty:: InstanceKind :: AsyncDropGlue ( _def_id, _ty) => {
135
- todo ! ( )
187
+ ty:: InstanceKind :: AsyncDropGlue ( def_id, ty) => {
188
+ let mut body = async_destructor_ctor:: build_async_drop_shim ( tcx, def_id, ty) ;
189
+
190
+ pm:: run_passes (
191
+ tcx,
192
+ & mut body,
193
+ & [
194
+ & mentioned_items:: MentionedItems ,
195
+ & simplify:: SimplifyCfg :: MakeShim ,
196
+ & crate :: coroutine:: StateTransform ,
197
+ ] ,
198
+ Some ( MirPhase :: Runtime ( RuntimePhase :: PostCleanup ) ) ,
199
+ pm:: Optimizations :: Allowed ,
200
+ ) ;
201
+ run_optimization_passes ( tcx, & mut body) ;
202
+ debug ! ( "make_shim({:?}) = {:?}" , instance, body) ;
203
+ return body;
136
204
}
137
- ty:: InstanceKind :: AsyncDropGlueCtorShim ( _def_id, _ty) => {
138
- bug ! ( "AsyncDropGlueCtorShim in re-working ({:?})" , instance)
205
+
206
+ ty:: InstanceKind :: AsyncDropGlueCtorShim ( def_id, ty) => {
207
+ let body = async_destructor_ctor:: build_async_destructor_ctor_shim ( tcx, def_id, ty) ;
208
+ debug ! ( "make_shim({:?}) = {:?}" , instance, body) ;
209
+ return body;
139
210
}
140
211
ty:: InstanceKind :: Virtual ( ..) => {
141
212
bug ! ( "InstanceKind::Virtual ({:?}) is for direct calls only" , instance)
0 commit comments