diff --git a/src/eval.rs b/src/eval.rs
index 46e66bc0a81e..c3510188e3cb 100644
--- a/src/eval.rs
+++ b/src/eval.rs
@@ -1,14 +1,14 @@
//! Main evaluator loop and setting up the initial stack frame.
-use std::ffi::OsStr;
use std::convert::TryFrom;
+use std::ffi::OsStr;
use rand::rngs::StdRng;
use rand::SeedableRng;
-use rustc_target::abi::LayoutOf;
-use rustc_middle::ty::{self, TyCtxt};
use rustc_hir::def_id::DefId;
+use rustc_middle::ty::{self, layout::LayoutCx, TyCtxt};
+use rustc_target::abi::LayoutOf;
use crate::*;
@@ -60,10 +60,13 @@ pub fn create_ecx<'mir, 'tcx: 'mir>(
main_id: DefId,
config: MiriConfig,
) -> InterpResult<'tcx, (InterpCx<'mir, 'tcx, Evaluator<'tcx>>, MPlaceTy<'tcx, Tag>)> {
+ let tcx_at = tcx.at(rustc_span::source_map::DUMMY_SP);
+ let param_env = ty::ParamEnv::reveal_all();
+ let layout_cx = LayoutCx { tcx, param_env };
let mut ecx = InterpCx::new(
- tcx.at(rustc_span::source_map::DUMMY_SP),
- ty::ParamEnv::reveal_all(),
- Evaluator::new(config.communicate, config.validate),
+ tcx_at,
+ param_env,
+ Evaluator::new(config.communicate, config.validate, layout_cx),
MemoryExtra::new(
StdRng::seed_from_u64(config.seed.unwrap_or(0)),
config.stacked_borrows,
diff --git a/src/lib.rs b/src/lib.rs
index 82ac2e8d2188..2f381b4a3454 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -51,9 +51,8 @@ pub use crate::diagnostics::{
pub use crate::eval::{create_ecx, eval_main, MiriConfig};
pub use crate::helpers::EvalContextExt as HelpersEvalContextExt;
pub use crate::machine::{
- AllocExtra, EvalContextExt as MachineEvalContextExt, Evaluator, FrameData, MemoryExtra,
- MiriEvalContext, MiriEvalContextExt, MiriMemoryKind, NUM_CPUS, PAGE_SIZE, STACK_ADDR,
- STACK_SIZE,
+ AllocExtra, Evaluator, FrameData, MemoryExtra, MiriEvalContext, MiriEvalContextExt,
+ MiriMemoryKind, NUM_CPUS, PAGE_SIZE, STACK_ADDR, STACK_SIZE,
};
pub use crate::mono_hash_map::MonoHashMap;
pub use crate::operator::EvalContextExt as OperatorEvalContextExt;
diff --git a/src/machine.rs b/src/machine.rs
index bfb832085e0b..26ff23511f73 100644
--- a/src/machine.rs
+++ b/src/machine.rs
@@ -10,11 +10,18 @@ use std::time::Instant;
use log::trace;
use rand::rngs::StdRng;
-use rustc_data_structures::fx::FxHashMap;
-use rustc_middle::{mir, ty::{self, layout::TyAndLayout}};
-use rustc_target::abi::{LayoutOf, Size};
use rustc_ast::attr;
+use rustc_data_structures::fx::FxHashMap;
+use rustc_middle::{
+ mir,
+ ty::{
+ self,
+ layout::{LayoutCx, LayoutError, TyAndLayout},
+ TyCtxt,
+ },
+};
use rustc_span::symbol::{sym, Symbol};
+use rustc_target::abi::{LayoutOf, Size};
use crate::*;
@@ -146,36 +153,18 @@ impl MemoryExtra {
}
}
-/// Cached layouts of primitive types
-#[derive(Default)]
-struct PrimitiveLayouts<'tcx> {
- i32: RefCell