Skip to content

Commit 4b64211

Browse files
committed
Add an Abort terminator to MIR and lower all abort intrinsic calls to it
1 parent 9f08a68 commit 4b64211

File tree

44 files changed

+94
-35
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+94
-35
lines changed

compiler/rustc_borrowck/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -755,6 +755,7 @@ impl<'cx, 'tcx, R> rustc_mir_dataflow::ResultsVisitor<'cx, 'tcx, R> for MirBorro
755755

756756
TerminatorKind::Goto { target: _ }
757757
| TerminatorKind::UnwindTerminate(_)
758+
| TerminatorKind::Abort
758759
| TerminatorKind::Unreachable
759760
| TerminatorKind::UnwindResume
760761
| TerminatorKind::Return
@@ -810,6 +811,7 @@ impl<'cx, 'tcx, R> rustc_mir_dataflow::ResultsVisitor<'cx, 'tcx, R> for MirBorro
810811
| TerminatorKind::Goto { .. }
811812
| TerminatorKind::SwitchInt { .. }
812813
| TerminatorKind::Unreachable
814+
| TerminatorKind::Abort
813815
| TerminatorKind::InlineAsm { .. } => {}
814816
}
815817
}

compiler/rustc_borrowck/src/polonius/loan_invalidations.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ impl<'cx, 'tcx> Visitor<'tcx> for LoanInvalidationsGenerator<'cx, 'tcx> {
190190
TerminatorKind::Goto { target: _ }
191191
| TerminatorKind::UnwindTerminate(_)
192192
| TerminatorKind::Unreachable
193+
| TerminatorKind::Abort
193194
| TerminatorKind::FalseEdge { real_target: _, imaginary_target: _ }
194195
| TerminatorKind::FalseUnwind { real_target: _, unwind: _ } => {
195196
// no data used, thus irrelevant to borrowck

compiler/rustc_borrowck/src/type_check/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1396,6 +1396,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
13961396
| TerminatorKind::UnwindTerminate(_)
13971397
| TerminatorKind::Return
13981398
| TerminatorKind::CoroutineDrop
1399+
| TerminatorKind::Abort
13991400
| TerminatorKind::Unreachable
14001401
| TerminatorKind::Drop { .. }
14011402
| TerminatorKind::FalseEdge { .. }
@@ -1750,7 +1751,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
17501751
self.assert_iscleanup(body, block_data, drop, is_cleanup);
17511752
}
17521753
}
1753-
TerminatorKind::Unreachable => {}
1754+
TerminatorKind::Abort | TerminatorKind::Unreachable => {}
17541755
TerminatorKind::Drop { target, unwind, .. }
17551756
| TerminatorKind::Assert { target, unwind, .. } => {
17561757
self.assert_iscleanup(body, block_data, target, is_cleanup);

compiler/rustc_codegen_cranelift/src/base.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -487,6 +487,9 @@ fn codegen_fn_body(fx: &mut FunctionCx<'_, '_, '_>, start_block: Block) {
487487
TerminatorKind::Unreachable => {
488488
fx.bcx.ins().trap(TrapCode::UnreachableCodeReached);
489489
}
490+
TerminatorKind::Abort => {
491+
fx.bcx.ins().trap(TrapCode::User(0));
492+
}
490493
TerminatorKind::Yield { .. }
491494
| TerminatorKind::FalseEdge { .. }
492495
| TerminatorKind::FalseUnwind { .. }

compiler/rustc_codegen_cranelift/src/constant.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -532,6 +532,7 @@ pub(crate) fn mir_operand_get_const_val<'tcx>(
532532
| TerminatorKind::UnwindResume
533533
| TerminatorKind::UnwindTerminate(_)
534534
| TerminatorKind::Return
535+
| TerminatorKind::Abort
535536
| TerminatorKind::Unreachable
536537
| TerminatorKind::Drop { .. }
537538
| TerminatorKind::Assert { .. } => {}

compiler/rustc_codegen_cranelift/src/intrinsics/mod.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -439,10 +439,6 @@ fn codegen_regular_intrinsic_call<'tcx>(
439439
let usize_layout = fx.layout_of(fx.tcx.types.usize);
440440

441441
match intrinsic {
442-
sym::abort => {
443-
fx.bcx.ins().trap(TrapCode::User(0));
444-
return Ok(());
445-
}
446442
sym::likely | sym::unlikely => {
447443
intrinsic_args!(fx, args => (a); intrinsic);
448444

compiler/rustc_codegen_gcc/src/intrinsic/mod.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,6 @@ fn get_simple_intrinsic<'gcc, 'tcx>(
8888
sym::roundf64 => "round",
8989
sym::roundevenf32 => "roundevenf",
9090
sym::roundevenf64 => "roundeven",
91-
sym::abort => "abort",
9291
_ => return None,
9392
};
9493
Some(cx.context.get_builtin_function(&gcc_name))

compiler/rustc_codegen_ssa/src/mir/analyze.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,7 @@ pub fn cleanup_kinds(mir: &mir::Body<'_>) -> IndexVec<mir::BasicBlock, CleanupKi
280280
| TerminatorKind::UnwindTerminate(_)
281281
| TerminatorKind::Return
282282
| TerminatorKind::CoroutineDrop
283+
| TerminatorKind::Abort
283284
| TerminatorKind::Unreachable
284285
| TerminatorKind::SwitchInt { .. }
285286
| TerminatorKind::Yield { .. }

compiler/rustc_codegen_ssa/src/mir/block.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1295,6 +1295,14 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
12951295
MergingSucc::False
12961296
}
12971297

1298+
mir::TerminatorKind::Abort => {
1299+
bx.abort();
1300+
// `abort` does not terminate the block, so we still need to generate
1301+
// an `unreachable` terminator after it.
1302+
bx.unreachable();
1303+
MergingSucc::False
1304+
}
1305+
12981306
mir::TerminatorKind::Drop { place, target, unwind, replace: _ } => {
12991307
self.codegen_drop_terminator(helper, bx, place, target, unwind, mergeable_succ())
13001308
}

compiler/rustc_codegen_ssa/src/mir/intrinsic.rs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,6 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
7979
let result = PlaceRef::new_sized(llresult, fn_abi.ret.layout);
8080

8181
let llval = match name {
82-
sym::abort => {
83-
bx.abort();
84-
return Ok(());
85-
}
86-
8782
sym::va_start => bx.va_start(args[0].immediate()),
8883
sym::va_end => bx.va_end(args[0].immediate()),
8984
sym::size_of_val => {

0 commit comments

Comments
 (0)