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)
}
/// 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
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>,
}
"__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)?;
}