Refactor unwind from Option to a new enum
This commit is contained in:
parent
7f6edd3f15
commit
daeb844e0c
39 changed files with 328 additions and 250 deletions
|
@ -171,7 +171,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
|||
args: vec![Operand::Move(size), Operand::Move(align)],
|
||||
destination: storage,
|
||||
target: Some(success),
|
||||
cleanup: None,
|
||||
unwind: UnwindAction::Continue,
|
||||
from_hir_call: false,
|
||||
fn_span: expr_span,
|
||||
},
|
||||
|
@ -702,7 +702,11 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
|||
this.cfg.terminate(
|
||||
block,
|
||||
outer_source_info,
|
||||
TerminatorKind::Drop { place: to_drop, target: success, unwind: None },
|
||||
TerminatorKind::Drop {
|
||||
place: to_drop,
|
||||
target: success,
|
||||
unwind: UnwindAction::Continue,
|
||||
},
|
||||
);
|
||||
this.diverge_from(block);
|
||||
block = success;
|
||||
|
|
|
@ -228,7 +228,10 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
|||
this.cfg.terminate(
|
||||
loop_block,
|
||||
source_info,
|
||||
TerminatorKind::FalseUnwind { real_target: body_block, unwind: None },
|
||||
TerminatorKind::FalseUnwind {
|
||||
real_target: body_block,
|
||||
unwind: UnwindAction::Continue,
|
||||
},
|
||||
);
|
||||
this.diverge_from(loop_block);
|
||||
|
||||
|
@ -264,7 +267,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
|||
TerminatorKind::Call {
|
||||
func: fun,
|
||||
args,
|
||||
cleanup: None,
|
||||
unwind: UnwindAction::Continue,
|
||||
destination,
|
||||
// The presence or absence of a return edge affects control-flow sensitive
|
||||
// MIR checks and ultimately whether code is accepted or not. We can only
|
||||
|
@ -466,7 +469,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
|||
} else {
|
||||
Some(destination_block)
|
||||
},
|
||||
cleanup: None,
|
||||
unwind: UnwindAction::Continue,
|
||||
},
|
||||
);
|
||||
if options.contains(InlineAsmOptions::MAY_UNWIND) {
|
||||
|
|
|
@ -263,7 +263,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
|||
args: vec![Operand::Move(ref_string)],
|
||||
destination: ref_str,
|
||||
target: Some(eq_block),
|
||||
cleanup: None,
|
||||
unwind: UnwindAction::Continue,
|
||||
from_hir_call: false,
|
||||
fn_span: source_info.span
|
||||
}
|
||||
|
@ -466,7 +466,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
|||
args: vec![val, expect],
|
||||
destination: eq_result,
|
||||
target: Some(eq_block),
|
||||
cleanup: None,
|
||||
unwind: UnwindAction::Continue,
|
||||
from_hir_call: false,
|
||||
fn_span: source_info.span,
|
||||
},
|
||||
|
|
|
@ -369,7 +369,7 @@ impl DropTree {
|
|||
let terminator = TerminatorKind::Drop {
|
||||
target: blocks[drop_data.1].unwrap(),
|
||||
// The caller will handle this if needed.
|
||||
unwind: None,
|
||||
unwind: UnwindAction::Continue,
|
||||
place: drop_data.0.local.into(),
|
||||
};
|
||||
cfg.terminate(block, drop_data.0.source_info, terminator);
|
||||
|
@ -1141,7 +1141,11 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
|||
self.cfg.terminate(
|
||||
block,
|
||||
source_info,
|
||||
TerminatorKind::Drop { place, target: assign, unwind: Some(assign_unwind) },
|
||||
TerminatorKind::Drop {
|
||||
place,
|
||||
target: assign,
|
||||
unwind: UnwindAction::Cleanup(assign_unwind),
|
||||
},
|
||||
);
|
||||
self.diverge_from(block);
|
||||
|
||||
|
@ -1165,7 +1169,13 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
|||
self.cfg.terminate(
|
||||
block,
|
||||
source_info,
|
||||
TerminatorKind::Assert { cond, expected, msg, target: success_block, cleanup: None },
|
||||
TerminatorKind::Assert {
|
||||
cond,
|
||||
expected,
|
||||
msg,
|
||||
target: success_block,
|
||||
unwind: UnwindAction::Continue,
|
||||
},
|
||||
);
|
||||
self.diverge_from(block);
|
||||
|
||||
|
@ -1244,7 +1254,11 @@ fn build_scope_drops<'tcx>(
|
|||
cfg.terminate(
|
||||
block,
|
||||
source_info,
|
||||
TerminatorKind::Drop { place: local.into(), target: next, unwind: None },
|
||||
TerminatorKind::Drop {
|
||||
place: local.into(),
|
||||
target: next,
|
||||
unwind: UnwindAction::Continue,
|
||||
},
|
||||
);
|
||||
block = next;
|
||||
}
|
||||
|
@ -1432,10 +1446,10 @@ impl<'tcx> DropTreeBuilder<'tcx> for Unwind {
|
|||
}
|
||||
}
|
||||
TerminatorKind::FalseUnwind { unwind, .. }
|
||||
| TerminatorKind::Call { cleanup: unwind, .. }
|
||||
| TerminatorKind::Assert { cleanup: unwind, .. }
|
||||
| TerminatorKind::InlineAsm { cleanup: unwind, .. } => {
|
||||
*unwind = Some(to);
|
||||
| TerminatorKind::Call { unwind, .. }
|
||||
| TerminatorKind::Assert { unwind, .. }
|
||||
| TerminatorKind::InlineAsm { unwind, .. } => {
|
||||
*unwind = UnwindAction::Cleanup(to);
|
||||
}
|
||||
TerminatorKind::Goto { .. }
|
||||
| TerminatorKind::SwitchInt { .. }
|
||||
|
|
|
@ -3,7 +3,7 @@ use rustc_data_structures::graph::iterate::{
|
|||
NodeStatus, TriColorDepthFirstSearch, TriColorVisitor,
|
||||
};
|
||||
use rustc_hir::def::DefKind;
|
||||
use rustc_middle::mir::{BasicBlock, BasicBlocks, Body, Operand, TerminatorKind};
|
||||
use rustc_middle::mir::{self, BasicBlock, BasicBlocks, Body, Operand, TerminatorKind};
|
||||
use rustc_middle::ty::subst::{GenericArg, InternalSubsts};
|
||||
use rustc_middle::ty::{self, Instance, TyCtxt};
|
||||
use rustc_session::lint::builtin::UNCONDITIONAL_RECURSION;
|
||||
|
@ -149,7 +149,9 @@ impl<'mir, 'tcx> TriColorVisitor<BasicBlocks<'tcx>> for Search<'mir, 'tcx> {
|
|||
|
||||
fn ignore_edge(&mut self, bb: BasicBlock, target: BasicBlock) -> bool {
|
||||
let terminator = self.body[bb].terminator();
|
||||
if terminator.unwind() == Some(&Some(target)) && terminator.successors().count() > 1 {
|
||||
if terminator.unwind() == Some(&mir::UnwindAction::Cleanup(target))
|
||||
&& terminator.successors().count() > 1
|
||||
{
|
||||
return true;
|
||||
}
|
||||
// Don't traverse successors of recursive calls or false CFG edges.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue