Change futex_wait errno from Scalar to IoError
To shift more Scalars to IoErrors, implement this change, allowing for a few other changes in the Linux and Windows shims. This also requires introducing a WindowsError variant in the IoError enum and implementing the VisitProvenance trait for IoErrors.
This commit is contained in:
parent
d581d802b1
commit
042f762200
5 changed files with 18 additions and 4 deletions
|
|
@ -696,7 +696,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
|
|||
retval_succ: Scalar,
|
||||
retval_timeout: Scalar,
|
||||
dest: MPlaceTy<'tcx>,
|
||||
errno_timeout: Scalar,
|
||||
errno_timeout: IoError,
|
||||
) {
|
||||
let this = self.eval_context_mut();
|
||||
let thread = this.active_thread();
|
||||
|
|
@ -713,7 +713,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
|
|||
retval_succ: Scalar,
|
||||
retval_timeout: Scalar,
|
||||
dest: MPlaceTy<'tcx>,
|
||||
errno_timeout: Scalar,
|
||||
errno_timeout: IoError,
|
||||
}
|
||||
@unblock = |this| {
|
||||
let futex = this.machine.sync.futexes.get(&addr).unwrap();
|
||||
|
|
|
|||
|
|
@ -89,6 +89,18 @@ impl VisitProvenance for Scalar {
|
|||
}
|
||||
}
|
||||
|
||||
impl VisitProvenance for IoError {
|
||||
fn visit_provenance(&self, visit: &mut VisitWith<'_>) {
|
||||
use crate::shims::io_error::IoError::*;
|
||||
match self {
|
||||
LibcError(_name) => (),
|
||||
WindowsError(_name) => (),
|
||||
HostError(_io_error) => (),
|
||||
Raw(scalar) => scalar.visit_provenance(visit),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl VisitProvenance for Immediate<Provenance> {
|
||||
fn visit_provenance(&self, visit: &mut VisitWith<'_>) {
|
||||
match self {
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ use crate::*;
|
|||
#[derive(Debug)]
|
||||
pub enum IoError {
|
||||
LibcError(&'static str),
|
||||
WindowsError(&'static str),
|
||||
HostError(io::Error),
|
||||
Raw(Scalar),
|
||||
}
|
||||
|
|
@ -113,6 +114,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
|
|||
let errno = match err.into() {
|
||||
HostError(err) => this.io_error_to_errnum(err)?,
|
||||
LibcError(name) => this.eval_libc(name),
|
||||
WindowsError(name) => this.eval_windows("c", name),
|
||||
Raw(val) => val,
|
||||
};
|
||||
let errno_place = this.last_error_place()?;
|
||||
|
|
|
|||
|
|
@ -150,7 +150,7 @@ pub fn futex<'tcx>(
|
|||
Scalar::from_target_isize(0, this), // retval_succ
|
||||
Scalar::from_target_isize(-1, this), // retval_timeout
|
||||
dest.clone(),
|
||||
this.eval_libc("ETIMEDOUT"), // errno_timeout
|
||||
LibcError("ETIMEDOUT"), // errno_timeout
|
||||
);
|
||||
} else {
|
||||
// The futex value doesn't match the expected value, so we return failure
|
||||
|
|
|
|||
|
|
@ -202,7 +202,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
|
|||
Scalar::from_i32(1), // retval_succ
|
||||
Scalar::from_i32(0), // retval_timeout
|
||||
dest.clone(),
|
||||
this.eval_windows("c", "ERROR_TIMEOUT"), // errno_timeout
|
||||
IoError::WindowsError("ERROR_TIMEOUT"), // errno_timeout
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue