Skip to content

Commit dd6127e

Browse files
committed
Mir: Add Terminatorkind::Abort
The Abort Terminatorkind will cause an llvm.trap function call to be emitted. Signed-off-by: David Henningsson <[email protected]>
1 parent fdfb007 commit dd6127e

File tree

17 files changed

+36
-3
lines changed

17 files changed

+36
-3
lines changed

src/librustc/ich/impls_mir.rs

+1
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ for mir::TerminatorKind<'gcx> {
150150
targets.hash_stable(hcx, hasher);
151151
}
152152
mir::TerminatorKind::Resume |
153+
mir::TerminatorKind::Abort |
153154
mir::TerminatorKind::Return |
154155
mir::TerminatorKind::GeneratorDrop |
155156
mir::TerminatorKind::Unreachable => {}

src/librustc/mir/mod.rs

+11-3
Original file line numberDiff line numberDiff line change
@@ -637,6 +637,10 @@ pub enum TerminatorKind<'tcx> {
637637
/// continue. Emitted by build::scope::diverge_cleanup.
638638
Resume,
639639

640+
/// Indicates that the landing pad is finished and that the process
641+
/// should abort. Used to prevent unwinding for foreign items.
642+
Abort,
643+
640644
/// Indicates a normal return. The return place should have
641645
/// been filled in by now. This should occur at most once.
642646
Return,
@@ -759,7 +763,7 @@ impl<'tcx> TerminatorKind<'tcx> {
759763
match *self {
760764
Goto { target: ref b } => slice::from_ref(b).into_cow(),
761765
SwitchInt { targets: ref b, .. } => b[..].into_cow(),
762-
Resume | GeneratorDrop => (&[]).into_cow(),
766+
Resume | Abort | GeneratorDrop => (&[]).into_cow(),
763767
Return => (&[]).into_cow(),
764768
Unreachable => (&[]).into_cow(),
765769
Call { destination: Some((_, t)), cleanup: Some(c), .. } => vec![t, c].into_cow(),
@@ -794,7 +798,7 @@ impl<'tcx> TerminatorKind<'tcx> {
794798
match *self {
795799
Goto { target: ref mut b } => vec![b],
796800
SwitchInt { targets: ref mut b, .. } => b.iter_mut().collect(),
797-
Resume | GeneratorDrop => Vec::new(),
801+
Resume | Abort | GeneratorDrop => Vec::new(),
798802
Return => Vec::new(),
799803
Unreachable => Vec::new(),
800804
Call { destination: Some((_, ref mut t)), cleanup: Some(ref mut c), .. } => vec![t, c],
@@ -823,6 +827,7 @@ impl<'tcx> TerminatorKind<'tcx> {
823827
match *self {
824828
TerminatorKind::Goto { .. } |
825829
TerminatorKind::Resume |
830+
TerminatorKind::Abort |
826831
TerminatorKind::Return |
827832
TerminatorKind::Unreachable |
828833
TerminatorKind::GeneratorDrop |
@@ -918,6 +923,7 @@ impl<'tcx> TerminatorKind<'tcx> {
918923
Return => write!(fmt, "return"),
919924
GeneratorDrop => write!(fmt, "generator_drop"),
920925
Resume => write!(fmt, "resume"),
926+
Abort => write!(fmt, "abort"),
921927
Yield { ref value, .. } => write!(fmt, "_1 = suspend({:?})", value),
922928
Unreachable => write!(fmt, "unreachable"),
923929
Drop { ref location, .. } => write!(fmt, "drop({:?})", location),
@@ -970,7 +976,7 @@ impl<'tcx> TerminatorKind<'tcx> {
970976
pub fn fmt_successor_labels(&self) -> Vec<Cow<'static, str>> {
971977
use self::TerminatorKind::*;
972978
match *self {
973-
Return | Resume | Unreachable | GeneratorDrop => vec![],
979+
Return | Resume | Abort | Unreachable | GeneratorDrop => vec![],
974980
Goto { .. } => vec!["".into()],
975981
SwitchInt { ref values, .. } => {
976982
values.iter()
@@ -2102,6 +2108,7 @@ impl<'tcx> TypeFoldable<'tcx> for Terminator<'tcx> {
21022108
},
21032109
GeneratorDrop => GeneratorDrop,
21042110
Resume => Resume,
2111+
Abort => Abort,
21052112
Return => Return,
21062113
Unreachable => Unreachable,
21072114
FalseEdges { real_target, ref imaginary_targets } =>
@@ -2143,6 +2150,7 @@ impl<'tcx> TypeFoldable<'tcx> for Terminator<'tcx> {
21432150
},
21442151
Goto { .. } |
21452152
Resume |
2153+
Abort |
21462154
Return |
21472155
GeneratorDrop |
21482156
Unreachable |

src/librustc/mir/visit.rs

+1
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,7 @@ macro_rules! make_mir_visitor {
432432
}
433433

434434
TerminatorKind::Resume |
435+
TerminatorKind::Abort |
435436
TerminatorKind::Return |
436437
TerminatorKind::GeneratorDrop |
437438
TerminatorKind::Unreachable => {

src/librustc_mir/borrow_check/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -557,6 +557,7 @@ impl<'cx, 'gcx, 'tcx> DataflowResultsConsumer<'cx, 'tcx> for MirBorrowckCtxt<'cx
557557
});
558558
}
559559
TerminatorKind::Goto { target: _ }
560+
| TerminatorKind::Abort
560561
| TerminatorKind::Unreachable
561562
| TerminatorKind::FalseEdges { .. } => {
562563
// no data used, thus irrelevant to borrowck

src/librustc_mir/borrow_check/nll/type_check/mod.rs

+4
Original file line numberDiff line numberDiff line change
@@ -780,6 +780,7 @@ impl<'a, 'gcx, 'tcx> TypeChecker<'a, 'gcx, 'tcx> {
780780
match term.kind {
781781
TerminatorKind::Goto { .. }
782782
| TerminatorKind::Resume
783+
| TerminatorKind::Abort
783784
| TerminatorKind::Return
784785
| TerminatorKind::GeneratorDrop
785786
| TerminatorKind::Unreachable
@@ -1082,6 +1083,9 @@ impl<'a, 'gcx, 'tcx> TypeChecker<'a, 'gcx, 'tcx> {
10821083
TerminatorKind::Resume => if !is_cleanup {
10831084
span_mirbug!(self, block_data, "resume on non-cleanup block!")
10841085
},
1086+
TerminatorKind::Abort => if !is_cleanup {
1087+
span_mirbug!(self, block_data, "abort on non-cleanup block!")
1088+
},
10851089
TerminatorKind::Return => if is_cleanup {
10861090
span_mirbug!(self, block_data, "return on cleanup block")
10871091
},

src/librustc_mir/dataflow/impls/borrows.rs

+1
Original file line numberDiff line numberDiff line change
@@ -465,6 +465,7 @@ impl<'a, 'gcx, 'tcx> Borrows<'a, 'gcx, 'tcx> {
465465
}
466466
}
467467
}
468+
mir::TerminatorKind::Abort |
468469
mir::TerminatorKind::SwitchInt {..} |
469470
mir::TerminatorKind::Drop {..} |
470471
mir::TerminatorKind::DropAndReplace {..} |

src/librustc_mir/dataflow/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -771,6 +771,7 @@ impl<'a, 'tcx: 'a, D> DataflowAnalysis<'a, 'tcx, D> where D: BitDenotation
771771
match bb_data.terminator().kind {
772772
mir::TerminatorKind::Return |
773773
mir::TerminatorKind::Resume |
774+
mir::TerminatorKind::Abort |
774775
mir::TerminatorKind::GeneratorDrop |
775776
mir::TerminatorKind::Unreachable => {}
776777
mir::TerminatorKind::Goto { ref target } |

src/librustc_mir/dataflow/move_paths/builder.rs

+1
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,7 @@ impl<'b, 'a, 'gcx, 'tcx> Gatherer<'b, 'a, 'gcx, 'tcx> {
334334
match term.kind {
335335
TerminatorKind::Goto { target: _ } |
336336
TerminatorKind::Resume |
337+
TerminatorKind::Abort |
337338
TerminatorKind::GeneratorDrop |
338339
TerminatorKind::FalseEdges { .. } |
339340
TerminatorKind::Unreachable => { }

src/librustc_mir/interpret/terminator/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ impl<'a, 'tcx, M: Machine<'tcx>> EvalContext<'a, 'tcx, M> {
163163
GeneratorDrop => unimplemented!(),
164164
DropAndReplace { .. } => unimplemented!(),
165165
Resume => unimplemented!(),
166+
Abort => unimplemented!(),
166167
FalseEdges { .. } => bug!("should have been eliminated by `simplify_branches` mir pass"),
167168
Unreachable => return err!(Unreachable),
168169
}

src/librustc_mir/monomorphize/collector.rs

+1
Original file line numberDiff line numberDiff line change
@@ -625,6 +625,7 @@ impl<'a, 'tcx> MirVisitor<'tcx> for MirNeighborCollector<'a, 'tcx> {
625625
mir::TerminatorKind::Goto { .. } |
626626
mir::TerminatorKind::SwitchInt { .. } |
627627
mir::TerminatorKind::Resume |
628+
mir::TerminatorKind::Abort |
628629
mir::TerminatorKind::Return |
629630
mir::TerminatorKind::Unreachable |
630631
mir::TerminatorKind::Assert { .. } => {}

src/librustc_mir/transform/check_unsafety.rs

+1
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ impl<'a, 'tcx> Visitor<'tcx> for UnsafetyChecker<'a, 'tcx> {
7373
TerminatorKind::DropAndReplace { .. } |
7474
TerminatorKind::GeneratorDrop |
7575
TerminatorKind::Resume |
76+
TerminatorKind::Abort |
7677
TerminatorKind::Return |
7778
TerminatorKind::Unreachable |
7879
TerminatorKind::FalseEdges { .. } => {

src/librustc_mir/transform/inline.rs

+1
Original file line numberDiff line numberDiff line change
@@ -806,6 +806,7 @@ impl<'a, 'tcx> MutVisitor<'tcx> for Integrator<'a, 'tcx> {
806806
*kind = TerminatorKind::Goto { target: tgt }
807807
}
808808
}
809+
TerminatorKind::Abort => { }
809810
TerminatorKind::Unreachable => { }
810811
TerminatorKind::FalseEdges { ref mut real_target, ref mut imaginary_targets } => {
811812
*real_target = self.update_target(*real_target);

src/librustc_mir/transform/qualify_consts.rs

+1
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,7 @@ impl<'a, 'tcx> Qualifier<'a, 'tcx, 'tcx> {
324324
TerminatorKind::SwitchInt {..} |
325325
TerminatorKind::DropAndReplace { .. } |
326326
TerminatorKind::Resume |
327+
TerminatorKind::Abort |
327328
TerminatorKind::GeneratorDrop |
328329
TerminatorKind::Yield { .. } |
329330
TerminatorKind::Unreachable |

src/librustc_mir/transform/remove_noop_landing_pads.rs

+1
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ impl RemoveNoopLandingPads {
7676
TerminatorKind::GeneratorDrop |
7777
TerminatorKind::Yield { .. } |
7878
TerminatorKind::Return |
79+
TerminatorKind::Abort |
7980
TerminatorKind::Unreachable |
8081
TerminatorKind::Call { .. } |
8182
TerminatorKind::Assert { .. } |

src/librustc_passes/mir_stats.rs

+1
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ impl<'a, 'tcx> mir_visit::Visitor<'tcx> for StatCollector<'a, 'tcx> {
113113
TerminatorKind::Goto { .. } => "TerminatorKind::Goto",
114114
TerminatorKind::SwitchInt { .. } => "TerminatorKind::SwitchInt",
115115
TerminatorKind::Resume => "TerminatorKind::Resume",
116+
TerminatorKind::Abort => "TerminatorKind::Abort",
116117
TerminatorKind::Return => "TerminatorKind::Return",
117118
TerminatorKind::Unreachable => "TerminatorKind::Unreachable",
118119
TerminatorKind::Drop { .. } => "TerminatorKind::Drop",

src/librustc_trans/mir/analyze.rs

+1
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,7 @@ pub fn cleanup_kinds<'a, 'tcx>(mir: &mir::Mir<'tcx>) -> IndexVec<mir::BasicBlock
236236
match data.terminator().kind {
237237
TerminatorKind::Goto { .. } |
238238
TerminatorKind::Resume |
239+
TerminatorKind::Abort |
239240
TerminatorKind::Return |
240241
TerminatorKind::GeneratorDrop |
241242
TerminatorKind::Unreachable |

src/librustc_trans/mir/block.rs

+7
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,13 @@ impl<'a, 'tcx> MirContext<'a, 'tcx> {
180180
}
181181
}
182182

183+
mir::TerminatorKind::Abort => {
184+
// Call core::intrinsics::abort()
185+
let fnname = bcx.ccx.get_intrinsic(&("llvm.trap"));
186+
bcx.call(fnname, &[], None);
187+
bcx.unreachable();
188+
}
189+
183190
mir::TerminatorKind::Goto { target } => {
184191
funclet_br(self, bcx, target);
185192
}

0 commit comments

Comments
 (0)