interpret: make write functions generic over the place type
This commit is contained in:
parent
4fc6b33474
commit
00fb45dccd
26 changed files with 243 additions and 213 deletions
|
|
@ -490,7 +490,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: MiriInterpCxExt<'mir, 'tcx> {
|
|||
this.atomic_access_check(dest)?;
|
||||
|
||||
this.validate_overlapping_atomic(dest)?;
|
||||
this.allow_data_races_mut(move |this| this.write_scalar(val, &dest.into()))?;
|
||||
this.allow_data_races_mut(move |this| this.write_scalar(val, dest))?;
|
||||
this.validate_atomic_store(dest, atomic)?;
|
||||
// FIXME: it's not possible to get the value before write_scalar. A read_scalar will cause
|
||||
// side effects from a read the program did not perform. So we have to initialise
|
||||
|
|
@ -518,7 +518,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: MiriInterpCxExt<'mir, 'tcx> {
|
|||
// Atomics wrap around on overflow.
|
||||
let val = this.binary_op(op, &old, rhs)?;
|
||||
let val = if neg { this.unary_op(mir::UnOp::Not, &val)? } else { val };
|
||||
this.allow_data_races_mut(|this| this.write_immediate(*val, &place.into()))?;
|
||||
this.allow_data_races_mut(|this| this.write_immediate(*val, place))?;
|
||||
|
||||
this.validate_atomic_rmw(place, atomic)?;
|
||||
|
||||
|
|
@ -539,7 +539,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: MiriInterpCxExt<'mir, 'tcx> {
|
|||
|
||||
this.validate_overlapping_atomic(place)?;
|
||||
let old = this.allow_data_races_mut(|this| this.read_scalar(&place.into()))?;
|
||||
this.allow_data_races_mut(|this| this.write_scalar(new, &place.into()))?;
|
||||
this.allow_data_races_mut(|this| this.write_scalar(new, place))?;
|
||||
|
||||
this.validate_atomic_rmw(place, atomic)?;
|
||||
|
||||
|
|
@ -569,7 +569,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: MiriInterpCxExt<'mir, 'tcx> {
|
|||
if lt { &rhs } else { &old }
|
||||
};
|
||||
|
||||
this.allow_data_races_mut(|this| this.write_immediate(**new_val, &place.into()))?;
|
||||
this.allow_data_races_mut(|this| this.write_immediate(**new_val, place))?;
|
||||
|
||||
this.validate_atomic_rmw(place, atomic)?;
|
||||
|
||||
|
|
@ -621,7 +621,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: MiriInterpCxExt<'mir, 'tcx> {
|
|||
// if successful, perform a full rw-atomic validation
|
||||
// otherwise treat this as an atomic load with the fail ordering.
|
||||
if cmpxchg_success {
|
||||
this.allow_data_races_mut(|this| this.write_scalar(new, &place.into()))?;
|
||||
this.allow_data_races_mut(|this| this.write_scalar(new, place))?;
|
||||
this.validate_atomic_rmw(place, success)?;
|
||||
this.buffered_atomic_rmw(new, place, success, old.to_scalar())?;
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -834,7 +834,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||
if let Some(thread_info_place) = thread {
|
||||
this.write_scalar(
|
||||
Scalar::from_uint(new_thread_id.to_u32(), thread_info_place.layout.size),
|
||||
&thread_info_place.into(),
|
||||
&thread_info_place,
|
||||
)?;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -321,7 +321,7 @@ pub fn create_ecx<'mir, 'tcx: 'mir>(
|
|||
let argvs_place = ecx.allocate(argvs_layout, MiriMemoryKind::Machine.into())?;
|
||||
for (idx, arg) in argvs.into_iter().enumerate() {
|
||||
let place = ecx.project_field(&argvs_place, idx)?;
|
||||
ecx.write_immediate(arg, &place.into())?;
|
||||
ecx.write_immediate(arg, &place)?;
|
||||
}
|
||||
ecx.mark_immutable(&argvs_place);
|
||||
// A pointer to that place is the 3rd argument for main.
|
||||
|
|
@ -330,7 +330,7 @@ pub fn create_ecx<'mir, 'tcx: 'mir>(
|
|||
{
|
||||
let argc_place =
|
||||
ecx.allocate(ecx.machine.layouts.isize, MiriMemoryKind::Machine.into())?;
|
||||
ecx.write_scalar(argc, &argc_place.into())?;
|
||||
ecx.write_scalar(argc, &argc_place)?;
|
||||
ecx.mark_immutable(&argc_place);
|
||||
ecx.machine.argc = Some(*argc_place);
|
||||
|
||||
|
|
@ -338,7 +338,7 @@ pub fn create_ecx<'mir, 'tcx: 'mir>(
|
|||
ecx.layout_of(Ty::new_imm_ptr(tcx, tcx.types.unit))?,
|
||||
MiriMemoryKind::Machine.into(),
|
||||
)?;
|
||||
ecx.write_immediate(argv, &argv_place.into())?;
|
||||
ecx.write_immediate(argv, &argv_place)?;
|
||||
ecx.mark_immutable(&argv_place);
|
||||
ecx.machine.argv = Some(*argv_place);
|
||||
}
|
||||
|
|
@ -355,7 +355,7 @@ pub fn create_ecx<'mir, 'tcx: 'mir>(
|
|||
// Store the UTF-16 string. We just allocated so we know the bounds are fine.
|
||||
for (idx, &c) in cmd_utf16.iter().enumerate() {
|
||||
let place = ecx.project_field(&cmd_place, idx)?;
|
||||
ecx.write_scalar(Scalar::from_u16(c), &place.into())?;
|
||||
ecx.write_scalar(Scalar::from_u16(c), &place)?;
|
||||
}
|
||||
ecx.mark_immutable(&cmd_place);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -231,7 +231,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||
}
|
||||
|
||||
/// Project to the given *named* field (which must be a struct or union type).
|
||||
fn project_field_named<P: Projectable<'mir, 'tcx, Provenance>>(
|
||||
fn project_field_named<P: Projectable<'tcx, Provenance>>(
|
||||
&self,
|
||||
base: &P,
|
||||
name: &str,
|
||||
|
|
@ -252,13 +252,13 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||
fn write_int(
|
||||
&mut self,
|
||||
i: impl Into<i128>,
|
||||
dest: &PlaceTy<'tcx, Provenance>,
|
||||
dest: &impl Writeable<'tcx, Provenance>,
|
||||
) -> InterpResult<'tcx> {
|
||||
assert!(dest.layout.abi.is_scalar(), "write_int on non-scalar type {}", dest.layout.ty);
|
||||
let val = if dest.layout.abi.is_signed() {
|
||||
Scalar::from_int(i, dest.layout.size)
|
||||
assert!(dest.layout().abi.is_scalar(), "write_int on non-scalar type {}", dest.layout().ty);
|
||||
let val = if dest.layout().abi.is_signed() {
|
||||
Scalar::from_int(i, dest.layout().size)
|
||||
} else {
|
||||
Scalar::from_uint(u64::try_from(i.into()).unwrap(), dest.layout.size)
|
||||
Scalar::from_uint(u64::try_from(i.into()).unwrap(), dest.layout().size)
|
||||
};
|
||||
self.eval_context_mut().write_scalar(val, dest)
|
||||
}
|
||||
|
|
@ -267,12 +267,12 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||
fn write_int_fields(
|
||||
&mut self,
|
||||
values: &[i128],
|
||||
dest: &MPlaceTy<'tcx, Provenance>,
|
||||
dest: &impl Writeable<'tcx, Provenance>,
|
||||
) -> InterpResult<'tcx> {
|
||||
let this = self.eval_context_mut();
|
||||
for (idx, &val) in values.iter().enumerate() {
|
||||
let field = this.project_field(dest, idx)?;
|
||||
this.write_int(val, &field.into())?;
|
||||
this.write_int(val, &field)?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
|
@ -281,18 +281,18 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||
fn write_int_fields_named(
|
||||
&mut self,
|
||||
values: &[(&str, i128)],
|
||||
dest: &MPlaceTy<'tcx, Provenance>,
|
||||
dest: &impl Writeable<'tcx, Provenance>,
|
||||
) -> InterpResult<'tcx> {
|
||||
let this = self.eval_context_mut();
|
||||
for &(name, val) in values.iter() {
|
||||
let field = this.project_field_named(dest, name)?;
|
||||
this.write_int(val, &field.into())?;
|
||||
this.write_int(val, &field)?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Write a 0 of the appropriate size to `dest`.
|
||||
fn write_null(&mut self, dest: &PlaceTy<'tcx, Provenance>) -> InterpResult<'tcx> {
|
||||
fn write_null(&mut self, dest: &impl Writeable<'tcx, Provenance>) -> InterpResult<'tcx> {
|
||||
self.write_int(0, dest)
|
||||
}
|
||||
|
||||
|
|
@ -606,7 +606,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||
// Allocate new place, set initial value to 0.
|
||||
let errno_layout = this.machine.layouts.u32;
|
||||
let errno_place = this.allocate(errno_layout, MiriMemoryKind::Machine.into())?;
|
||||
this.write_scalar(Scalar::from_u32(0), &errno_place.into())?;
|
||||
this.write_scalar(Scalar::from_u32(0), &errno_place)?;
|
||||
this.active_thread_mut().last_error = Some(errno_place);
|
||||
Ok(errno_place)
|
||||
}
|
||||
|
|
@ -616,7 +616,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||
fn set_last_error(&mut self, scalar: Scalar<Provenance>) -> InterpResult<'tcx> {
|
||||
let this = self.eval_context_mut();
|
||||
let errno_place = this.last_error_place()?;
|
||||
this.write_scalar(scalar, &errno_place.into())
|
||||
this.write_scalar(scalar, &errno_place)
|
||||
}
|
||||
|
||||
/// Gets the last error variable.
|
||||
|
|
@ -785,7 +785,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||
) -> InterpResult<'tcx, ()> {
|
||||
let this = self.eval_context_mut();
|
||||
let value_place = this.deref_operand_and_offset(op, offset, base_layout, value_layout)?;
|
||||
this.write_scalar(value, &value_place.into())
|
||||
this.write_scalar(value, &value_place)
|
||||
}
|
||||
|
||||
/// Parse a `timespec` struct and return it as a `std::time::Duration`. It returns `None`
|
||||
|
|
|
|||
|
|
@ -651,7 +651,7 @@ impl<'mir, 'tcx> MiriMachine<'mir, 'tcx> {
|
|||
val: ImmTy<'tcx, Provenance>,
|
||||
) -> InterpResult<'tcx> {
|
||||
let place = this.allocate(val.layout, MiriMemoryKind::ExternStatic.into())?;
|
||||
this.write_immediate(*val, &place.into())?;
|
||||
this.write_immediate(*val, &place)?;
|
||||
Self::add_extern_static(this, name, place.ptr);
|
||||
Ok(())
|
||||
}
|
||||
|
|
|
|||
|
|
@ -85,7 +85,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||
for (i, ptr) in ptrs.into_iter().enumerate() {
|
||||
let place = this.project_index(&alloc, i as u64)?;
|
||||
|
||||
this.write_pointer(ptr, &place.into())?;
|
||||
this.write_pointer(ptr, &place)?;
|
||||
}
|
||||
|
||||
this.write_immediate(
|
||||
|
|
@ -106,7 +106,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||
|
||||
let op_place = buf_place.offset(offset, ptr_layout, this)?;
|
||||
|
||||
this.write_pointer(ptr, &op_place.into())?;
|
||||
this.write_pointer(ptr, &op_place)?;
|
||||
}
|
||||
}
|
||||
_ => throw_unsup_format!("unknown `miri_get_backtrace` flags {}", flags),
|
||||
|
|
@ -196,33 +196,33 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||
|
||||
this.write_immediate(
|
||||
name_alloc.to_ref(this),
|
||||
&this.project_field(&dest, 0)?.into(),
|
||||
&this.project_field(&dest, 0)?,
|
||||
)?;
|
||||
this.write_immediate(
|
||||
filename_alloc.to_ref(this),
|
||||
&this.project_field(&dest, 1)?.into(),
|
||||
&this.project_field(&dest, 1)?,
|
||||
)?;
|
||||
}
|
||||
1 => {
|
||||
this.write_scalar(
|
||||
Scalar::from_target_usize(name.len().try_into().unwrap(), this),
|
||||
&this.project_field(&dest, 0)?.into(),
|
||||
&this.project_field(&dest, 0)?,
|
||||
)?;
|
||||
this.write_scalar(
|
||||
Scalar::from_target_usize(filename.len().try_into().unwrap(), this),
|
||||
&this.project_field(&dest, 1)?.into(),
|
||||
&this.project_field(&dest, 1)?,
|
||||
)?;
|
||||
}
|
||||
_ => throw_unsup_format!("unknown `miri_resolve_frame` flags {}", flags),
|
||||
}
|
||||
|
||||
this.write_scalar(Scalar::from_u32(lineno), &this.project_field(&dest, 2)?.into())?;
|
||||
this.write_scalar(Scalar::from_u32(colno), &this.project_field(&dest, 3)?.into())?;
|
||||
this.write_scalar(Scalar::from_u32(lineno), &this.project_field(&dest, 2)?)?;
|
||||
this.write_scalar(Scalar::from_u32(colno), &this.project_field(&dest, 3)?)?;
|
||||
|
||||
// Support a 4-field struct for now - this is deprecated
|
||||
// and slated for removal.
|
||||
if num_fields == 5 {
|
||||
this.write_pointer(fn_ptr, &this.project_field(&dest, 4)?.into())?;
|
||||
this.write_pointer(fn_ptr, &this.project_field(&dest, 4)?)?;
|
||||
}
|
||||
|
||||
Ok(())
|
||||
|
|
|
|||
|
|
@ -457,9 +457,9 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||
let vars_place = this.allocate(vars_layout, MiriMemoryKind::Runtime.into())?;
|
||||
for (idx, var) in vars.into_iter().enumerate() {
|
||||
let place = this.project_field(&vars_place, idx)?;
|
||||
this.write_pointer(var, &place.into())?;
|
||||
this.write_pointer(var, &place)?;
|
||||
}
|
||||
this.write_pointer(vars_place.ptr, &this.machine.env_vars.environ.unwrap().into())?;
|
||||
this.write_pointer(vars_place.ptr, &this.machine.env_vars.environ.unwrap())?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
|
|
|||
|
|
@ -102,7 +102,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||
"volatile_store" => {
|
||||
let [place, dest] = check_arg_count(args)?;
|
||||
let place = this.deref_operand(place)?;
|
||||
this.copy_op(dest, &place.into(), /*allow_transmute*/ false)?;
|
||||
this.copy_op(dest, &place, /*allow_transmute*/ false)?;
|
||||
}
|
||||
|
||||
"write_bytes" | "volatile_set_memory" => {
|
||||
|
|
|
|||
|
|
@ -104,7 +104,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||
|
||||
}
|
||||
};
|
||||
this.write_scalar(val, &dest.into())?;
|
||||
this.write_scalar(val, &dest)?;
|
||||
}
|
||||
}
|
||||
#[rustfmt::skip]
|
||||
|
|
@ -217,7 +217,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||
fmin_op(&left, &right)?
|
||||
}
|
||||
};
|
||||
this.write_scalar(val, &dest.into())?;
|
||||
this.write_scalar(val, &dest)?;
|
||||
}
|
||||
}
|
||||
"fma" => {
|
||||
|
|
@ -258,7 +258,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||
Scalar::from_u64(res.to_bits())
|
||||
}
|
||||
};
|
||||
this.write_scalar(val, &dest.into())?;
|
||||
this.write_scalar(val, &dest)?;
|
||||
}
|
||||
}
|
||||
#[rustfmt::skip]
|
||||
|
|
@ -378,7 +378,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||
let dest = this.project_index(&dest, i)?;
|
||||
|
||||
let val = if simd_element_to_bool(mask)? { yes } else { no };
|
||||
this.write_immediate(*val, &dest.into())?;
|
||||
this.write_immediate(*val, &dest)?;
|
||||
}
|
||||
}
|
||||
"select_bitmask" => {
|
||||
|
|
@ -408,7 +408,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||
let dest = this.project_index(&dest, i.into())?;
|
||||
|
||||
let val = if mask != 0 { yes } else { no };
|
||||
this.write_immediate(*val, &dest.into())?;
|
||||
this.write_immediate(*val, &dest)?;
|
||||
}
|
||||
for i in dest_len..bitmask_len {
|
||||
// If the mask is "padded", ensure that padding is all-zero.
|
||||
|
|
@ -472,7 +472,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||
to_ty = dest.layout.ty,
|
||||
),
|
||||
};
|
||||
this.write_immediate(val, &dest.into())?;
|
||||
this.write_immediate(val, &dest)?;
|
||||
}
|
||||
}
|
||||
"shuffle" => {
|
||||
|
|
@ -513,7 +513,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||
"simd_shuffle index {src_index} is out of bounds for 2 vectors of size {left_len}",
|
||||
);
|
||||
};
|
||||
this.write_immediate(*val, &dest.into())?;
|
||||
this.write_immediate(*val, &dest)?;
|
||||
}
|
||||
}
|
||||
"gather" => {
|
||||
|
|
@ -539,7 +539,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||
} else {
|
||||
passthru
|
||||
};
|
||||
this.write_immediate(*val, &dest.into())?;
|
||||
this.write_immediate(*val, &dest)?;
|
||||
}
|
||||
}
|
||||
"scatter" => {
|
||||
|
|
@ -558,7 +558,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||
|
||||
if simd_element_to_bool(mask)? {
|
||||
let place = this.deref_operand(&ptr.into())?;
|
||||
this.write_immediate(*value, &place.into())?;
|
||||
this.write_immediate(*value, &place)?;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -588,7 +588,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||
// We have to force the place type to be an int so that we can write `res` into it.
|
||||
let mut dest = this.force_allocation(dest)?;
|
||||
dest.layout = this.machine.layouts.uint(dest.layout.size).unwrap();
|
||||
this.write_int(res, &dest.into())?;
|
||||
this.write_int(res, &dest)?;
|
||||
}
|
||||
|
||||
name => throw_unsup_format!("unimplemented intrinsic: `simd_{name}`"),
|
||||
|
|
|
|||
|
|
@ -158,7 +158,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||
})?;
|
||||
this.write_scalar(
|
||||
Scalar::from_i64(qpc),
|
||||
&this.deref_operand(lpPerformanceCount_op)?.into(),
|
||||
&this.deref_operand(lpPerformanceCount_op)?,
|
||||
)?;
|
||||
Ok(Scalar::from_i32(-1)) // return non-zero on success
|
||||
}
|
||||
|
|
@ -179,7 +179,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||
// and thus 10^9 counts per second.
|
||||
this.write_scalar(
|
||||
Scalar::from_i64(1_000_000_000),
|
||||
&this.deref_operand_as(lpFrequency_op, this.machine.layouts.u64)?.into(),
|
||||
&this.deref_operand_as(lpFrequency_op, this.machine.layouts.u64)?,
|
||||
)?;
|
||||
Ok(Scalar::from_i32(-1)) // Return non-zero on success
|
||||
}
|
||||
|
|
|
|||
|
|
@ -201,14 +201,14 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||
this.write_int(einval, dest)?;
|
||||
} else {
|
||||
if size == 0 {
|
||||
this.write_null(&ret.into())?;
|
||||
this.write_null(&ret)?;
|
||||
} else {
|
||||
let ptr = this.allocate_ptr(
|
||||
Size::from_bytes(size),
|
||||
Align::from_bytes(align).unwrap(),
|
||||
MiriMemoryKind::C.into(),
|
||||
)?;
|
||||
this.write_pointer(ptr, &ret.into())?;
|
||||
this.write_pointer(ptr, &ret)?;
|
||||
}
|
||||
this.write_null(dest)?;
|
||||
}
|
||||
|
|
@ -293,7 +293,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||
|
||||
// Create key and write it into the memory where `key_ptr` wants it.
|
||||
let key = this.machine.tls.create_tls_key(dtor, key_layout.size)?;
|
||||
this.write_scalar(Scalar::from_uint(key, key_layout.size), &key_place.into())?;
|
||||
this.write_scalar(Scalar::from_uint(key, key_layout.size), &key_place)?;
|
||||
|
||||
// Return success (`0`).
|
||||
this.write_null(dest)?;
|
||||
|
|
@ -508,7 +508,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||
let [_attr, guard_size] = this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?;
|
||||
let guard_size = this.deref_operand(guard_size)?;
|
||||
let guard_size_layout = this.libc_ty_layout("size_t");
|
||||
this.write_scalar(Scalar::from_uint(this.machine.page_size, guard_size_layout.size), &guard_size.into())?;
|
||||
this.write_scalar(Scalar::from_uint(this.machine.page_size, guard_size_layout.size), &guard_size)?;
|
||||
|
||||
// Return success (`0`).
|
||||
this.write_null(dest)?;
|
||||
|
|
@ -538,11 +538,11 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||
|
||||
this.write_scalar(
|
||||
Scalar::from_uint(this.machine.stack_addr, this.pointer_size()),
|
||||
&addr_place.into(),
|
||||
&addr_place,
|
||||
)?;
|
||||
this.write_scalar(
|
||||
Scalar::from_uint(this.machine.stack_size, this.pointer_size()),
|
||||
&size_place.into(),
|
||||
&size_place,
|
||||
)?;
|
||||
|
||||
// Return success (`0`).
|
||||
|
|
@ -587,20 +587,20 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||
|
||||
// Reset all fields to `uninit` to make sure nobody reads them.
|
||||
// (This is a std-only shim so we are okay with such hacks.)
|
||||
this.write_uninit(&pwd.into())?;
|
||||
this.write_uninit(&pwd)?;
|
||||
|
||||
// We only set the home_dir field.
|
||||
#[allow(deprecated)]
|
||||
let home_dir = std::env::home_dir().unwrap();
|
||||
let (written, _) = this.write_path_to_c_str(&home_dir, buf, buflen)?;
|
||||
let pw_dir = this.project_field_named(&pwd, "pw_dir")?;
|
||||
this.write_pointer(buf, &pw_dir.into())?;
|
||||
this.write_pointer(buf, &pw_dir)?;
|
||||
|
||||
if written {
|
||||
this.write_pointer(pwd.ptr, &result.into())?;
|
||||
this.write_pointer(pwd.ptr, &result)?;
|
||||
this.write_null(dest)?;
|
||||
} else {
|
||||
this.write_null(&result.into())?;
|
||||
this.write_null(&result)?;
|
||||
this.write_scalar(this.eval_libc("ERANGE"), dest)?;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1457,13 +1457,13 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||
)?;
|
||||
|
||||
let result_place = this.deref_operand(result_op)?;
|
||||
this.write_scalar(this.read_scalar(entry_op)?, &result_place.into())?;
|
||||
this.write_scalar(this.read_scalar(entry_op)?, &result_place)?;
|
||||
|
||||
0
|
||||
}
|
||||
None => {
|
||||
// end of stream: return 0, assign *result=NULL
|
||||
this.write_null(&this.deref_operand(result_op)?.into())?;
|
||||
this.write_null(&this.deref_operand(result_op)?)?;
|
||||
0
|
||||
}
|
||||
Some(Err(e)) =>
|
||||
|
|
|
|||
|
|
@ -248,8 +248,8 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||
let sv1 = fh.insert_fd(Box::new(SocketPair));
|
||||
let sv1 = ScalarInt::try_from_int(sv1, sv.layout.size).unwrap();
|
||||
|
||||
this.write_scalar(sv0, &sv.into())?;
|
||||
this.write_scalar(sv1, &sv.offset(sv.layout.size, sv.layout, this)?.into())?;
|
||||
this.write_scalar(sv0, &sv)?;
|
||||
this.write_scalar(sv1, &sv.offset(sv.layout.size, sv.layout, this)?)?;
|
||||
|
||||
Ok(Scalar::from_i32(0))
|
||||
}
|
||||
|
|
|
|||
|
|
@ -141,7 +141,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||
} else {
|
||||
this.write_scalar(
|
||||
Scalar::from_u32(size_needed.try_into().unwrap()),
|
||||
&bufsize.into(),
|
||||
&bufsize,
|
||||
)?;
|
||||
this.write_int(-1, dest)?;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -346,7 +346,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||
// This can always be revisited to have some external state to catch double-destroys
|
||||
// but not complain about the above code. See https://github.com/rust-lang/miri/pull/1933
|
||||
this.write_uninit(
|
||||
&this.deref_operand_as(attr_op, this.libc_ty_layout("pthread_mutexattr_t"))?.into(),
|
||||
&this.deref_operand_as(attr_op, this.libc_ty_layout("pthread_mutexattr_t"))?,
|
||||
)?;
|
||||
|
||||
Ok(0)
|
||||
|
|
@ -500,7 +500,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||
|
||||
// This might lead to false positives, see comment in pthread_mutexattr_destroy
|
||||
this.write_uninit(
|
||||
&this.deref_operand_as(mutex_op, this.libc_ty_layout("pthread_mutex_t"))?.into(),
|
||||
&this.deref_operand_as(mutex_op, this.libc_ty_layout("pthread_mutex_t"))?,
|
||||
)?;
|
||||
// FIXME: delete interpreter state associated with this mutex.
|
||||
|
||||
|
|
@ -625,7 +625,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||
|
||||
// This might lead to false positives, see comment in pthread_mutexattr_destroy
|
||||
this.write_uninit(
|
||||
&this.deref_operand_as(rwlock_op, this.libc_ty_layout("pthread_rwlock_t"))?.into(),
|
||||
&this.deref_operand_as(rwlock_op, this.libc_ty_layout("pthread_rwlock_t"))?,
|
||||
)?;
|
||||
// FIXME: delete interpreter state associated with this rwlock.
|
||||
|
||||
|
|
@ -675,7 +675,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||
let this = self.eval_context_mut();
|
||||
|
||||
let clock_id = condattr_get_clock_id(this, attr_op)?;
|
||||
this.write_scalar(Scalar::from_i32(clock_id), &this.deref_operand(clk_id_op)?.into())?;
|
||||
this.write_scalar(Scalar::from_i32(clock_id), &this.deref_operand(clk_id_op)?)?;
|
||||
|
||||
Ok(Scalar::from_i32(0))
|
||||
}
|
||||
|
|
@ -691,7 +691,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||
|
||||
// This might lead to false positives, see comment in pthread_mutexattr_destroy
|
||||
this.write_uninit(
|
||||
&this.deref_operand_as(attr_op, this.libc_ty_layout("pthread_condattr_t"))?.into(),
|
||||
&this.deref_operand_as(attr_op, this.libc_ty_layout("pthread_condattr_t"))?,
|
||||
)?;
|
||||
|
||||
Ok(0)
|
||||
|
|
@ -868,7 +868,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||
|
||||
// This might lead to false positives, see comment in pthread_mutexattr_destroy
|
||||
this.write_uninit(
|
||||
&this.deref_operand_as(cond_op, this.libc_ty_layout("pthread_cond_t"))?.into(),
|
||||
&this.deref_operand_as(cond_op, this.libc_ty_layout("pthread_cond_t"))?,
|
||||
)?;
|
||||
// FIXME: delete interpreter state associated with this condvar.
|
||||
|
||||
|
|
|
|||
|
|
@ -125,7 +125,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
|||
this.project_field_named(&io_status_block, "Information")?;
|
||||
this.write_scalar(
|
||||
Scalar::from_target_usize(n.into(), this),
|
||||
&io_status_information.into(),
|
||||
&io_status_information,
|
||||
)?;
|
||||
}
|
||||
// Return whether this was a success. >= 0 is success.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue