Skip to content

Commit

Permalink
Auto merge of #97103 - luqmana:asm-unwind-cleanup, r=Amanieu,tmiasko
Browse files Browse the repository at this point in the history
Update MIR passes to handle unwinding Inline Asm

Some more follow up fixes from #95864 (comment)

r? `@Amanieu`
  • Loading branch information
bors committed May 19, 2022
2 parents 50872bd + af7f53d commit 67a9bcb
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 2 deletions.
7 changes: 7 additions & 0 deletions compiler/rustc_mir_transform/src/abort_unwinding_calls.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use crate::MirPass;
use rustc_ast::InlineAsmOptions;
use rustc_hir::def::DefKind;
use rustc_middle::mir::*;
use rustc_middle::ty::layout;
Expand Down Expand Up @@ -85,6 +86,12 @@ impl<'tcx> MirPass<'tcx> for AbortUnwindingCalls {
TerminatorKind::Assert { .. } | TerminatorKind::FalseUnwind { .. } => {
layout::fn_can_unwind(tcx, None, Abi::Rust)
}
TerminatorKind::InlineAsm { options, .. } => {
options.contains(InlineAsmOptions::MAY_UNWIND)
}
_ if terminator.unwind().is_some() => {
span_bug!(span, "unexpected terminator that may unwind {:?}", terminator)
}
_ => continue,
};

Expand Down
4 changes: 2 additions & 2 deletions compiler/rustc_mir_transform/src/generator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1042,8 +1042,7 @@ fn can_unwind<'tcx>(tcx: TyCtxt<'tcx>, body: &Body<'tcx>) -> bool {
| TerminatorKind::Unreachable
| TerminatorKind::GeneratorDrop
| TerminatorKind::FalseEdge { .. }
| TerminatorKind::FalseUnwind { .. }
| TerminatorKind::InlineAsm { .. } => {}
| TerminatorKind::FalseUnwind { .. } => {}

// Resume will *continue* unwinding, but if there's no other unwinding terminator it
// will never be reached.
Expand All @@ -1057,6 +1056,7 @@ fn can_unwind<'tcx>(tcx: TyCtxt<'tcx>, body: &Body<'tcx>) -> bool {
TerminatorKind::Drop { .. }
| TerminatorKind::DropAndReplace { .. }
| TerminatorKind::Call { .. }
| TerminatorKind::InlineAsm { .. }
| TerminatorKind::Assert { .. } => return true,
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
// MIR for `main` after AbortUnwindingCalls

fn main() -> () {
let mut _0: (); // return place in scope 0 at $DIR/asm_unwind_panic_abort.rs:12:11: 12:11
let _1: (); // in scope 0 at $DIR/asm_unwind_panic_abort.rs:14:9: 14:49
scope 1 {
}

bb0: {
StorageLive(_1); // scope 1 at $DIR/asm_unwind_panic_abort.rs:14:9: 14:49
_1 = const (); // scope 1 at $DIR/asm_unwind_panic_abort.rs:14:9: 14:49
asm!("", options(MAY_UNWIND)) -> [return: bb1, unwind: bb2]; // scope 1 at $DIR/asm_unwind_panic_abort.rs:14:9: 14:49
}

bb1: {
StorageDead(_1); // scope 1 at $DIR/asm_unwind_panic_abort.rs:14:48: 14:49
_0 = const (); // scope 1 at $DIR/asm_unwind_panic_abort.rs:13:5: 15:6
return; // scope 0 at $DIR/asm_unwind_panic_abort.rs:16:2: 16:2
}

bb2 (cleanup): {
abort; // scope 0 at $DIR/asm_unwind_panic_abort.rs:12:1: 16:2
}
}
16 changes: 16 additions & 0 deletions src/test/mir-opt/asm_unwind_panic_abort.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
//! Tests that unwinding from an asm block is caught and forced to abort
//! when `-C panic=abort`.

// min-llvm-version: 13.0.0
// only-x86_64
// compile-flags: -C panic=abort
// no-prefer-dynamic

#![feature(asm_unwind)]

// EMIT_MIR asm_unwind_panic_abort.main.AbortUnwindingCalls.after.mir
fn main() {
unsafe {
std::arch::asm!("", options(may_unwind));
}
}

0 comments on commit 67a9bcb

Please sign in to comment.