Change last_error to a place
This commit is contained in:
parent
4232939319
commit
ed776f67ba
4 changed files with 9 additions and 19 deletions
|
|
@ -183,8 +183,7 @@ pub fn create_ecx<'mir, 'tcx: 'mir>(
|
|||
let errno_layout = ecx.layout_of(ecx.tcx.types.u32)?;
|
||||
let errno_place = ecx.allocate(errno_layout, MiriMemoryKind::Static.into());
|
||||
ecx.write_scalar(Scalar::from_u32(0), errno_place.into())?;
|
||||
let errno_ptr = ecx.check_mplace_access(errno_place.into(), Some(Size::from_bits(32)))?;
|
||||
ecx.machine.last_error = errno_ptr;
|
||||
ecx.machine.last_error = Some(errno_place);
|
||||
|
||||
Ok(ecx)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -349,25 +349,15 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
|
|||
/// Sets the last error variable
|
||||
fn set_last_error(&mut self, scalar: Scalar<Tag>) -> InterpResult<'tcx> {
|
||||
let this = self.eval_context_mut();
|
||||
let tcx = &{ this.tcx.tcx };
|
||||
let errno_ptr = this.machine.last_error.unwrap();
|
||||
this.memory.get_mut(errno_ptr.alloc_id)?.write_scalar(
|
||||
tcx,
|
||||
errno_ptr,
|
||||
scalar.into(),
|
||||
Size::from_bits(32),
|
||||
)
|
||||
let errno_place = this.machine.last_error.unwrap();
|
||||
this.write_scalar(scalar, errno_place.into())
|
||||
}
|
||||
|
||||
/// Gets the last error variable
|
||||
fn get_last_error(&mut self) -> InterpResult<'tcx, Scalar<Tag>> {
|
||||
let this = self.eval_context_mut();
|
||||
let tcx = &{ this.tcx.tcx };
|
||||
let errno_ptr = this.machine.last_error.unwrap();
|
||||
this.memory
|
||||
.get(errno_ptr.alloc_id)?
|
||||
.read_scalar(tcx, errno_ptr, Size::from_bits(32))?
|
||||
.not_undef()
|
||||
let errno_place = this.machine.last_error.unwrap();
|
||||
this.read_scalar(errno_place.into())?.not_undef()
|
||||
}
|
||||
|
||||
/// Sets the last error variable using a `std::io::Error`. It fails if the error cannot be
|
||||
|
|
|
|||
|
|
@ -91,8 +91,8 @@ pub struct Evaluator<'tcx> {
|
|||
pub(crate) argv: Option<Pointer<Tag>>,
|
||||
pub(crate) cmd_line: Option<Pointer<Tag>>,
|
||||
|
||||
/// Last OS error.
|
||||
pub(crate) last_error: Option<Pointer<Tag>>,
|
||||
/// Last OS error location in memory. It is a 32 bits integer (unsigned for Windows)
|
||||
pub(crate) last_error: Option<MPlaceTy<'tcx, Tag>>,
|
||||
|
||||
/// TLS state.
|
||||
pub(crate) tls: TlsData<'tcx>,
|
||||
|
|
|
|||
|
|
@ -414,7 +414,8 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
|
|||
}
|
||||
|
||||
"__errno_location" | "__error" => {
|
||||
let errno_scalar: Scalar<Tag> = this.machine.last_error.unwrap().into();
|
||||
let errno_place = this.machine.last_error.unwrap();
|
||||
let errno_scalar: Scalar<Tag> = this.check_mplace_access(errno_place.into(), Some(Size::from_bits(32)))?.unwrap().into();
|
||||
this.write_scalar(errno_scalar, dest)?;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue