Skip to content

Commit db025c1

Browse files
Refactor EvalContext stack and heap into inner struct
Change surrounding code to use accessor methods to refer to these fields. Similar changes have not yet been made in tools/miri
1 parent 0ad8f9e commit db025c1

File tree

8 files changed

+110
-98
lines changed

8 files changed

+110
-98
lines changed

src/librustc_mir/interpret/cast.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,8 @@ impl<'a, 'mir, 'tcx, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M> {
7676
// No alignment check needed for raw pointers. But we have to truncate to target ptr size.
7777
TyRawPtr(_) => {
7878
Ok(Scalar::Bits {
79-
bits: self.memory.truncate_to_ptr(v).0 as u128,
80-
defined: self.memory.pointer_size().bits() as u8,
79+
bits: self.memory().truncate_to_ptr(v).0 as u128,
80+
defined: self.memory().pointer_size().bits() as u8,
8181
})
8282
},
8383

@@ -92,7 +92,7 @@ impl<'a, 'mir, 'tcx, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M> {
9292
match dest_ty.sty {
9393
// float -> uint
9494
TyUint(t) => {
95-
let width = t.bit_width().unwrap_or(self.memory.pointer_size().bits() as usize);
95+
let width = t.bit_width().unwrap_or(self.memory().pointer_size().bits() as usize);
9696
match fty {
9797
FloatTy::F32 => Ok(Scalar::Bits {
9898
bits: Single::from_bits(bits).to_u128(width).value,
@@ -106,7 +106,7 @@ impl<'a, 'mir, 'tcx, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M> {
106106
},
107107
// float -> int
108108
TyInt(t) => {
109-
let width = t.bit_width().unwrap_or(self.memory.pointer_size().bits() as usize);
109+
let width = t.bit_width().unwrap_or(self.memory().pointer_size().bits() as usize);
110110
match fty {
111111
FloatTy::F32 => Ok(Scalar::Bits {
112112
bits: Single::from_bits(bits).to_i128(width).value as u128,

src/librustc_mir/interpret/const_eval.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ pub fn value_to_const_value<'tcx>(
8888
Value::ScalarPair(a, b) => Ok(ConstValue::ScalarPair(a, b)),
8989
Value::ByRef(ptr, align) => {
9090
let ptr = ptr.to_ptr().unwrap();
91-
let alloc = ecx.memory.get(ptr.alloc_id)?;
91+
let alloc = ecx.memory().get(ptr.alloc_id)?;
9292
assert!(alloc.align.abi() >= align.abi());
9393
assert!(alloc.bytes.len() as u64 - ptr.offset.bytes() >= layout.size.bytes());
9494
let mut alloc = alloc.clone();
@@ -149,7 +149,7 @@ fn eval_body_using_ecx<'a, 'mir, 'tcx>(
149149
}
150150
let layout = ecx.layout_of(mir.return_ty().subst(tcx, cid.instance.substs))?;
151151
assert!(!layout.is_unsized());
152-
let ptr = ecx.memory.allocate(
152+
let ptr = ecx.memory_mut().allocate(
153153
layout.size,
154154
layout.align,
155155
MemoryKind::Stack,
@@ -486,7 +486,7 @@ pub fn const_variant_index<'a, 'tcx>(
486486
let (ptr, align) = match value {
487487
Value::ScalarPair(..) | Value::Scalar(_) => {
488488
let layout = ecx.layout_of(val.ty)?;
489-
let ptr = ecx.memory.allocate(layout.size, layout.align, MemoryKind::Stack)?.into();
489+
let ptr = ecx.memory_mut().allocate(layout.size, layout.align, MemoryKind::Stack)?.into();
490490
ecx.write_value_to_ptr(value, ptr, layout.align, val.ty)?;
491491
(ptr, layout.align)
492492
},
@@ -515,9 +515,9 @@ pub fn const_value_to_allocation_provider<'a, 'tcx>(
515515
());
516516
let value = ecx.const_to_value(val.val)?;
517517
let layout = ecx.layout_of(val.ty)?;
518-
let ptr = ecx.memory.allocate(layout.size, layout.align, MemoryKind::Stack)?;
518+
let ptr = ecx.memory_mut().allocate(layout.size, layout.align, MemoryKind::Stack)?;
519519
ecx.write_value_to_ptr(value, ptr.into(), layout.align, val.ty)?;
520-
let alloc = ecx.memory.get(ptr.alloc_id)?;
520+
let alloc = ecx.memory().get(ptr.alloc_id)?;
521521
Ok(tcx.intern_const_alloc(alloc.clone()))
522522
};
523523
result().expect("unable to convert ConstValue to Allocation")

src/librustc_mir/interpret/eval_context.rs

Lines changed: 75 additions & 63 deletions
Large diffs are not rendered by default.

src/librustc_mir/interpret/memory.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -991,12 +991,12 @@ impl<'a, 'mir, 'tcx, M: Machine<'mir, 'tcx>> HasMemory<'a, 'mir, 'tcx, M> for Me
991991
impl<'a, 'mir, 'tcx, M: Machine<'mir, 'tcx>> HasMemory<'a, 'mir, 'tcx, M> for EvalContext<'a, 'mir, 'tcx, M> {
992992
#[inline]
993993
fn memory_mut(&mut self) -> &mut Memory<'a, 'mir, 'tcx, M> {
994-
&mut self.memory
994+
self.memory_mut()
995995
}
996996

997997
#[inline]
998998
fn memory(&self) -> &Memory<'a, 'mir, 'tcx, M> {
999-
&self.memory
999+
self.memory()
10001000
}
10011001
}
10021002

src/librustc_mir/interpret/place.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ impl<'a, 'mir, 'tcx, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M> {
201201
assert_eq!(extra, PlaceExtra::None);
202202
Ok(Value::ByRef(ptr, align))
203203
}
204-
Place::Local { frame, local } => self.stack[frame].get_local(local),
204+
Place::Local { frame, local } => self.stack()[frame].get_local(local),
205205
}
206206
}
207207

@@ -261,7 +261,7 @@ impl<'a, 'mir, 'tcx, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M> {
261261
let (base_ptr, base_align, base_extra) = match base {
262262
Place::Ptr { ptr, align, extra } => (ptr, align, extra),
263263
Place::Local { frame, local } => {
264-
match (&self.stack[frame].get_local(local)?, &base_layout.abi) {
264+
match (&self.stack()[frame].get_local(local)?, &base_layout.abi) {
265265
// in case the field covers the entire type, just return the value
266266
(&Value::Scalar(_), &layout::Abi::Scalar(_)) |
267267
(&Value::ScalarPair(..), &layout::Abi::ScalarPair(..))

src/librustc_mir/interpret/step.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ impl<'a, 'mir, 'tcx, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M> {
1919

2020
/// Returns true as long as there are more things to do.
2121
pub fn step(&mut self) -> EvalResult<'tcx, bool> {
22-
if self.stack.is_empty() {
22+
if self.stack().is_empty() {
2323
return Ok(false);
2424
}
2525

@@ -53,7 +53,7 @@ impl<'a, 'mir, 'tcx, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M> {
5353
// *before* executing the statement.
5454
let frame_idx = self.cur_frame();
5555
self.tcx.span = stmt.source_info.span;
56-
self.memory.tcx.span = stmt.source_info.span;
56+
self.memory_mut().tcx.span = stmt.source_info.span;
5757

5858
match stmt.kind {
5959
Assign(ref place, ref rvalue) => self.eval_rvalue_into_place(rvalue, place)?,
@@ -102,16 +102,16 @@ impl<'a, 'mir, 'tcx, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M> {
102102
InlineAsm { .. } => return err!(InlineAsm),
103103
}
104104

105-
self.stack[frame_idx].stmt += 1;
105+
self.stack_mut()[frame_idx].stmt += 1;
106106
Ok(())
107107
}
108108

109109
fn terminator(&mut self, terminator: &mir::Terminator<'tcx>) -> EvalResult<'tcx> {
110110
trace!("{:?}", terminator.kind);
111111
self.tcx.span = terminator.source_info.span;
112-
self.memory.tcx.span = terminator.source_info.span;
112+
self.memory_mut().tcx.span = terminator.source_info.span;
113113
self.eval_terminator(terminator)?;
114-
if !self.stack.is_empty() {
114+
if !self.stack().is_empty() {
115115
trace!("// {:?}", self.frame().block);
116116
}
117117
Ok(())

src/librustc_mir/interpret/terminator/mod.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ impl<'a, 'mir, 'tcx, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M> {
7171
let (fn_def, sig) = match func.ty.sty {
7272
ty::TyFnPtr(sig) => {
7373
let fn_ptr = self.value_to_scalar(func)?.to_ptr()?;
74-
let instance = self.memory.get_fn(fn_ptr)?;
74+
let instance = self.memory().get_fn(fn_ptr)?;
7575
let instance_ty = instance.ty(*self.tcx);
7676
match instance_ty.sty {
7777
ty::TyFnDef(..) => {
@@ -377,14 +377,14 @@ impl<'a, 'mir, 'tcx, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M> {
377377
}
378378
// cannot use the shim here, because that will only result in infinite recursion
379379
ty::InstanceDef::Virtual(_, idx) => {
380-
let ptr_size = self.memory.pointer_size();
380+
let ptr_size = self.memory().pointer_size();
381381
let ptr_align = self.tcx.data_layout.pointer_align;
382382
let (ptr, vtable) = self.into_ptr_vtable_pair(args[0].value)?;
383-
let fn_ptr = self.memory.read_ptr_sized(
383+
let fn_ptr = self.memory().read_ptr_sized(
384384
vtable.offset(ptr_size * (idx as u64 + 3), &self)?,
385385
ptr_align
386386
)?.to_ptr()?;
387-
let instance = self.memory.get_fn(fn_ptr)?;
387+
let instance = self.memory().get_fn(fn_ptr)?;
388388
let mut args = args.to_vec();
389389
let ty = self.layout_of(args[0].ty)?.field(&self, 0)?.ty;
390390
args[0].ty = ty;

src/librustc_mir/interpret/traits.rs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -25,40 +25,40 @@ impl<'a, 'mir, 'tcx, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M> {
2525
let size = layout.size.bytes();
2626
let align = layout.align.abi();
2727

28-
let ptr_size = self.memory.pointer_size();
28+
let ptr_size = self.memory().pointer_size();
2929
let ptr_align = self.tcx.data_layout.pointer_align;
3030
let methods = self.tcx.vtable_methods(trait_ref);
31-
let vtable = self.memory.allocate(
31+
let vtable = self.memory_mut().allocate(
3232
ptr_size * (3 + methods.len() as u64),
3333
ptr_align,
3434
MemoryKind::Stack,
3535
)?;
3636

3737
let drop = ::monomorphize::resolve_drop_in_place(*self.tcx, ty);
38-
let drop = self.memory.create_fn_alloc(drop);
39-
self.memory.write_ptr_sized_unsigned(vtable, ptr_align, drop.into())?;
38+
let drop = self.memory_mut().create_fn_alloc(drop);
39+
self.memory_mut().write_ptr_sized_unsigned(vtable, ptr_align, drop.into())?;
4040

4141
let size_ptr = vtable.offset(ptr_size, &self)?;
42-
self.memory.write_ptr_sized_unsigned(size_ptr, ptr_align, Scalar::Bits {
42+
self.memory_mut().write_ptr_sized_unsigned(size_ptr, ptr_align, Scalar::Bits {
4343
bits: size as u128,
4444
defined: ptr_size.bits() as u8,
4545
})?;
4646
let align_ptr = vtable.offset(ptr_size * 2, &self)?;
47-
self.memory.write_ptr_sized_unsigned(align_ptr, ptr_align, Scalar::Bits {
47+
self.memory_mut().write_ptr_sized_unsigned(align_ptr, ptr_align, Scalar::Bits {
4848
bits: align as u128,
4949
defined: ptr_size.bits() as u8,
5050
})?;
5151

5252
for (i, method) in methods.iter().enumerate() {
5353
if let Some((def_id, substs)) = *method {
5454
let instance = self.resolve(def_id, substs)?;
55-
let fn_ptr = self.memory.create_fn_alloc(instance);
55+
let fn_ptr = self.memory_mut().create_fn_alloc(instance);
5656
let method_ptr = vtable.offset(ptr_size * (3 + i as u64), &self)?;
57-
self.memory.write_ptr_sized_unsigned(method_ptr, ptr_align, fn_ptr.into())?;
57+
self.memory_mut().write_ptr_sized_unsigned(method_ptr, ptr_align, fn_ptr.into())?;
5858
}
5959
}
6060

61-
self.memory.mark_static_initialized(
61+
self.memory_mut().mark_static_initialized(
6262
vtable.alloc_id,
6363
Mutability::Immutable,
6464
)?;
@@ -76,7 +76,7 @@ impl<'a, 'mir, 'tcx, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M> {
7676
match self.read_ptr(vtable, pointer_align, self.tcx.mk_nil_ptr())? {
7777
// some values don't need to call a drop impl, so the value is null
7878
Value::Scalar(Scalar::Bits { bits: 0, defined} ) if defined == pointer_size => Ok(None),
79-
Value::Scalar(Scalar::Ptr(drop_fn)) => self.memory.get_fn(drop_fn).map(Some),
79+
Value::Scalar(Scalar::Ptr(drop_fn)) => self.memory().get_fn(drop_fn).map(Some),
8080
_ => err!(ReadBytesAsPointer),
8181
}
8282
}
@@ -85,10 +85,10 @@ impl<'a, 'mir, 'tcx, M: Machine<'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M> {
8585
&self,
8686
vtable: Pointer,
8787
) -> EvalResult<'tcx, (Size, Align)> {
88-
let pointer_size = self.memory.pointer_size();
88+
let pointer_size = self.memory().pointer_size();
8989
let pointer_align = self.tcx.data_layout.pointer_align;
90-
let size = self.memory.read_ptr_sized(vtable.offset(pointer_size, self)?, pointer_align)?.to_bits(pointer_size)? as u64;
91-
let align = self.memory.read_ptr_sized(
90+
let size = self.memory().read_ptr_sized(vtable.offset(pointer_size, self)?, pointer_align)?.to_bits(pointer_size)? as u64;
91+
let align = self.memory().read_ptr_sized(
9292
vtable.offset(pointer_size * 2, self)?,
9393
pointer_align
9494
)?.to_bits(pointer_size)? as u64;

0 commit comments

Comments
 (0)