Auto merge of #97103 - luqmana:asm-unwind-cleanup, r=Amanieu,tmiasko
Update MIR passes to handle unwinding Inline Asm Some more follow up fixes from https://github.com/rust-lang/rust/pull/95864#issuecomment-1094165398 r? `@Amanieu`
This commit is contained in:
commit
67a9bcb31b
4 changed files with 49 additions and 2 deletions
|
@ -1,4 +1,5 @@
|
||||||
use crate::MirPass;
|
use crate::MirPass;
|
||||||
|
use rustc_ast::InlineAsmOptions;
|
||||||
use rustc_hir::def::DefKind;
|
use rustc_hir::def::DefKind;
|
||||||
use rustc_middle::mir::*;
|
use rustc_middle::mir::*;
|
||||||
use rustc_middle::ty::layout;
|
use rustc_middle::ty::layout;
|
||||||
|
@ -85,6 +86,12 @@ impl<'tcx> MirPass<'tcx> for AbortUnwindingCalls {
|
||||||
TerminatorKind::Assert { .. } | TerminatorKind::FalseUnwind { .. } => {
|
TerminatorKind::Assert { .. } | TerminatorKind::FalseUnwind { .. } => {
|
||||||
layout::fn_can_unwind(tcx, None, Abi::Rust)
|
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,
|
_ => continue,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1042,8 +1042,7 @@ fn can_unwind<'tcx>(tcx: TyCtxt<'tcx>, body: &Body<'tcx>) -> bool {
|
||||||
| TerminatorKind::Unreachable
|
| TerminatorKind::Unreachable
|
||||||
| TerminatorKind::GeneratorDrop
|
| TerminatorKind::GeneratorDrop
|
||||||
| TerminatorKind::FalseEdge { .. }
|
| TerminatorKind::FalseEdge { .. }
|
||||||
| TerminatorKind::FalseUnwind { .. }
|
| TerminatorKind::FalseUnwind { .. } => {}
|
||||||
| TerminatorKind::InlineAsm { .. } => {}
|
|
||||||
|
|
||||||
// Resume will *continue* unwinding, but if there's no other unwinding terminator it
|
// Resume will *continue* unwinding, but if there's no other unwinding terminator it
|
||||||
// will never be reached.
|
// will never be reached.
|
||||||
|
@ -1057,6 +1056,7 @@ fn can_unwind<'tcx>(tcx: TyCtxt<'tcx>, body: &Body<'tcx>) -> bool {
|
||||||
TerminatorKind::Drop { .. }
|
TerminatorKind::Drop { .. }
|
||||||
| TerminatorKind::DropAndReplace { .. }
|
| TerminatorKind::DropAndReplace { .. }
|
||||||
| TerminatorKind::Call { .. }
|
| TerminatorKind::Call { .. }
|
||||||
|
| TerminatorKind::InlineAsm { .. }
|
||||||
| TerminatorKind::Assert { .. } => return true,
|
| TerminatorKind::Assert { .. } => return true,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
src/test/mir-opt/asm_unwind_panic_abort.rs
Normal file
16
src/test/mir-opt/asm_unwind_panic_abort.rs
Normal file
|
@ -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));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue