miri: rename miri_start_panic → miri_start_unwind
This commit is contained in:
parent
b4ca582b89
commit
a3c0f3af9c
@ -8,14 +8,14 @@
|
||||
|
||||
extern "Rust" {
|
||||
/// Miri-provided extern function to begin unwinding.
|
||||
fn miri_start_panic(payload: *mut u8) -> !;
|
||||
fn miri_start_unwind(payload: *mut u8) -> !;
|
||||
}
|
||||
|
||||
pub unsafe fn panic(payload: Box<dyn Any + Send>) -> u32 {
|
||||
// The payload we pass to `miri_start_panic` will be exactly the argument we get
|
||||
// The payload we pass to `miri_start_unwind` will be exactly the argument we get
|
||||
// in `cleanup` below. So we just box it up once, to get something pointer-sized.
|
||||
let payload_box: Payload = Box::new(payload);
|
||||
miri_start_panic(Box::into_raw(payload_box) as *mut u8)
|
||||
miri_start_unwind(Box::into_raw(payload_box) as *mut u8)
|
||||
}
|
||||
|
||||
pub unsafe fn cleanup(payload_box: *mut u8) -> Box<dyn Any + Send> {
|
||||
|
@ -143,7 +143,7 @@ pub struct Thread<'mir, 'tcx> {
|
||||
join_status: ThreadJoinStatus,
|
||||
|
||||
/// Stack of active panic payloads for the current thread. Used for storing
|
||||
/// the argument of the call to `miri_start_panic` (the panic payload) when unwinding.
|
||||
/// the argument of the call to `miri_start_unwind` (the panic payload) when unwinding.
|
||||
/// This is pointer-sized, and matches the `Payload` type in `src/libpanic_unwind/miri.rs`.
|
||||
///
|
||||
/// In real unwinding, the payload gets passed as an argument to the landing pad,
|
||||
|
@ -68,9 +68,9 @@ fn emulate_foreign_item(
|
||||
let ret = match ret {
|
||||
None =>
|
||||
match link_name.as_str() {
|
||||
"miri_start_panic" => {
|
||||
// `check_shim` happens inside `handle_miri_start_panic`.
|
||||
this.handle_miri_start_panic(abi, link_name, args, unwind)?;
|
||||
"miri_start_unwind" => {
|
||||
// `check_shim` happens inside `handle_miri_start_unwind`.
|
||||
this.handle_miri_start_unwind(abi, link_name, args, unwind)?;
|
||||
return Ok(None);
|
||||
}
|
||||
// This matches calls to the foreign item `panic_impl`.
|
||||
|
@ -3,9 +3,9 @@
|
||||
//! The core pieces of the runtime are:
|
||||
//! - An implementation of `__rust_maybe_catch_panic` that pushes the invoked stack frame with
|
||||
//! some extra metadata derived from the panic-catching arguments of `__rust_maybe_catch_panic`.
|
||||
//! - A hack in `libpanic_unwind` that calls the `miri_start_panic` intrinsic instead of the
|
||||
//! - A hack in `libpanic_unwind` that calls the `miri_start_unwind` intrinsic instead of the
|
||||
//! target-native panic runtime. (This lives in the rustc repo.)
|
||||
//! - An implementation of `miri_start_panic` that stores its argument (the panic payload), and then
|
||||
//! - An implementation of `miri_start_unwind` that stores its argument (the panic payload), and then
|
||||
//! immediately returns, but on the *unwind* edge (not the normal return edge), thus initiating unwinding.
|
||||
//! - A hook executed each time a frame is popped, such that if the frame pushed by `__rust_maybe_catch_panic`
|
||||
//! gets popped *during unwinding*, we take the panic payload and store it according to the extra
|
||||
@ -44,9 +44,9 @@ fn visit_provenance(&self, visit: &mut VisitWith<'_>) {
|
||||
|
||||
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for crate::MiriInterpCx<'mir, 'tcx> {}
|
||||
pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
||||
/// Handles the special `miri_start_panic` intrinsic, which is called
|
||||
/// Handles the special `miri_start_unwind` intrinsic, which is called
|
||||
/// by libpanic_unwind to delegate the actual unwinding process to Miri.
|
||||
fn handle_miri_start_panic(
|
||||
fn handle_miri_start_unwind(
|
||||
&mut self,
|
||||
abi: Abi,
|
||||
link_name: Symbol,
|
||||
@ -55,7 +55,7 @@ fn handle_miri_start_panic(
|
||||
) -> InterpResult<'tcx> {
|
||||
let this = self.eval_context_mut();
|
||||
|
||||
trace!("miri_start_panic: {:?}", this.frame().instance);
|
||||
trace!("miri_start_unwind: {:?}", this.frame().instance);
|
||||
|
||||
// Get the raw pointer stored in arg[0] (the panic payload).
|
||||
let [payload] = this.check_shim(abi, Abi::Rust, link_name, args)?;
|
||||
@ -85,7 +85,7 @@ fn handle_catch_unwind(
|
||||
// what that is), and returns 1.
|
||||
// The `payload` is passed (by libstd) to `__rust_panic_cleanup`, which is then expected to
|
||||
// return a `Box<dyn Any + Send + 'static>`.
|
||||
// In Miri, `miri_start_panic` is passed exactly that type, so we make the `payload` simply
|
||||
// In Miri, `miri_start_unwind` is passed exactly that type, so we make the `payload` simply
|
||||
// a pointer to `Box<dyn Any + Send + 'static>`.
|
||||
|
||||
// Get all the arguments.
|
||||
@ -141,7 +141,7 @@ fn handle_stack_pop_unwind(
|
||||
// We set the return value of `try` to 1, since there was a panic.
|
||||
this.write_scalar(Scalar::from_i32(1), &catch_unwind.dest)?;
|
||||
|
||||
// The Thread's `panic_payload` holds what was passed to `miri_start_panic`.
|
||||
// The Thread's `panic_payload` holds what was passed to `miri_start_unwind`.
|
||||
// This is exactly the second argument we need to pass to `catch_fn`.
|
||||
let payload = this.active_thread_mut().panic_payloads.pop().unwrap();
|
||||
|
||||
|
@ -3,10 +3,10 @@
|
||||
#![feature(c_unwind)]
|
||||
|
||||
extern "C" {
|
||||
fn miri_start_panic(payload: *mut u8) -> !;
|
||||
fn miri_start_unwind(payload: *mut u8) -> !;
|
||||
}
|
||||
|
||||
fn main() {
|
||||
unsafe { miri_start_panic(&mut 0) }
|
||||
unsafe { miri_start_unwind(&mut 0) }
|
||||
//~^ ERROR: unwinding past a stack frame that does not allow unwinding
|
||||
}
|
@ -1,15 +1,15 @@
|
||||
WARNING: the flag `-Zmiri-disable-abi-check` is deprecated and planned to be removed.
|
||||
If you have a use-case for it, please file an issue.
|
||||
error: Undefined Behavior: unwinding past a stack frame that does not allow unwinding
|
||||
--> $DIR/bad_miri_start_panic.rs:LL:CC
|
||||
--> $DIR/bad_miri_start_unwind.rs:LL:CC
|
||||
|
|
||||
LL | unsafe { miri_start_panic(&mut 0) }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ unwinding past a stack frame that does not allow unwinding
|
||||
LL | unsafe { miri_start_unwind(&mut 0) }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ unwinding past a stack frame that does not allow unwinding
|
||||
|
|
||||
= help: this indicates a bug in the program: it performed an invalid operation, and caused Undefined Behavior
|
||||
= help: see https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html for further information
|
||||
= note: BACKTRACE:
|
||||
= note: inside `main` at $DIR/bad_miri_start_panic.rs:LL:CC
|
||||
= note: inside `main` at $DIR/bad_miri_start_unwind.rs:LL:CC
|
||||
|
||||
note: some details are omitted, run with `MIRIFLAGS=-Zmiri-backtrace=full` for a verbose backtrace
|
||||
|
@ -3,11 +3,11 @@
|
||||
//! Unwinding despite `-C panic=abort` is an error.
|
||||
|
||||
extern "Rust" {
|
||||
fn miri_start_panic(payload: *mut u8) -> !;
|
||||
fn miri_start_unwind(payload: *mut u8) -> !;
|
||||
}
|
||||
|
||||
fn main() {
|
||||
unsafe {
|
||||
miri_start_panic(&mut 0); //~ ERROR: unwinding past a stack frame that does not allow unwinding
|
||||
miri_start_unwind(&mut 0); //~ ERROR: unwinding past a stack frame that does not allow unwinding
|
||||
}
|
||||
}
|
||||
|
@ -1,8 +1,8 @@
|
||||
error: Undefined Behavior: unwinding past a stack frame that does not allow unwinding
|
||||
--> $DIR/unwind_panic_abort.rs:LL:CC
|
||||
|
|
||||
LL | miri_start_panic(&mut 0);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ unwinding past a stack frame that does not allow unwinding
|
||||
LL | miri_start_unwind(&mut 0);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ unwinding past a stack frame that does not allow unwinding
|
||||
|
|
||||
= help: this indicates a bug in the program: it performed an invalid operation, and caused Undefined Behavior
|
||||
= help: see https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html for further information
|
||||
|
@ -56,7 +56,7 @@ pub fn miri_resolve_frame_names(
|
||||
///
|
||||
/// This is internal and unstable and should not be used; we give it here
|
||||
/// just to be complete.
|
||||
pub fn miri_start_panic(payload: *mut u8) -> !;
|
||||
pub fn miri_start_unwind(payload: *mut u8) -> !;
|
||||
|
||||
/// Miri-provided extern function to get the internal unique identifier for the allocation that a pointer
|
||||
/// points to. If this pointer is invalid (not pointing to an allocation), interpretation will abort.
|
||||
|
Loading…
Reference in New Issue
Block a user