Skip to content

Commit 59d7bcf

Browse files
committed
Start migration to async destructor ctor shim builder
1 parent 54b2df2 commit 59d7bcf

File tree

2 files changed

+32
-66
lines changed

2 files changed

+32
-66
lines changed

compiler/rustc_mir_transform/src/shim.rs

+28-62
Original file line numberDiff line numberDiff line change
@@ -1058,17 +1058,12 @@ fn build_async_destructor_ctor_shim<'tcx>(
10581058
def_id: DefId,
10591059
self_ty: Ty<'tcx>,
10601060
) -> Body<'tcx> {
1061-
// FIXME: implement cleanup branches
1062-
1063-
let span = tcx.def_span(def_id);
1064-
let Some(sig) = tcx.fn_sig(def_id).instantiate(tcx, &[self_ty.into()]).no_bound_vars() else {
1065-
span_bug!(span, "async_drop_in_place_raw with bound vars for `{self_ty}`");
1066-
};
1061+
let mut builder = AsyncDestructorCtorShimBuilder::new(tcx, def_id, self_ty);
10671062

1063+
let source_info = builder.source_info;
1064+
let span = builder.span;
10681065
let param_env = tcx.param_env_reveal_all_normalized(def_id);
1069-
let source_info = SourceInfo::outermost(span);
10701066

1071-
let mut locals = local_decls_for_sig(&sig, span);
10721067
let return_local = Local::new(0);
10731068
let self_ptr = Local::new(1);
10741069

@@ -1174,39 +1169,18 @@ fn build_async_destructor_ctor_shim<'tcx>(
11741169
};
11751170

11761171
let return_bb;
1177-
let mut blocks;
1172+
let mut blocks = &mut builder.bbs;
11781173
match strategy {
11791174
GlueStrategy::Empty => {
1180-
let ready_unit_fn = tcx.require_lang_item(LangItem::FutureReadyUnitCtor, Some(span));
1181-
1182-
blocks = IndexVec::from_elem_n(BasicBlockData::new(None), 2);
1183-
let ready_unit_bb = BasicBlock::new(0);
1184-
return_bb = BasicBlock::new(1);
1185-
1186-
blocks[ready_unit_bb].terminator = Some(Terminator {
1187-
source_info,
1188-
kind: TerminatorKind::Call {
1189-
func: Operand::function_handle(
1190-
tcx,
1191-
ready_unit_fn,
1192-
[/* HOST */ tcx.consts.false_.into()],
1193-
span,
1194-
),
1195-
args: Vec::new(),
1196-
destination: return_local.into(),
1197-
target: Some(return_bb),
1198-
unwind: UnwindAction::Continue,
1199-
call_source: CallSource::Misc,
1200-
fn_span: span,
1201-
},
1202-
});
1175+
builder.ready_unit();
1176+
return builder.return_();
12031177
}
12041178

12051179
GlueStrategy::AsyncDropProjection => {
12061180
let surface_async_drop_in_place_fn =
12071181
tcx.require_lang_item(LangItem::SurfaceAsyncDropInPlace, Some(span));
12081182

1209-
blocks = IndexVec::from_elem_n(BasicBlockData::new(None), 2);
1183+
*blocks = IndexVec::from_elem_n(BasicBlockData::new(None), 2);
12101184
let surface_async_drop_in_place_bb = BasicBlock::new(0);
12111185
return_bb = BasicBlock::new(1);
12121186

@@ -1216,7 +1190,7 @@ fn build_async_destructor_ctor_shim<'tcx>(
12161190
func: Operand::function_handle(
12171191
tcx,
12181192
surface_async_drop_in_place_fn,
1219-
[self_ty.into()],
1193+
iter::once(self_ty.into()),
12201194
span,
12211195
),
12221196
args: vec![respan(span, Operand::Move(self_ptr.into()))],
@@ -1233,13 +1207,14 @@ fn build_async_destructor_ctor_shim<'tcx>(
12331207
let slice_async_destructor_fn =
12341208
tcx.require_lang_item(LangItem::SliceAsyncDestructorCtor, Some(span));
12351209

1236-
blocks = IndexVec::from_elem_n(BasicBlockData::new(None), 2);
1210+
*blocks = IndexVec::from_elem_n(BasicBlockData::new(None), 2);
12371211
let slice_async_destructor_bb = BasicBlock::new(0);
12381212
return_bb = BasicBlock::new(1);
12391213

12401214
let slice_ptr = if is_array {
12411215
let slice_ptr_ty = Ty::new_mut_ptr(tcx, Ty::new_slice(tcx, elem_ty));
1242-
let slice_ptr = locals.push(LocalDecl::with_source_info(slice_ptr_ty, source_info));
1216+
let slice_ptr =
1217+
builder.locals.push(LocalDecl::with_source_info(slice_ptr_ty, source_info));
12431218

12441219
blocks[slice_async_destructor_bb].statements = vec![
12451220
Statement { source_info, kind: StatementKind::StorageLive(slice_ptr) },
@@ -1266,7 +1241,7 @@ fn build_async_destructor_ctor_shim<'tcx>(
12661241
func: Operand::function_handle(
12671242
tcx,
12681243
slice_async_destructor_fn,
1269-
[elem_ty.into(), /* HOST */ tcx.consts.false_.into()],
1244+
iter::once(elem_ty.into()),
12701245
span,
12711246
),
12721247
args: vec![respan(span, Operand::Move(slice_ptr.into()))],
@@ -1299,18 +1274,18 @@ fn build_async_destructor_ctor_shim<'tcx>(
12991274
tcx.type_of(tcx.require_lang_item(LangItem::FutureChain, Some(span)));
13001275
let future_chain_fn = tcx.require_lang_item(LangItem::FutureChainCtor, Some(span));
13011276

1302-
locals.raw.reserve(
1277+
builder.locals.raw.reserve(
13031278
1 + LOCALS_PER_ELEM * elem_count + if has_surface_async_drop { 2 } else { 0 },
13041279
);
13051280

13061281
// this local is right before element locals
13071282
let ready_unit_local =
1308-
locals.push(LocalDecl::with_source_info(ready_unit_ty, source_info));
1283+
builder.locals.push(LocalDecl::with_source_info(ready_unit_ty, source_info));
13091284

1310-
let locals_base = locals.len();
1285+
let locals_base = builder.locals.len();
13111286
let mut last_chain_ty = ready_unit_ty;
13121287
// Creating temproraries to store intermediate futuresh
1313-
locals.extend(
1288+
builder.locals.extend(
13141289
elem_tys
13151290
.iter()
13161291
.rev()
@@ -1327,7 +1302,7 @@ fn build_async_destructor_ctor_shim<'tcx>(
13271302
.map(|ty| LocalDecl::with_source_info(ty, source_info)),
13281303
);
13291304

1330-
blocks =
1305+
*blocks =
13311306
IndexVec::from_elem_n(BasicBlockData::new(None), 4 + BBS_PER_ELEM * elem_count);
13321307
let ready_unit_bb = BasicBlock::new(0);
13331308
let bbs_base = 1;
@@ -1380,12 +1355,7 @@ fn build_async_destructor_ctor_shim<'tcx>(
13801355
blocks[ready_unit_bb].terminator = Some(Terminator {
13811356
source_info,
13821357
kind: TerminatorKind::Call {
1383-
func: Operand::function_handle(
1384-
tcx,
1385-
ready_unit_fn,
1386-
[/* HOST */ tcx.consts.false_.into()],
1387-
span,
1388-
),
1358+
func: Operand::function_handle(tcx, ready_unit_fn, iter::empty(), span),
13891359
args: Vec::new(),
13901360
destination: ready_unit_local.into(),
13911361
target: Some(chain_nodes().next().unwrap().deferred_dtor_bb),
@@ -1426,7 +1396,7 @@ fn build_async_destructor_ctor_shim<'tcx>(
14261396
func: Operand::function_handle(
14271397
tcx,
14281398
deferred_async_drop_fn,
1429-
[node.elem_ty.into(), /* HOST */ tcx.consts.false_.into()],
1399+
iter::once(node.elem_ty.into()),
14301400
span,
14311401
),
14321402
args: vec![respan(span, Operand::Move(node.elem_ptr_local.into()))],
@@ -1452,9 +1422,8 @@ fn build_async_destructor_ctor_shim<'tcx>(
14521422
tcx,
14531423
future_chain_fn,
14541424
[
1455-
locals[node.deferred_dtor_local].ty.into(),
1456-
locals[node.previous_chain_local].ty.into(),
1457-
/* HOST */ tcx.consts.false_.into(),
1425+
builder.locals[node.deferred_dtor_local].ty.into(),
1426+
builder.locals[node.previous_chain_local].ty.into(),
14581427
],
14591428
span,
14601429
),
@@ -1501,11 +1470,11 @@ fn build_async_destructor_ctor_shim<'tcx>(
15011470
);
15021471

15031472
let async_dropper_local =
1504-
locals.push(LocalDecl::with_source_info(async_dropper_ty, source_info));
1473+
builder.locals.push(LocalDecl::with_source_info(async_dropper_ty, source_info));
15051474
let surface_chain_ty = future_chain_ty
15061475
.instantiate(tcx, &[async_dropper_ty.into(), last_chain_ty.into()]);
15071476
let surface_chain_local =
1508-
locals.push(LocalDecl::with_source_info(surface_chain_ty, source_info));
1477+
builder.locals.push(LocalDecl::with_source_info(surface_chain_ty, source_info));
15091478

15101479
blocks[maybe_async_dropper_bb].statements = vec![Statement {
15111480
source_info,
@@ -1517,7 +1486,7 @@ fn build_async_destructor_ctor_shim<'tcx>(
15171486
func: Operand::function_handle(
15181487
tcx,
15191488
surface_async_drop_fn,
1520-
[self_ty.into()],
1489+
iter::once(self_ty.into()),
15211490
span,
15221491
),
15231492
args: vec![respan(span, Operand::Move(self_ptr.into()))],
@@ -1539,11 +1508,7 @@ fn build_async_destructor_ctor_shim<'tcx>(
15391508
func: Operand::function_handle(
15401509
tcx,
15411510
future_chain_fn,
1542-
[
1543-
async_dropper_ty.into(),
1544-
last_chain_ty.into(),
1545-
/* HOST */ tcx.consts.false_.into(),
1546-
],
1511+
[async_dropper_ty.into(), last_chain_ty.into()],
15471512
span,
15481513
),
15491514
args: vec![
@@ -1601,10 +1566,11 @@ fn build_async_destructor_ctor_shim<'tcx>(
16011566
}
16021567
}
16031568

1604-
blocks[return_bb].terminator = Some(Terminator { source_info, kind: TerminatorKind::Return });
1569+
builder.bbs[return_bb].terminator =
1570+
Some(Terminator { source_info, kind: TerminatorKind::Return });
16051571

16061572
let source = MirSource::from_instance(ty::InstanceDef::AsyncDropGlueCtorShim(def_id, self_ty));
1607-
new_body(source, blocks, locals, sig.inputs().len(), span)
1573+
new_body(source, builder.bbs, builder.locals, ASYNC_DESTRUCTOR_CTOR_ARG_COUNT, span)
16081574
}
16091575

16101576
const ASYNC_DESTRUCTOR_CTOR_ARG_COUNT: usize = 1;

library/core/src/future/async_drop.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ struct SliceAsyncDestuctor<T> {
125125
}
126126

127127
#[lang = "slice_async_destructor_ctor"]
128-
const unsafe fn slice_async_destructor<T>(inner: *mut [T]) -> SliceAsyncDestuctor<T> {
128+
unsafe fn slice_async_destructor<T>(inner: *mut [T]) -> SliceAsyncDestuctor<T> {
129129
SliceAsyncDestuctor {
130130
// SAFETY: We call this funtion from async drop
131131
// `async_drop_in_place_raw` which has the same safety requirements
@@ -201,7 +201,7 @@ impl<T> Future for DeferredAsyncDrop<T> {
201201
/// Same as [`async_drop_in_place`], but creation of the pinned mutable
202202
/// reference is deferred until first [`DeferredAsyncDrop::poll`] call.
203203
#[lang = "deferred_async_drop_ctor"]
204-
const unsafe fn deferred_async_drop<T>(item: *mut T) -> DeferredAsyncDrop<T> {
204+
unsafe fn deferred_async_drop<T>(item: *mut T) -> DeferredAsyncDrop<T> {
205205
DeferredAsyncDrop::Init {
206206
// SAFETY: Guaranteed by current function's safety requirements
207207
ptr: unsafe { ptr::NonNull::new_unchecked(item) },
@@ -246,7 +246,7 @@ where
246246
}
247247

248248
#[lang = "future_chain_ctor"]
249-
const fn chain<F1, F2>(first: F1, second: F2) -> Chain<F1, F2> {
249+
fn chain<F1, F2>(first: F1, second: F2) -> Chain<F1, F2> {
250250
Chain { first: Some(first), second }
251251
}
252252

@@ -264,6 +264,6 @@ impl Future for ReadyUnit {
264264
}
265265

266266
#[lang = "future_ready_unit_ctor"]
267-
const fn ready_unit() -> ReadyUnit {
267+
fn ready_unit() -> ReadyUnit {
268268
ReadyUnit
269269
}

0 commit comments

Comments
 (0)