Auto merge of #1812 - hyd-dev:85546, r=RalfJung
Fix toolstate for rust-lang/rust#85546 cc rust-lang/rust#85780
This commit is contained in:
commit
4fa9363ebb
7 changed files with 28 additions and 20 deletions
|
|
@ -1 +1 @@
|
|||
0f8cd43ee8c3614e04b5c624dd8a45758d7023da
|
||||
ce0d64e03ef9875e0935bb60e989542b7ec29579
|
||||
|
|
|
|||
|
|
@ -356,7 +356,7 @@ impl<'mir, 'tcx> Machine<'mir, 'tcx> for Evaluator<'mir, 'tcx> {
|
|||
abi: Abi,
|
||||
args: &[OpTy<'tcx, Tag>],
|
||||
ret: Option<(&PlaceTy<'tcx, Tag>, mir::BasicBlock)>,
|
||||
unwind: Option<mir::BasicBlock>,
|
||||
unwind: StackPopUnwind,
|
||||
) -> InterpResult<'tcx, Option<&'mir mir::Body<'tcx>>> {
|
||||
ecx.find_mir_or_eval_fn(instance, abi, args, ret, unwind)
|
||||
}
|
||||
|
|
@ -368,7 +368,7 @@ impl<'mir, 'tcx> Machine<'mir, 'tcx> for Evaluator<'mir, 'tcx> {
|
|||
abi: Abi,
|
||||
args: &[OpTy<'tcx, Tag>],
|
||||
ret: Option<(&PlaceTy<'tcx, Tag>, mir::BasicBlock)>,
|
||||
_unwind: Option<mir::BasicBlock>,
|
||||
_unwind: StackPopUnwind,
|
||||
) -> InterpResult<'tcx> {
|
||||
ecx.call_dlsym(fn_val, abi, args, ret)
|
||||
}
|
||||
|
|
@ -379,7 +379,7 @@ impl<'mir, 'tcx> Machine<'mir, 'tcx> for Evaluator<'mir, 'tcx> {
|
|||
instance: ty::Instance<'tcx>,
|
||||
args: &[OpTy<'tcx, Tag>],
|
||||
ret: Option<(&PlaceTy<'tcx, Tag>, mir::BasicBlock)>,
|
||||
unwind: Option<mir::BasicBlock>,
|
||||
unwind: StackPopUnwind,
|
||||
) -> InterpResult<'tcx> {
|
||||
ecx.call_intrinsic(instance, args, ret, unwind)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -120,7 +120,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
|
|||
abi: Abi,
|
||||
args: &[OpTy<'tcx, Tag>],
|
||||
ret: Option<(&PlaceTy<'tcx, Tag>, mir::BasicBlock)>,
|
||||
unwind: Option<mir::BasicBlock>,
|
||||
unwind: StackPopUnwind,
|
||||
) -> InterpResult<'tcx, Option<&'mir mir::Body<'tcx>>> {
|
||||
let this = self.eval_context_mut();
|
||||
let attrs = this.tcx.get_attrs(def_id);
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
|
|||
instance: ty::Instance<'tcx>,
|
||||
args: &[OpTy<'tcx, Tag>],
|
||||
ret: Option<(&PlaceTy<'tcx, Tag>, mir::BasicBlock)>,
|
||||
_unwind: Option<mir::BasicBlock>,
|
||||
_unwind: StackPopUnwind,
|
||||
) -> InterpResult<'tcx> {
|
||||
let this = self.eval_context_mut();
|
||||
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
|
|||
abi: Abi,
|
||||
args: &[OpTy<'tcx, Tag>],
|
||||
ret: Option<(&PlaceTy<'tcx, Tag>, mir::BasicBlock)>,
|
||||
unwind: Option<mir::BasicBlock>,
|
||||
unwind: StackPopUnwind,
|
||||
) -> InterpResult<'tcx, Option<&'mir mir::Body<'tcx>>> {
|
||||
let this = self.eval_context_mut();
|
||||
trace!("eval_fn_call: {:#?}, {:?}", instance, ret.map(|p| p.0));
|
||||
|
|
@ -64,7 +64,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
|
|||
ptr_op: &OpTy<'tcx, Tag>,
|
||||
align_op: &OpTy<'tcx, Tag>,
|
||||
ret: Option<(&PlaceTy<'tcx, Tag>, mir::BasicBlock)>,
|
||||
unwind: Option<mir::BasicBlock>,
|
||||
unwind: StackPopUnwind,
|
||||
) -> InterpResult<'tcx, bool> {
|
||||
let this = self.eval_context_mut();
|
||||
let (dest, ret) = ret.unwrap();
|
||||
|
|
|
|||
|
|
@ -41,15 +41,11 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
|
|||
fn handle_miri_start_panic(
|
||||
&mut self,
|
||||
args: &[OpTy<'tcx, Tag>],
|
||||
unwind: Option<mir::BasicBlock>,
|
||||
unwind: StackPopUnwind,
|
||||
) -> InterpResult<'tcx> {
|
||||
let this = self.eval_context_mut();
|
||||
|
||||
trace!("miri_start_panic: {:?}", this.frame().instance);
|
||||
// Make sure we only start unwinding when this matches our panic strategy.
|
||||
if this.tcx.sess.panic_strategy() != PanicStrategy::Unwind {
|
||||
throw_ub_format!("unwinding despite panic=abort");
|
||||
}
|
||||
|
||||
// Get the raw pointer stored in arg[0] (the panic payload).
|
||||
let &[ref payload] = check_arg_count(args)?;
|
||||
|
|
@ -59,7 +55,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
|
|||
thread.panic_payload = Some(payload);
|
||||
|
||||
// Jump to the unwind block to begin unwinding.
|
||||
this.unwind_to_block(unwind);
|
||||
this.unwind_to_block(unwind)?;
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
|
|
@ -99,7 +95,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
|
|||
&[data.into()],
|
||||
Some(&ret_place),
|
||||
// Directly return to caller.
|
||||
StackPopCleanup::Goto { ret: Some(ret), unwind: None },
|
||||
StackPopCleanup::Goto { ret: Some(ret), unwind: StackPopUnwind::Skip },
|
||||
)?;
|
||||
|
||||
// We ourselves will return `0`, eventually (will be overwritten if we catch a panic).
|
||||
|
|
@ -155,7 +151,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
|
|||
&[catch_unwind.data.into(), payload.into()],
|
||||
Some(&ret_place),
|
||||
// Directly return to caller of `try`.
|
||||
StackPopCleanup::Goto { ret: Some(catch_unwind.ret), unwind: None },
|
||||
StackPopCleanup::Goto { ret: Some(catch_unwind.ret), unwind: StackPopUnwind::Skip },
|
||||
)?;
|
||||
|
||||
// We pushed a new stack frame, the engine should not do any jumping now!
|
||||
|
|
@ -166,7 +162,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
|
|||
}
|
||||
|
||||
/// Starta a panic in the interpreter with the given message as payload.
|
||||
fn start_panic(&mut self, msg: &str, unwind: Option<mir::BasicBlock>) -> InterpResult<'tcx> {
|
||||
fn start_panic(&mut self, msg: &str, unwind: StackPopUnwind) -> InterpResult<'tcx> {
|
||||
let this = self.eval_context_mut();
|
||||
|
||||
// First arg: message.
|
||||
|
|
@ -209,12 +205,24 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
|
|||
Abi::Rust,
|
||||
&[index.into(), len.into()],
|
||||
None,
|
||||
StackPopCleanup::Goto { ret: None, unwind },
|
||||
StackPopCleanup::Goto {
|
||||
ret: None,
|
||||
unwind: match unwind {
|
||||
Some(cleanup) => StackPopUnwind::Cleanup(cleanup),
|
||||
None => StackPopUnwind::Skip,
|
||||
},
|
||||
},
|
||||
)?;
|
||||
}
|
||||
_ => {
|
||||
// Forward everything else to `panic` lang item.
|
||||
this.start_panic(msg.description(), unwind)?;
|
||||
this.start_panic(
|
||||
msg.description(),
|
||||
match unwind {
|
||||
Some(cleanup) => StackPopUnwind::Cleanup(cleanup),
|
||||
None => StackPopUnwind::Skip,
|
||||
},
|
||||
)?;
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
|
|
|
|||
|
|
@ -7,5 +7,5 @@ extern "Rust" {
|
|||
}
|
||||
|
||||
fn main() {
|
||||
unsafe { miri_start_panic(&mut 0); } //~ ERROR unwinding despite panic=abort
|
||||
unsafe { miri_start_panic(&mut 0); } //~ ERROR unwinding past a stack frame that does not allow unwinding
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue