]> git.lizzy.rs Git - rust.git/commitdiff
Mir: Add Terminatorkind::Abort
authorDavid Henningsson <diwic@ubuntu.com>
Tue, 19 Dec 2017 00:17:16 +0000 (01:17 +0100)
committerDavid Henningsson <diwic@ubuntu.com>
Thu, 21 Dec 2017 03:43:27 +0000 (04:43 +0100)
The Abort Terminatorkind will cause an llvm.trap function call to be
emitted.

Signed-off-by: David Henningsson <diwic@ubuntu.com>
17 files changed:
src/librustc/ich/impls_mir.rs
src/librustc/mir/mod.rs
src/librustc/mir/visit.rs
src/librustc_mir/borrow_check/mod.rs
src/librustc_mir/borrow_check/nll/type_check/mod.rs
src/librustc_mir/dataflow/impls/borrows.rs
src/librustc_mir/dataflow/mod.rs
src/librustc_mir/dataflow/move_paths/builder.rs
src/librustc_mir/interpret/terminator/mod.rs
src/librustc_mir/monomorphize/collector.rs
src/librustc_mir/transform/check_unsafety.rs
src/librustc_mir/transform/inline.rs
src/librustc_mir/transform/qualify_consts.rs
src/librustc_mir/transform/remove_noop_landing_pads.rs
src/librustc_passes/mir_stats.rs
src/librustc_trans/mir/analyze.rs
src/librustc_trans/mir/block.rs

index df67c3abbe86c79fe293f9a425ffb8d706e50951..7517281b0b2d246d440f91f7088f83ab6f7cd822 100644 (file)
@@ -150,6 +150,7 @@ fn hash_stable<W: StableHasherResult>(&self,
                 targets.hash_stable(hcx, hasher);
             }
             mir::TerminatorKind::Resume |
+            mir::TerminatorKind::Abort |
             mir::TerminatorKind::Return |
             mir::TerminatorKind::GeneratorDrop |
             mir::TerminatorKind::Unreachable => {}
index f410865a6cd7f37e1b21ab72db5925a92e8bb9c5..befab6d436bb658082bd14f2d061cd67ed2cc737 100644 (file)
@@ -637,6 +637,10 @@ pub enum TerminatorKind<'tcx> {
     /// continue. Emitted by build::scope::diverge_cleanup.
     Resume,
 
+    /// Indicates that the landing pad is finished and that the process
+    /// should abort. Used to prevent unwinding for foreign items.
+    Abort,
+
     /// Indicates a normal return. The return place should have
     /// been filled in by now. This should occur at most once.
     Return,
@@ -759,7 +763,7 @@ pub fn successors(&self) -> Cow<[BasicBlock]> {
         match *self {
             Goto { target: ref b } => slice::from_ref(b).into_cow(),
             SwitchInt { targets: ref b, .. } => b[..].into_cow(),
-            Resume | GeneratorDrop => (&[]).into_cow(),
+            Resume | Abort | GeneratorDrop => (&[]).into_cow(),
             Return => (&[]).into_cow(),
             Unreachable => (&[]).into_cow(),
             Call { destination: Some((_, t)), cleanup: Some(c), .. } => vec![t, c].into_cow(),
@@ -794,7 +798,7 @@ pub fn successors_mut(&mut self) -> Vec<&mut BasicBlock> {
         match *self {
             Goto { target: ref mut b } => vec![b],
             SwitchInt { targets: ref mut b, .. } => b.iter_mut().collect(),
-            Resume | GeneratorDrop => Vec::new(),
+            Resume | Abort | GeneratorDrop => Vec::new(),
             Return => Vec::new(),
             Unreachable => Vec::new(),
             Call { destination: Some((_, ref mut t)), cleanup: Some(ref mut c), .. } => vec![t, c],
@@ -823,6 +827,7 @@ pub fn unwind_mut(&mut self) -> Option<&mut Option<BasicBlock>> {
         match *self {
             TerminatorKind::Goto { .. } |
             TerminatorKind::Resume |
+            TerminatorKind::Abort |
             TerminatorKind::Return |
             TerminatorKind::Unreachable |
             TerminatorKind::GeneratorDrop |
@@ -918,6 +923,7 @@ pub fn fmt_head<W: Write>(&self, fmt: &mut W) -> fmt::Result {
             Return => write!(fmt, "return"),
             GeneratorDrop => write!(fmt, "generator_drop"),
             Resume => write!(fmt, "resume"),
+            Abort => write!(fmt, "abort"),
             Yield { ref value, .. } => write!(fmt, "_1 = suspend({:?})", value),
             Unreachable => write!(fmt, "unreachable"),
             Drop { ref location, .. } => write!(fmt, "drop({:?})", location),
@@ -970,7 +976,7 @@ pub fn fmt_head<W: Write>(&self, fmt: &mut W) -> fmt::Result {
     pub fn fmt_successor_labels(&self) -> Vec<Cow<'static, str>> {
         use self::TerminatorKind::*;
         match *self {
-            Return | Resume | Unreachable | GeneratorDrop => vec![],
+            Return | Resume | Abort | Unreachable | GeneratorDrop => vec![],
             Goto { .. } => vec!["".into()],
             SwitchInt { ref values, .. } => {
                 values.iter()
@@ -2102,6 +2108,7 @@ fn super_fold_with<'gcx: 'tcx, F: TypeFolder<'gcx, 'tcx>>(&self, folder: &mut F)
             },
             GeneratorDrop => GeneratorDrop,
             Resume => Resume,
+            Abort => Abort,
             Return => Return,
             Unreachable => Unreachable,
             FalseEdges { real_target, ref imaginary_targets } =>
@@ -2143,6 +2150,7 @@ fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> bool {
             },
             Goto { .. } |
             Resume |
+            Abort |
             Return |
             GeneratorDrop |
             Unreachable |
index 0e6c14af1ecfabfaf13eb7e0969214a2a642fbe5..2a3f7384de2f2399eda593035652d2f62f62686c 100644 (file)
@@ -432,6 +432,7 @@ fn super_terminator_kind(&mut self,
                     }
 
                     TerminatorKind::Resume |
+                    TerminatorKind::Abort |
                     TerminatorKind::Return |
                     TerminatorKind::GeneratorDrop |
                     TerminatorKind::Unreachable => {
index c907c97d6d3ed58b7942b3c4bdf7acf39321cd2d..672ab8257ba28835b925d0565d125ccab8788e8e 100644 (file)
@@ -557,6 +557,7 @@ fn visit_terminator_entry(
                 });
             }
             TerminatorKind::Goto { target: _ }
+            | TerminatorKind::Abort
             | TerminatorKind::Unreachable
             | TerminatorKind::FalseEdges { .. } => {
                 // no data used, thus irrelevant to borrowck
index 4c8a171299f2c84c7845436c77d661616e157a8c..901b73c610e3b0f6fe82d1fd7c71d7f15990379e 100644 (file)
@@ -780,6 +780,7 @@ fn check_terminator(
         match term.kind {
             TerminatorKind::Goto { .. }
             | TerminatorKind::Resume
+            | TerminatorKind::Abort
             | TerminatorKind::Return
             | TerminatorKind::GeneratorDrop
             | TerminatorKind::Unreachable
@@ -1082,6 +1083,9 @@ fn check_iscleanup(&mut self, mir: &Mir<'tcx>, block_data: &BasicBlockData<'tcx>
             TerminatorKind::Resume => if !is_cleanup {
                 span_mirbug!(self, block_data, "resume on non-cleanup block!")
             },
+            TerminatorKind::Abort => if !is_cleanup {
+                span_mirbug!(self, block_data, "abort on non-cleanup block!")
+            },
             TerminatorKind::Return => if is_cleanup {
                 span_mirbug!(self, block_data, "return on cleanup block")
             },
index 25e4b30da80958f48cc5931bc558afdcfef1eaf9..cf121643a7e07ba4d38fd4e3e6e8b0821ad8831c 100644 (file)
@@ -465,6 +465,7 @@ fn terminator_effect_on_borrows(&self,
                     }
                 }
             }
+            mir::TerminatorKind::Abort |
             mir::TerminatorKind::SwitchInt {..} |
             mir::TerminatorKind::Drop {..} |
             mir::TerminatorKind::DropAndReplace {..} |
index 83c46e0199eebd290a121b672ca75cd6cb693862..1597ba8aaa0030ae967479cd20fcbcce811abed2 100644 (file)
@@ -771,6 +771,7 @@ fn propagate_bits_into_graph_successors_of(
         match bb_data.terminator().kind {
             mir::TerminatorKind::Return |
             mir::TerminatorKind::Resume |
+            mir::TerminatorKind::Abort |
             mir::TerminatorKind::GeneratorDrop |
             mir::TerminatorKind::Unreachable => {}
             mir::TerminatorKind::Goto { ref target } |
index c20beb7d8c2a72a4c1edce1b816a152ff46861cc..f35e52497ce4af13c74f7327b0abcdd016718830 100644 (file)
@@ -334,6 +334,7 @@ fn gather_terminator(&mut self, term: &Terminator<'tcx>) {
         match term.kind {
             TerminatorKind::Goto { target: _ } |
             TerminatorKind::Resume |
+            TerminatorKind::Abort |
             TerminatorKind::GeneratorDrop |
             TerminatorKind::FalseEdges { .. } |
             TerminatorKind::Unreachable => { }
index 3eef0578360ce54f656f131340d5d1a4766a9603..c8a0dbdd9030896549427ef41f9c392cfe318701 100644 (file)
@@ -163,6 +163,7 @@ pub(super) fn eval_terminator(
             GeneratorDrop => unimplemented!(),
             DropAndReplace { .. } => unimplemented!(),
             Resume => unimplemented!(),
+            Abort => unimplemented!(),
             FalseEdges { .. } => bug!("should have been eliminated by `simplify_branches` mir pass"),
             Unreachable => return err!(Unreachable),
         }
index 44dedde52294168eb7af06a9a290c80381ab9288..62740a55dd6e2fcb5f12abe183b7e19ab518f0ec 100644 (file)
@@ -625,6 +625,7 @@ fn visit_terminator_kind(&mut self,
             mir::TerminatorKind::Goto { .. } |
             mir::TerminatorKind::SwitchInt { .. } |
             mir::TerminatorKind::Resume |
+            mir::TerminatorKind::Abort |
             mir::TerminatorKind::Return |
             mir::TerminatorKind::Unreachable |
             mir::TerminatorKind::Assert { .. } => {}
index e7ce5285071807741cecd0d9f10e33a1a2e9dce2..e9ba5de3cc6941265982e30811eaf52813ae444f 100644 (file)
@@ -73,6 +73,7 @@ fn visit_terminator(&mut self,
             TerminatorKind::DropAndReplace { .. } |
             TerminatorKind::GeneratorDrop |
             TerminatorKind::Resume |
+            TerminatorKind::Abort |
             TerminatorKind::Return |
             TerminatorKind::Unreachable |
             TerminatorKind::FalseEdges { .. } => {
index 7216384795278915cf5d256500729916824c074a..43ee75d1e2ba255b7515530b2cda076464262fdc 100644 (file)
@@ -806,6 +806,7 @@ fn visit_terminator_kind(&mut self, block: BasicBlock,
                     *kind = TerminatorKind::Goto { target: tgt }
                 }
             }
+            TerminatorKind::Abort => { }
             TerminatorKind::Unreachable => { }
             TerminatorKind::FalseEdges { ref mut real_target, ref mut imaginary_targets } => {
                 *real_target = self.update_target(*real_target);
index 2b2323928efba23aeac1b5a8dfcfd53eb2f859da..f0871bb188d494582c63225592bf173f031f6a40 100644 (file)
@@ -324,6 +324,7 @@ fn qualify_const(&mut self) -> (Qualif, Rc<IdxSetBuf<Local>>) {
                 TerminatorKind::SwitchInt {..} |
                 TerminatorKind::DropAndReplace { .. } |
                 TerminatorKind::Resume |
+                TerminatorKind::Abort |
                 TerminatorKind::GeneratorDrop |
                 TerminatorKind::Yield { .. } |
                 TerminatorKind::Unreachable |
index d29174d57192bf1f50df372e3d7fe70f0eb4ddf7..23274cdedf2c743a070eeb7f8d2448c1304074dd 100644 (file)
@@ -76,6 +76,7 @@ fn is_nop_landing_pad(&self, bb: BasicBlock, mir: &Mir, nop_landing_pads: &BitVe
             TerminatorKind::GeneratorDrop |
             TerminatorKind::Yield { .. } |
             TerminatorKind::Return |
+            TerminatorKind::Abort |
             TerminatorKind::Unreachable |
             TerminatorKind::Call { .. } |
             TerminatorKind::Assert { .. } |
index 8a9936ecb8bb4fe9a483531bbb07c701cab9df22..b379a174b23f61aba881f09c1861a369441bd5cb 100644 (file)
@@ -113,6 +113,7 @@ fn visit_terminator_kind(&mut self,
             TerminatorKind::Goto { .. } => "TerminatorKind::Goto",
             TerminatorKind::SwitchInt { .. } => "TerminatorKind::SwitchInt",
             TerminatorKind::Resume => "TerminatorKind::Resume",
+            TerminatorKind::Abort => "TerminatorKind::Abort",
             TerminatorKind::Return => "TerminatorKind::Return",
             TerminatorKind::Unreachable => "TerminatorKind::Unreachable",
             TerminatorKind::Drop { .. } => "TerminatorKind::Drop",
index cfe55aba0d3c5e0019520887b16bdd88bbebc4ec..31cbb07dbe64cee39128602dba067d638ac84441 100644 (file)
@@ -236,6 +236,7 @@ fn discover_masters<'tcx>(result: &mut IndexVec<mir::BasicBlock, CleanupKind>,
             match data.terminator().kind {
                 TerminatorKind::Goto { .. } |
                 TerminatorKind::Resume |
+                TerminatorKind::Abort |
                 TerminatorKind::Return |
                 TerminatorKind::GeneratorDrop |
                 TerminatorKind::Unreachable |
index 1cb3a66e4d8cf84860826f91bdcbd8f46adb893b..422b8210b3544f6cb7b3356593d233300ab76008 100644 (file)
@@ -180,6 +180,13 @@ fn trans_terminator(&mut self,
                 }
             }
 
+            mir::TerminatorKind::Abort => {
+                // Call core::intrinsics::abort()
+                let fnname = bcx.ccx.get_intrinsic(&("llvm.trap"));
+                bcx.call(fnname, &[], None);
+                bcx.unreachable();
+            }
+
             mir::TerminatorKind::Goto { target } => {
                 funclet_br(self, bcx, target);
             }