mir: Use the new method for BasicBlockData
This commit is contained in:
@@ -1359,7 +1359,15 @@ pub struct BasicBlockData<'tcx> {
|
||||
|
||||
impl<'tcx> BasicBlockData<'tcx> {
|
||||
pub fn new(terminator: Option<Terminator<'tcx>>, is_cleanup: bool) -> BasicBlockData<'tcx> {
|
||||
BasicBlockData { statements: vec![], terminator, is_cleanup }
|
||||
BasicBlockData::new_stmts(Vec::new(), terminator, is_cleanup)
|
||||
}
|
||||
|
||||
pub fn new_stmts(
|
||||
statements: Vec<Statement<'tcx>>,
|
||||
terminator: Option<Terminator<'tcx>>,
|
||||
is_cleanup: bool,
|
||||
) -> BasicBlockData<'tcx> {
|
||||
BasicBlockData { statements, terminator, is_cleanup }
|
||||
}
|
||||
|
||||
/// Accessor for terminator.
|
||||
|
||||
@@ -19,11 +19,11 @@ fn mock_body<'tcx>() -> mir::Body<'tcx> {
|
||||
let mut block = |n, kind| {
|
||||
let nop = mir::Statement::new(source_info, mir::StatementKind::Nop);
|
||||
|
||||
blocks.push(mir::BasicBlockData {
|
||||
statements: std::iter::repeat(&nop).cloned().take(n).collect(),
|
||||
terminator: Some(mir::Terminator { source_info, kind }),
|
||||
is_cleanup: false,
|
||||
})
|
||||
blocks.push(mir::BasicBlockData::new_stmts(
|
||||
std::iter::repeat(&nop).cloned().take(n).collect(),
|
||||
Some(mir::Terminator { source_info, kind }),
|
||||
false,
|
||||
))
|
||||
};
|
||||
|
||||
let dummy_place = mir::Place { local: mir::RETURN_PLACE, projection: ty::List::empty() };
|
||||
|
||||
@@ -44,11 +44,10 @@ impl<'tcx> crate::MirPass<'tcx> for AddCallGuards {
|
||||
|
||||
let cur_len = body.basic_blocks.len();
|
||||
let mut new_block = |source_info: SourceInfo, is_cleanup: bool, target: BasicBlock| {
|
||||
let block = BasicBlockData {
|
||||
statements: vec![],
|
||||
let block = BasicBlockData::new(
|
||||
Some(Terminator { source_info, kind: TerminatorKind::Goto { target } }),
|
||||
is_cleanup,
|
||||
terminator: Some(Terminator { source_info, kind: TerminatorKind::Goto { target } }),
|
||||
};
|
||||
);
|
||||
let idx = cur_len + new_blocks.len();
|
||||
new_blocks.push(block);
|
||||
BasicBlock::new(idx)
|
||||
|
||||
@@ -93,11 +93,11 @@ fn add_move_for_packed_drop<'tcx>(
|
||||
let ty = place.ty(body, tcx).ty;
|
||||
let temp = patch.new_temp(ty, source_info.span);
|
||||
|
||||
let storage_dead_block = patch.new_block(BasicBlockData {
|
||||
statements: vec![Statement::new(source_info, StatementKind::StorageDead(temp))],
|
||||
terminator: Some(Terminator { source_info, kind: TerminatorKind::Goto { target } }),
|
||||
let storage_dead_block = patch.new_block(BasicBlockData::new_stmts(
|
||||
vec![Statement::new(source_info, StatementKind::StorageDead(temp))],
|
||||
Some(Terminator { source_info, kind: TerminatorKind::Goto { target } }),
|
||||
is_cleanup,
|
||||
});
|
||||
));
|
||||
|
||||
patch.add_statement(loc, StatementKind::StorageLive(temp));
|
||||
patch.add_assign(loc, Place::from(temp), Rvalue::Use(Operand::Move(*place)));
|
||||
|
||||
@@ -235,11 +235,11 @@ fn split_block(
|
||||
let block_data = &mut basic_blocks[location.block];
|
||||
|
||||
// Drain every statement after this one and move the current terminator to a new basic block.
|
||||
let new_block = BasicBlockData {
|
||||
statements: block_data.statements.split_off(location.statement_index),
|
||||
terminator: block_data.terminator.take(),
|
||||
is_cleanup: block_data.is_cleanup,
|
||||
};
|
||||
let new_block = BasicBlockData::new_stmts(
|
||||
block_data.statements.split_off(location.statement_index),
|
||||
block_data.terminator.take(),
|
||||
block_data.is_cleanup,
|
||||
);
|
||||
|
||||
basic_blocks.push(new_block)
|
||||
}
|
||||
|
||||
@@ -257,11 +257,11 @@ impl<'tcx> TransformVisitor<'tcx> {
|
||||
StatementKind::Assign(Box::new((Place::return_place(), none_value))),
|
||||
)];
|
||||
|
||||
body.basic_blocks_mut().push(BasicBlockData {
|
||||
body.basic_blocks_mut().push(BasicBlockData::new_stmts(
|
||||
statements,
|
||||
terminator: Some(Terminator { source_info, kind: TerminatorKind::Return }),
|
||||
is_cleanup: false,
|
||||
});
|
||||
Some(Terminator { source_info, kind: TerminatorKind::Return }),
|
||||
false,
|
||||
));
|
||||
|
||||
block
|
||||
}
|
||||
@@ -1073,11 +1073,11 @@ fn insert_switch<'tcx>(
|
||||
let source_info = SourceInfo::outermost(body.span);
|
||||
body.basic_blocks_mut().raw.insert(
|
||||
0,
|
||||
BasicBlockData {
|
||||
statements: vec![assign],
|
||||
terminator: Some(Terminator { source_info, kind: switch }),
|
||||
is_cleanup: false,
|
||||
},
|
||||
BasicBlockData::new_stmts(
|
||||
vec![assign],
|
||||
Some(Terminator { source_info, kind: switch }),
|
||||
false,
|
||||
),
|
||||
);
|
||||
|
||||
for b in body.basic_blocks_mut().iter_mut() {
|
||||
@@ -1087,11 +1087,7 @@ fn insert_switch<'tcx>(
|
||||
|
||||
fn insert_term_block<'tcx>(body: &mut Body<'tcx>, kind: TerminatorKind<'tcx>) -> BasicBlock {
|
||||
let source_info = SourceInfo::outermost(body.span);
|
||||
body.basic_blocks_mut().push(BasicBlockData {
|
||||
statements: Vec::new(),
|
||||
terminator: Some(Terminator { source_info, kind }),
|
||||
is_cleanup: false,
|
||||
})
|
||||
body.basic_blocks_mut().push(BasicBlockData::new(Some(Terminator { source_info, kind }), false))
|
||||
}
|
||||
|
||||
fn return_poll_ready_assign<'tcx>(tcx: TyCtxt<'tcx>, source_info: SourceInfo) -> Statement<'tcx> {
|
||||
@@ -1112,11 +1108,11 @@ fn return_poll_ready_assign<'tcx>(tcx: TyCtxt<'tcx>, source_info: SourceInfo) ->
|
||||
|
||||
fn insert_poll_ready_block<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) -> BasicBlock {
|
||||
let source_info = SourceInfo::outermost(body.span);
|
||||
body.basic_blocks_mut().push(BasicBlockData {
|
||||
statements: [return_poll_ready_assign(tcx, source_info)].to_vec(),
|
||||
terminator: Some(Terminator { source_info, kind: TerminatorKind::Return }),
|
||||
is_cleanup: false,
|
||||
})
|
||||
body.basic_blocks_mut().push(BasicBlockData::new_stmts(
|
||||
[return_poll_ready_assign(tcx, source_info)].to_vec(),
|
||||
Some(Terminator { source_info, kind: TerminatorKind::Return }),
|
||||
false,
|
||||
))
|
||||
}
|
||||
|
||||
fn insert_panic_block<'tcx>(
|
||||
@@ -1200,13 +1196,11 @@ fn generate_poison_block_and_redirect_unwinds_there<'tcx>(
|
||||
body: &mut Body<'tcx>,
|
||||
) {
|
||||
let source_info = SourceInfo::outermost(body.span);
|
||||
let poison_block = body.basic_blocks_mut().push(BasicBlockData {
|
||||
statements: vec![
|
||||
transform.set_discr(VariantIdx::new(CoroutineArgs::POISONED), source_info),
|
||||
],
|
||||
terminator: Some(Terminator { source_info, kind: TerminatorKind::UnwindResume }),
|
||||
is_cleanup: true,
|
||||
});
|
||||
let poison_block = body.basic_blocks_mut().push(BasicBlockData::new_stmts(
|
||||
vec![transform.set_discr(VariantIdx::new(CoroutineArgs::POISONED), source_info)],
|
||||
Some(Terminator { source_info, kind: TerminatorKind::UnwindResume }),
|
||||
true,
|
||||
));
|
||||
|
||||
for (idx, block) in body.basic_blocks_mut().iter_enumerated_mut() {
|
||||
let source_info = block.terminator().source_info;
|
||||
@@ -1357,14 +1351,11 @@ fn create_cases<'tcx>(
|
||||
}
|
||||
|
||||
// Then jump to the real target
|
||||
let block = body.basic_blocks_mut().push(BasicBlockData {
|
||||
let block = body.basic_blocks_mut().push(BasicBlockData::new_stmts(
|
||||
statements,
|
||||
terminator: Some(Terminator {
|
||||
source_info,
|
||||
kind: TerminatorKind::Goto { target },
|
||||
}),
|
||||
is_cleanup: false,
|
||||
});
|
||||
Some(Terminator { source_info, kind: TerminatorKind::Goto { target } }),
|
||||
false,
|
||||
));
|
||||
|
||||
(point.state, block)
|
||||
})
|
||||
|
||||
@@ -102,9 +102,9 @@ fn build_pin_fut<'tcx>(
|
||||
);
|
||||
|
||||
// call Pin<FutTy>::new_unchecked(&mut fut)
|
||||
let pin_fut_bb = body.basic_blocks_mut().push(BasicBlockData {
|
||||
statements: [storage_live, fut_ref_assign].to_vec(),
|
||||
terminator: Some(Terminator {
|
||||
let pin_fut_bb = body.basic_blocks_mut().push(BasicBlockData::new_stmts(
|
||||
[storage_live, fut_ref_assign].to_vec(),
|
||||
Some(Terminator {
|
||||
source_info,
|
||||
kind: TerminatorKind::Call {
|
||||
func: pin_fut_new_unchecked_fn,
|
||||
@@ -116,8 +116,8 @@ fn build_pin_fut<'tcx>(
|
||||
fn_span: span,
|
||||
},
|
||||
}),
|
||||
is_cleanup: false,
|
||||
});
|
||||
false,
|
||||
));
|
||||
(pin_fut_bb, fut_pin_place)
|
||||
}
|
||||
|
||||
@@ -161,9 +161,9 @@ fn build_poll_switch<'tcx>(
|
||||
);
|
||||
let storage_dead = Statement::new(source_info, StatementKind::StorageDead(fut_pin_place.local));
|
||||
let unreachable_block = insert_term_block(body, TerminatorKind::Unreachable);
|
||||
body.basic_blocks_mut().push(BasicBlockData {
|
||||
statements: [storage_dead, discr_assign].to_vec(),
|
||||
terminator: Some(Terminator {
|
||||
body.basic_blocks_mut().push(BasicBlockData::new_stmts(
|
||||
[storage_dead, discr_assign].to_vec(),
|
||||
Some(Terminator {
|
||||
source_info,
|
||||
kind: TerminatorKind::SwitchInt {
|
||||
discr: Operand::Move(poll_discr_place),
|
||||
@@ -174,8 +174,8 @@ fn build_poll_switch<'tcx>(
|
||||
),
|
||||
},
|
||||
}),
|
||||
is_cleanup: false,
|
||||
})
|
||||
false,
|
||||
))
|
||||
}
|
||||
|
||||
// Gather blocks, reachable through 'drop' targets of Yield and Drop terminators (chained)
|
||||
@@ -546,11 +546,8 @@ pub(super) fn insert_clean_drop<'tcx>(
|
||||
};
|
||||
|
||||
// Create a block to destroy an unresumed coroutines. This can only destroy upvars.
|
||||
body.basic_blocks_mut().push(BasicBlockData {
|
||||
statements: Vec::new(),
|
||||
terminator: Some(Terminator { source_info, kind: term }),
|
||||
is_cleanup: false,
|
||||
})
|
||||
body.basic_blocks_mut()
|
||||
.push(BasicBlockData::new(Some(Terminator { source_info, kind: term }), false))
|
||||
}
|
||||
|
||||
pub(super) fn create_coroutine_drop_shim<'tcx>(
|
||||
@@ -729,11 +726,7 @@ pub(super) fn create_coroutine_drop_shim_proxy_async<'tcx>(
|
||||
body.local_decls[RETURN_PLACE] = LocalDecl::with_source_info(poll_enum, source_info);
|
||||
|
||||
// call coroutine_drop()
|
||||
let call_bb = body.basic_blocks_mut().push(BasicBlockData {
|
||||
statements: Vec::new(),
|
||||
terminator: None,
|
||||
is_cleanup: false,
|
||||
});
|
||||
let call_bb = body.basic_blocks_mut().push(BasicBlockData::new(None, false));
|
||||
|
||||
// return Poll::Ready()
|
||||
let ret_bb = insert_poll_ready_block(tcx, &mut body);
|
||||
|
||||
@@ -68,14 +68,13 @@ impl<'tcx> MockBlocks<'tcx> {
|
||||
BytePos(1)
|
||||
};
|
||||
let next_hi = next_lo + BytePos(1);
|
||||
self.blocks.push(BasicBlockData {
|
||||
statements: vec![],
|
||||
terminator: Some(Terminator {
|
||||
self.blocks.push(BasicBlockData::new(
|
||||
Some(Terminator {
|
||||
source_info: SourceInfo::outermost(Span::with_root_ctxt(next_lo, next_hi)),
|
||||
kind,
|
||||
}),
|
||||
is_cleanup: false,
|
||||
})
|
||||
false,
|
||||
))
|
||||
}
|
||||
|
||||
fn link(&mut self, from_block: BasicBlock, to_block: BasicBlock) {
|
||||
|
||||
@@ -222,15 +222,14 @@ where
|
||||
let span = self.source_info.span;
|
||||
|
||||
let pin_obj_bb = bb.unwrap_or_else(|| {
|
||||
self.elaborator.patch().new_block(BasicBlockData {
|
||||
statements: vec![],
|
||||
terminator: Some(Terminator {
|
||||
self.elaborator.patch().new_block(BasicBlockData::new(
|
||||
Some(Terminator {
|
||||
// Temporary terminator, will be replaced by patch
|
||||
source_info: self.source_info,
|
||||
kind: TerminatorKind::Return,
|
||||
}),
|
||||
is_cleanup: false,
|
||||
})
|
||||
false,
|
||||
))
|
||||
});
|
||||
|
||||
let (fut_ty, drop_fn_def_id, trait_args) = if call_destructor_only {
|
||||
@@ -730,17 +729,17 @@ where
|
||||
|
||||
let do_drop_bb = self.drop_subpath(interior, interior_path, succ, unwind, dropline);
|
||||
|
||||
let setup_bbd = BasicBlockData {
|
||||
statements: vec![self.assign(
|
||||
let setup_bbd = BasicBlockData::new_stmts(
|
||||
vec![self.assign(
|
||||
Place::from(ptr_local),
|
||||
Rvalue::Cast(CastKind::Transmute, Operand::Copy(nonnull_place), ptr_ty),
|
||||
)],
|
||||
terminator: Some(Terminator {
|
||||
Some(Terminator {
|
||||
kind: TerminatorKind::Goto { target: do_drop_bb },
|
||||
source_info: self.source_info,
|
||||
}),
|
||||
is_cleanup: unwind.is_cleanup(),
|
||||
};
|
||||
unwind.is_cleanup(),
|
||||
);
|
||||
self.elaborator.patch().new_block(setup_bbd)
|
||||
}
|
||||
|
||||
@@ -751,14 +750,13 @@ where
|
||||
args: GenericArgsRef<'tcx>,
|
||||
) -> BasicBlock {
|
||||
if adt.variants().is_empty() {
|
||||
return self.elaborator.patch().new_block(BasicBlockData {
|
||||
statements: vec![],
|
||||
terminator: Some(Terminator {
|
||||
return self.elaborator.patch().new_block(BasicBlockData::new(
|
||||
Some(Terminator {
|
||||
source_info: self.source_info,
|
||||
kind: TerminatorKind::Unreachable,
|
||||
}),
|
||||
is_cleanup: self.unwind.is_cleanup(),
|
||||
});
|
||||
self.unwind.is_cleanup(),
|
||||
));
|
||||
}
|
||||
|
||||
let skip_contents = adt.is_union() || adt.is_manually_drop();
|
||||
@@ -925,9 +923,9 @@ where
|
||||
let discr_ty = adt.repr().discr_type().to_ty(self.tcx());
|
||||
let discr = Place::from(self.new_temp(discr_ty));
|
||||
let discr_rv = Rvalue::Discriminant(self.place);
|
||||
let switch_block = BasicBlockData {
|
||||
statements: vec![self.assign(discr, discr_rv)],
|
||||
terminator: Some(Terminator {
|
||||
let switch_block = BasicBlockData::new_stmts(
|
||||
vec![self.assign(discr, discr_rv)],
|
||||
Some(Terminator {
|
||||
source_info: self.source_info,
|
||||
kind: TerminatorKind::SwitchInt {
|
||||
discr: Operand::Move(discr),
|
||||
@@ -937,8 +935,8 @@ where
|
||||
),
|
||||
},
|
||||
}),
|
||||
is_cleanup: unwind.is_cleanup(),
|
||||
};
|
||||
unwind.is_cleanup(),
|
||||
);
|
||||
let switch_block = self.elaborator.patch().new_block(switch_block);
|
||||
self.drop_flag_test_block(switch_block, succ, unwind)
|
||||
}
|
||||
@@ -954,8 +952,8 @@ where
|
||||
let ref_place = self.new_temp(ref_ty);
|
||||
let unit_temp = Place::from(self.new_temp(tcx.types.unit));
|
||||
|
||||
let result = BasicBlockData {
|
||||
statements: vec![self.assign(
|
||||
let result = BasicBlockData::new_stmts(
|
||||
vec![self.assign(
|
||||
Place::from(ref_place),
|
||||
Rvalue::Ref(
|
||||
tcx.lifetimes.re_erased,
|
||||
@@ -963,7 +961,7 @@ where
|
||||
self.place,
|
||||
),
|
||||
)],
|
||||
terminator: Some(Terminator {
|
||||
Some(Terminator {
|
||||
kind: TerminatorKind::Call {
|
||||
func: Operand::function_handle(
|
||||
tcx,
|
||||
@@ -981,8 +979,8 @@ where
|
||||
},
|
||||
source_info: self.source_info,
|
||||
}),
|
||||
is_cleanup: unwind.is_cleanup(),
|
||||
};
|
||||
unwind.is_cleanup(),
|
||||
);
|
||||
|
||||
let destructor_block = self.elaborator.patch().new_block(result);
|
||||
|
||||
@@ -1045,8 +1043,8 @@ where
|
||||
let can_go = Place::from(self.new_temp(tcx.types.bool));
|
||||
let one = self.constant_usize(1);
|
||||
|
||||
let drop_block = BasicBlockData {
|
||||
statements: vec![
|
||||
let drop_block = BasicBlockData::new_stmts(
|
||||
vec![
|
||||
self.assign(
|
||||
ptr,
|
||||
Rvalue::RawPtr(RawPtrKind::Mut, tcx.mk_place_index(self.place, cur)),
|
||||
@@ -1056,26 +1054,26 @@ where
|
||||
Rvalue::BinaryOp(BinOp::Add, Box::new((move_(cur.into()), one))),
|
||||
),
|
||||
],
|
||||
is_cleanup: unwind.is_cleanup(),
|
||||
terminator: Some(Terminator {
|
||||
Some(Terminator {
|
||||
source_info: self.source_info,
|
||||
// this gets overwritten by drop elaboration.
|
||||
kind: TerminatorKind::Unreachable,
|
||||
}),
|
||||
};
|
||||
unwind.is_cleanup(),
|
||||
);
|
||||
let drop_block = self.elaborator.patch().new_block(drop_block);
|
||||
|
||||
let loop_block = BasicBlockData {
|
||||
statements: vec![self.assign(
|
||||
let loop_block = BasicBlockData::new_stmts(
|
||||
vec![self.assign(
|
||||
can_go,
|
||||
Rvalue::BinaryOp(BinOp::Eq, Box::new((copy(Place::from(cur)), copy(len.into())))),
|
||||
)],
|
||||
is_cleanup: unwind.is_cleanup(),
|
||||
terminator: Some(Terminator {
|
||||
Some(Terminator {
|
||||
source_info: self.source_info,
|
||||
kind: TerminatorKind::if_(move_(can_go), succ, drop_block),
|
||||
}),
|
||||
};
|
||||
unwind.is_cleanup(),
|
||||
);
|
||||
let loop_block = self.elaborator.patch().new_block(loop_block);
|
||||
|
||||
let place = tcx.mk_place_deref(ptr);
|
||||
@@ -1185,8 +1183,8 @@ where
|
||||
let slice_ptr_ty = Ty::new_mut_ptr(tcx, slice_ty);
|
||||
let slice_ptr = self.new_temp(slice_ptr_ty);
|
||||
|
||||
let mut delegate_block = BasicBlockData {
|
||||
statements: vec![
|
||||
let mut delegate_block = BasicBlockData::new_stmts(
|
||||
vec![
|
||||
self.assign(Place::from(array_ptr), Rvalue::RawPtr(RawPtrKind::Mut, self.place)),
|
||||
self.assign(
|
||||
Place::from(slice_ptr),
|
||||
@@ -1200,9 +1198,9 @@ where
|
||||
),
|
||||
),
|
||||
],
|
||||
is_cleanup: self.unwind.is_cleanup(),
|
||||
terminator: None,
|
||||
};
|
||||
None,
|
||||
self.unwind.is_cleanup(),
|
||||
);
|
||||
|
||||
let array_place = mem::replace(
|
||||
&mut self.place,
|
||||
@@ -1244,8 +1242,8 @@ where
|
||||
};
|
||||
|
||||
let zero = self.constant_usize(0);
|
||||
let block = BasicBlockData {
|
||||
statements: vec![
|
||||
let block = BasicBlockData::new_stmts(
|
||||
vec![
|
||||
self.assign(
|
||||
len.into(),
|
||||
Rvalue::UnaryOp(
|
||||
@@ -1255,12 +1253,12 @@ where
|
||||
),
|
||||
self.assign(cur.into(), Rvalue::Use(zero)),
|
||||
],
|
||||
is_cleanup: unwind.is_cleanup(),
|
||||
terminator: Some(Terminator {
|
||||
Some(Terminator {
|
||||
source_info: self.source_info,
|
||||
kind: TerminatorKind::Goto { target: loop_block },
|
||||
}),
|
||||
};
|
||||
unwind.is_cleanup(),
|
||||
);
|
||||
|
||||
let drop_block = self.elaborator.patch().new_block(block);
|
||||
// FIXME(#34708): handle partially-dropped array/slice elements.
|
||||
@@ -1306,14 +1304,13 @@ where
|
||||
self.source_info.span,
|
||||
"open drop for unsafe binder shouldn't be encountered",
|
||||
);
|
||||
self.elaborator.patch().new_block(BasicBlockData {
|
||||
statements: vec![],
|
||||
terminator: Some(Terminator {
|
||||
self.elaborator.patch().new_block(BasicBlockData::new(
|
||||
Some(Terminator {
|
||||
source_info: self.source_info,
|
||||
kind: TerminatorKind::Unreachable,
|
||||
}),
|
||||
is_cleanup: self.unwind.is_cleanup(),
|
||||
})
|
||||
self.unwind.is_cleanup(),
|
||||
))
|
||||
}
|
||||
|
||||
_ => span_bug!(self.source_info.span, "open drop from non-ADT `{:?}`", ty),
|
||||
@@ -1432,11 +1429,10 @@ where
|
||||
}
|
||||
|
||||
fn new_block(&mut self, unwind: Unwind, k: TerminatorKind<'tcx>) -> BasicBlock {
|
||||
self.elaborator.patch().new_block(BasicBlockData {
|
||||
statements: vec![],
|
||||
terminator: Some(Terminator { source_info: self.source_info, kind: k }),
|
||||
is_cleanup: unwind.is_cleanup(),
|
||||
})
|
||||
self.elaborator.patch().new_block(BasicBlockData::new(
|
||||
Some(Terminator { source_info: self.source_info, kind: k }),
|
||||
unwind.is_cleanup(),
|
||||
))
|
||||
}
|
||||
|
||||
fn new_block_with_statements(
|
||||
@@ -1445,11 +1441,11 @@ where
|
||||
statements: Vec<Statement<'tcx>>,
|
||||
k: TerminatorKind<'tcx>,
|
||||
) -> BasicBlock {
|
||||
self.elaborator.patch().new_block(BasicBlockData {
|
||||
self.elaborator.patch().new_block(BasicBlockData::new_stmts(
|
||||
statements,
|
||||
terminator: Some(Terminator { source_info: self.source_info, kind: k }),
|
||||
is_cleanup: unwind.is_cleanup(),
|
||||
})
|
||||
Some(Terminator { source_info: self.source_info, kind: k }),
|
||||
unwind.is_cleanup(),
|
||||
))
|
||||
}
|
||||
|
||||
fn new_temp(&mut self, ty: Ty<'tcx>) -> Local {
|
||||
|
||||
@@ -78,14 +78,13 @@ impl<'tcx> MirPatch<'tcx> {
|
||||
return bb;
|
||||
}
|
||||
|
||||
let bb = self.new_block(BasicBlockData {
|
||||
statements: vec![],
|
||||
terminator: Some(Terminator {
|
||||
let bb = self.new_block(BasicBlockData::new(
|
||||
Some(Terminator {
|
||||
source_info: SourceInfo::outermost(self.body_span),
|
||||
kind: TerminatorKind::UnwindResume,
|
||||
}),
|
||||
is_cleanup: true,
|
||||
});
|
||||
true,
|
||||
));
|
||||
self.resume_block = Some(bb);
|
||||
bb
|
||||
}
|
||||
@@ -95,14 +94,13 @@ impl<'tcx> MirPatch<'tcx> {
|
||||
return bb;
|
||||
}
|
||||
|
||||
let bb = self.new_block(BasicBlockData {
|
||||
statements: vec![],
|
||||
terminator: Some(Terminator {
|
||||
let bb = self.new_block(BasicBlockData::new(
|
||||
Some(Terminator {
|
||||
source_info: SourceInfo::outermost(self.body_span),
|
||||
kind: TerminatorKind::Unreachable,
|
||||
}),
|
||||
is_cleanup: true,
|
||||
});
|
||||
true,
|
||||
));
|
||||
self.unreachable_cleanup_block = Some(bb);
|
||||
bb
|
||||
}
|
||||
@@ -112,14 +110,13 @@ impl<'tcx> MirPatch<'tcx> {
|
||||
return bb;
|
||||
}
|
||||
|
||||
let bb = self.new_block(BasicBlockData {
|
||||
statements: vec![],
|
||||
terminator: Some(Terminator {
|
||||
let bb = self.new_block(BasicBlockData::new(
|
||||
Some(Terminator {
|
||||
source_info: SourceInfo::outermost(self.body_span),
|
||||
kind: TerminatorKind::Unreachable,
|
||||
}),
|
||||
is_cleanup: false,
|
||||
});
|
||||
false,
|
||||
));
|
||||
self.unreachable_no_cleanup_block = Some(bb);
|
||||
bb
|
||||
}
|
||||
@@ -131,14 +128,13 @@ impl<'tcx> MirPatch<'tcx> {
|
||||
return cached_bb;
|
||||
}
|
||||
|
||||
let bb = self.new_block(BasicBlockData {
|
||||
statements: vec![],
|
||||
terminator: Some(Terminator {
|
||||
let bb = self.new_block(BasicBlockData::new(
|
||||
Some(Terminator {
|
||||
source_info: SourceInfo::outermost(self.body_span),
|
||||
kind: TerminatorKind::UnwindTerminate(reason),
|
||||
}),
|
||||
is_cleanup: true,
|
||||
});
|
||||
true,
|
||||
));
|
||||
self.terminate_block = Some((bb, reason));
|
||||
bb
|
||||
}
|
||||
|
||||
@@ -731,14 +731,13 @@ struct Promoter<'a, 'tcx> {
|
||||
impl<'a, 'tcx> Promoter<'a, 'tcx> {
|
||||
fn new_block(&mut self) -> BasicBlock {
|
||||
let span = self.promoted.span;
|
||||
self.promoted.basic_blocks_mut().push(BasicBlockData {
|
||||
statements: vec![],
|
||||
terminator: Some(Terminator {
|
||||
self.promoted.basic_blocks_mut().push(BasicBlockData::new(
|
||||
Some(Terminator {
|
||||
source_info: SourceInfo::outermost(span),
|
||||
kind: TerminatorKind::Return,
|
||||
}),
|
||||
is_cleanup: false,
|
||||
})
|
||||
false,
|
||||
))
|
||||
}
|
||||
|
||||
fn assign(&mut self, dest: Local, rvalue: Rvalue<'tcx>, span: Span) {
|
||||
|
||||
@@ -348,11 +348,7 @@ fn build_drop_shim<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId, ty: Option<Ty<'tcx>>)
|
||||
let return_block = BasicBlock::new(1);
|
||||
let mut blocks = IndexVec::with_capacity(2);
|
||||
let block = |blocks: &mut IndexVec<_, _>, kind| {
|
||||
blocks.push(BasicBlockData {
|
||||
statements: vec![],
|
||||
terminator: Some(Terminator { source_info, kind }),
|
||||
is_cleanup: false,
|
||||
})
|
||||
blocks.push(BasicBlockData::new(Some(Terminator { source_info, kind }), false))
|
||||
};
|
||||
block(&mut blocks, TerminatorKind::Goto { target: return_block });
|
||||
block(&mut blocks, TerminatorKind::Return);
|
||||
@@ -513,17 +509,17 @@ fn build_thread_local_shim<'tcx>(
|
||||
let span = tcx.def_span(def_id);
|
||||
let source_info = SourceInfo::outermost(span);
|
||||
|
||||
let blocks = IndexVec::from_raw(vec![BasicBlockData {
|
||||
statements: vec![Statement::new(
|
||||
let blocks = IndexVec::from_raw(vec![BasicBlockData::new_stmts(
|
||||
vec![Statement::new(
|
||||
source_info,
|
||||
StatementKind::Assign(Box::new((
|
||||
Place::return_place(),
|
||||
Rvalue::ThreadLocalRef(def_id),
|
||||
))),
|
||||
)],
|
||||
terminator: Some(Terminator { source_info, kind: TerminatorKind::Return }),
|
||||
is_cleanup: false,
|
||||
}]);
|
||||
Some(Terminator { source_info, kind: TerminatorKind::Return }),
|
||||
false,
|
||||
)]);
|
||||
|
||||
new_body(
|
||||
MirSource::from_instance(instance),
|
||||
@@ -607,11 +603,11 @@ impl<'tcx> CloneShimBuilder<'tcx> {
|
||||
is_cleanup: bool,
|
||||
) -> BasicBlock {
|
||||
let source_info = self.source_info();
|
||||
self.blocks.push(BasicBlockData {
|
||||
self.blocks.push(BasicBlockData::new_stmts(
|
||||
statements,
|
||||
terminator: Some(Terminator { source_info, kind }),
|
||||
Some(Terminator { source_info, kind }),
|
||||
is_cleanup,
|
||||
})
|
||||
))
|
||||
}
|
||||
|
||||
/// Gives the index of an upcoming BasicBlock, with an offset.
|
||||
@@ -954,11 +950,11 @@ fn build_call_shim<'tcx>(
|
||||
let n_blocks = if let Some(Adjustment::RefMut) = rcvr_adjustment { 5 } else { 2 };
|
||||
let mut blocks = IndexVec::with_capacity(n_blocks);
|
||||
let block = |blocks: &mut IndexVec<_, _>, statements, kind, is_cleanup| {
|
||||
blocks.push(BasicBlockData {
|
||||
blocks.push(BasicBlockData::new_stmts(
|
||||
statements,
|
||||
terminator: Some(Terminator { source_info, kind }),
|
||||
Some(Terminator { source_info, kind }),
|
||||
is_cleanup,
|
||||
})
|
||||
))
|
||||
};
|
||||
|
||||
// BB #0
|
||||
@@ -1082,11 +1078,11 @@ pub(super) fn build_adt_ctor(tcx: TyCtxt<'_>, ctor_id: DefId) -> Body<'_> {
|
||||
))),
|
||||
);
|
||||
|
||||
let start_block = BasicBlockData {
|
||||
statements: vec![statement],
|
||||
terminator: Some(Terminator { source_info, kind: TerminatorKind::Return }),
|
||||
is_cleanup: false,
|
||||
};
|
||||
let start_block = BasicBlockData::new_stmts(
|
||||
vec![statement],
|
||||
Some(Terminator { source_info, kind: TerminatorKind::Return }),
|
||||
false,
|
||||
);
|
||||
|
||||
let source = MirSource::item(ctor_id);
|
||||
let mut body = new_body(
|
||||
@@ -1133,11 +1129,11 @@ fn build_fn_ptr_addr_shim<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId, self_ty: Ty<'t
|
||||
StatementKind::Assign(Box::new((Place::return_place(), rvalue))),
|
||||
);
|
||||
let statements = vec![stmt];
|
||||
let start_block = BasicBlockData {
|
||||
let start_block = BasicBlockData::new_stmts(
|
||||
statements,
|
||||
terminator: Some(Terminator { source_info, kind: TerminatorKind::Return }),
|
||||
is_cleanup: false,
|
||||
};
|
||||
Some(Terminator { source_info, kind: TerminatorKind::Return }),
|
||||
false,
|
||||
);
|
||||
let source = MirSource::from_instance(ty::InstanceKind::FnPtrAddrShim(def_id, self_ty));
|
||||
new_body(source, IndexVec::from_elem_n(start_block, 1), locals, sig.inputs().len(), span)
|
||||
}
|
||||
@@ -1233,11 +1229,11 @@ fn build_construct_coroutine_by_move_shim<'tcx>(
|
||||
StatementKind::Assign(Box::new((Place::return_place(), rvalue))),
|
||||
);
|
||||
let statements = vec![stmt];
|
||||
let start_block = BasicBlockData {
|
||||
let start_block = BasicBlockData::new_stmts(
|
||||
statements,
|
||||
terminator: Some(Terminator { source_info, kind: TerminatorKind::Return }),
|
||||
is_cleanup: false,
|
||||
};
|
||||
Some(Terminator { source_info, kind: TerminatorKind::Return }),
|
||||
false,
|
||||
);
|
||||
|
||||
let source = MirSource::from_instance(ty::InstanceKind::ConstructCoroutineInClosureShim {
|
||||
coroutine_closure_def_id,
|
||||
|
||||
@@ -88,11 +88,7 @@ pub(super) fn build_async_drop_shim<'tcx>(
|
||||
let return_block = BasicBlock::new(1);
|
||||
let mut blocks = IndexVec::with_capacity(2);
|
||||
let block = |blocks: &mut IndexVec<_, _>, kind| {
|
||||
blocks.push(BasicBlockData {
|
||||
statements: vec![],
|
||||
terminator: Some(Terminator { source_info, kind }),
|
||||
is_cleanup: false,
|
||||
})
|
||||
blocks.push(BasicBlockData::new(Some(Terminator { source_info, kind }), false))
|
||||
};
|
||||
block(
|
||||
&mut blocks,
|
||||
@@ -378,9 +374,9 @@ fn build_adrop_for_adrop_shim<'tcx>(
|
||||
|
||||
let pin_fn = tcx.require_lang_item(LangItem::PinNewUnchecked, span);
|
||||
// call Pin<FutTy>::new_unchecked(&mut impl_cor)
|
||||
blocks.push(BasicBlockData {
|
||||
blocks.push(BasicBlockData::new_stmts(
|
||||
statements,
|
||||
terminator: Some(Terminator {
|
||||
Some(Terminator {
|
||||
source_info,
|
||||
kind: TerminatorKind::Call {
|
||||
func: Operand::function_handle(tcx, pin_fn, [cor_ref.into()], span),
|
||||
@@ -392,15 +388,14 @@ fn build_adrop_for_adrop_shim<'tcx>(
|
||||
fn_span: span,
|
||||
},
|
||||
}),
|
||||
is_cleanup: false,
|
||||
});
|
||||
false,
|
||||
));
|
||||
// When dropping async drop coroutine, we continue its execution:
|
||||
// we call impl::poll (impl_layout, ctx)
|
||||
let poll_fn = tcx.require_lang_item(LangItem::FuturePoll, span);
|
||||
let resume_ctx = Place::from(Local::new(2));
|
||||
blocks.push(BasicBlockData {
|
||||
statements: vec![],
|
||||
terminator: Some(Terminator {
|
||||
blocks.push(BasicBlockData::new(
|
||||
Some(Terminator {
|
||||
source_info,
|
||||
kind: TerminatorKind::Call {
|
||||
func: Operand::function_handle(tcx, poll_fn, [impl_ty.into()], span),
|
||||
@@ -416,13 +411,12 @@ fn build_adrop_for_adrop_shim<'tcx>(
|
||||
fn_span: span,
|
||||
},
|
||||
}),
|
||||
is_cleanup: false,
|
||||
});
|
||||
blocks.push(BasicBlockData {
|
||||
statements: vec![],
|
||||
terminator: Some(Terminator { source_info, kind: TerminatorKind::Return }),
|
||||
is_cleanup: false,
|
||||
});
|
||||
false,
|
||||
));
|
||||
blocks.push(BasicBlockData::new(
|
||||
Some(Terminator { source_info, kind: TerminatorKind::Return }),
|
||||
false,
|
||||
));
|
||||
|
||||
let source = MirSource::from_instance(instance);
|
||||
let mut body = new_body(source, blocks, locals, sig.inputs().len(), span);
|
||||
|
||||
Reference in New Issue
Block a user