Skip to content

Commit fac9d22

Browse files
committed
Auto merge of #1349 - RalfJung:machine-layouts, r=RalfJung
use pre-computed layouts some more
2 parents d1ae77f + 14f50b3 commit fac9d22

File tree

6 files changed

+27
-21
lines changed

6 files changed

+27
-21
lines changed

src/eval.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ pub fn create_ecx<'mir, 'tcx: 'mir>(
130130
// Store `argc` and `argv` for macOS `_NSGetArg{c,v}`.
131131
{
132132
let argc_place =
133-
ecx.allocate(ecx.layout_of(tcx.types.isize)?, MiriMemoryKind::Machine.into());
133+
ecx.allocate(ecx.machine.layouts.isize, MiriMemoryKind::Machine.into());
134134
ecx.write_scalar(argc, argc_place.into())?;
135135
ecx.machine.argc = Some(argc_place.ptr);
136136

@@ -168,7 +168,7 @@ pub fn create_ecx<'mir, 'tcx: 'mir>(
168168
};
169169

170170
// Return place (in static memory so that it does not count as leak).
171-
let ret_place = ecx.allocate(ecx.layout_of(tcx.types.isize)?, MiriMemoryKind::Machine.into());
171+
let ret_place = ecx.allocate(ecx.machine.layouts.isize, MiriMemoryKind::Machine.into());
172172
// Call start function.
173173
ecx.call_function(
174174
start_instance,
@@ -178,7 +178,7 @@ pub fn create_ecx<'mir, 'tcx: 'mir>(
178178
)?;
179179

180180
// Set the last_error to 0
181-
let errno_layout = ecx.layout_of(tcx.types.u32)?;
181+
let errno_layout = ecx.machine.layouts.u32;
182182
let errno_place = ecx.allocate(errno_layout, MiriMemoryKind::Machine.into());
183183
ecx.write_scalar(Scalar::from_u32(0), errno_place.into())?;
184184
ecx.machine.last_error = Some(errno_place);

src/machine.rs

+15-7
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ impl MemoryExtra {
168168
"linux" => {
169169
// "__cxa_thread_atexit_impl"
170170
// This should be all-zero, pointer-sized.
171-
let layout = this.layout_of(this.tcx.types.usize)?;
171+
let layout = this.machine.layouts.usize;
172172
let place = this.allocate(layout, MiriMemoryKind::Machine.into());
173173
this.write_scalar(Scalar::from_machine_usize(0, this), place.into())?;
174174
Self::add_extern_static(this, "__cxa_thread_atexit_impl", place.ptr);
@@ -178,7 +178,7 @@ impl MemoryExtra {
178178
"windows" => {
179179
// "_tls_used"
180180
// This is some obscure hack that is part of the Windows TLS story. It's a `u8`.
181-
let layout = this.layout_of(this.tcx.types.u8)?;
181+
let layout = this.machine.layouts.u8;
182182
let place = this.allocate(layout, MiriMemoryKind::Machine.into());
183183
this.write_scalar(Scalar::from_u8(0), place.into())?;
184184
Self::add_extern_static(this, "_tls_used", place.ptr);
@@ -190,16 +190,26 @@ impl MemoryExtra {
190190
}
191191

192192
/// Precomputed layouts of primitive types
193-
pub(crate) struct PrimitiveLayouts<'tcx> {
194-
pub(crate) i32: TyAndLayout<'tcx>,
195-
pub(crate) u32: TyAndLayout<'tcx>,
193+
pub struct PrimitiveLayouts<'tcx> {
194+
pub unit: TyAndLayout<'tcx>,
195+
pub i8: TyAndLayout<'tcx>,
196+
pub i32: TyAndLayout<'tcx>,
197+
pub isize: TyAndLayout<'tcx>,
198+
pub u8: TyAndLayout<'tcx>,
199+
pub u32: TyAndLayout<'tcx>,
200+
pub usize: TyAndLayout<'tcx>,
196201
}
197202

198203
impl<'mir, 'tcx: 'mir> PrimitiveLayouts<'tcx> {
199204
fn new(layout_cx: LayoutCx<'tcx, TyCtxt<'tcx>>) -> Result<Self, LayoutError<'tcx>> {
200205
Ok(Self {
206+
unit: layout_cx.layout_of(layout_cx.tcx.mk_unit())?,
207+
i8: layout_cx.layout_of(layout_cx.tcx.types.i8)?,
201208
i32: layout_cx.layout_of(layout_cx.tcx.types.i32)?,
209+
isize: layout_cx.layout_of(layout_cx.tcx.types.isize)?,
210+
u8: layout_cx.layout_of(layout_cx.tcx.types.u8)?,
202211
u32: layout_cx.layout_of(layout_cx.tcx.types.u32)?,
212+
usize: layout_cx.layout_of(layout_cx.tcx.types.usize)?,
203213
})
204214
}
205215
}
@@ -242,8 +252,6 @@ pub struct Evaluator<'tcx> {
242252
pub(crate) time_anchor: Instant,
243253

244254
/// Precomputed `TyLayout`s for primitive data types that are commonly used inside Miri.
245-
/// FIXME: Search through the rest of the codebase for more layout_of() calls that
246-
/// could be stored here.
247255
pub(crate) layouts: PrimitiveLayouts<'tcx>,
248256
}
249257

src/shims/env.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -384,7 +384,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
384384
} else {
385385
// No `environ` allocated yet, let's do that.
386386
// This is memory backing an extern static, hence `Machine`, not `Env`.
387-
let layout = this.layout_of(this.tcx.types.usize)?;
387+
let layout = this.machine.layouts.usize;
388388
let place = this.allocate(layout, MiriMemoryKind::Machine.into());
389389
this.machine.env_vars.environ = Some(place);
390390
}

src/shims/panic.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
use log::trace;
1515

1616
use rustc_middle::{mir, ty};
17-
use rustc_target::{spec::PanicStrategy, abi::LayoutOf};
17+
use rustc_target::spec::PanicStrategy;
1818

1919
use crate::*;
2020

@@ -93,7 +93,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
9393
// Now we make a function call, and pass `data` as first and only argument.
9494
let f_instance = this.memory.get_fn(try_fn)?.as_instance()?;
9595
trace!("try_fn: {:?}", f_instance);
96-
let ret_place = MPlaceTy::dangling(this.layout_of(this.tcx.mk_unit())?, this).into();
96+
let ret_place = MPlaceTy::dangling(this.machine.layouts.unit, this).into();
9797
this.call_function(
9898
f_instance,
9999
&[data.into()],
@@ -144,7 +144,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
144144
// Push the `catch_fn` stackframe.
145145
let f_instance = this.memory.get_fn(catch_unwind.catch_fn)?.as_instance()?;
146146
trace!("catch_fn: {:?}", f_instance);
147-
let ret_place = MPlaceTy::dangling(this.layout_of(this.tcx.mk_unit())?, this).into();
147+
let ret_place = MPlaceTy::dangling(this.machine.layouts.unit, this).into();
148148
this.call_function(
149149
f_instance,
150150
&[catch_unwind.data.into(), payload.into()],

src/shims/time.rs

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
use std::time::{Duration, SystemTime, Instant};
22
use std::convert::TryFrom;
33

4-
use rustc_target::abi::LayoutOf;
5-
64
use crate::stacked_borrows::Tag;
75
use crate::*;
86
use helpers::{immty_from_int_checked, immty_from_uint_checked};
@@ -107,7 +105,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
107105

108106
let dwLowDateTime = u32::try_from(duration_ticks & 0x00000000FFFFFFFF).unwrap();
109107
let dwHighDateTime = u32::try_from((duration_ticks & 0xFFFFFFFF00000000) >> 32).unwrap();
110-
let DWORD_tylayout = this.layout_of(this.tcx.types.u32)?;
108+
let DWORD_tylayout = this.machine.layouts.u32;
111109
let imms = [
112110
immty_from_uint_checked(dwLowDateTime, DWORD_tylayout)?,
113111
immty_from_uint_checked(dwHighDateTime, DWORD_tylayout)?,

src/shims/tls.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use std::collections::BTreeMap;
55
use log::trace;
66

77
use rustc_middle::ty;
8-
use rustc_target::abi::{LayoutOf, Size, HasDataLayout};
8+
use rustc_target::abi::{Size, HasDataLayout};
99

1010
use crate::{HelpersEvalContextExt, InterpResult, MPlaceTy, Scalar, StackPopCleanup, Tag};
1111

@@ -172,7 +172,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
172172

173173
// The signature of this function is `unsafe extern "system" fn(h: c::LPVOID, dwReason: c::DWORD, pv: c::LPVOID)`.
174174
let reason = this.eval_path_scalar(&["std", "sys", "windows", "c", "DLL_PROCESS_DETACH"])?;
175-
let ret_place = MPlaceTy::dangling(this.layout_of(this.tcx.mk_unit())?, this).into();
175+
let ret_place = MPlaceTy::dangling(this.machine.layouts.unit, this).into();
176176
this.call_function(
177177
thread_callback,
178178
&[Scalar::null_ptr(this).into(), reason.into(), Scalar::null_ptr(this).into()],
@@ -191,7 +191,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
191191
if let Some((instance, data)) = this.machine.tls.global_dtor {
192192
trace!("Running global dtor {:?} on {:?}", instance, data);
193193

194-
let ret_place = MPlaceTy::dangling(this.layout_of(this.tcx.mk_unit())?, this).into();
194+
let ret_place = MPlaceTy::dangling(this.machine.layouts.unit, this).into();
195195
this.call_function(
196196
instance,
197197
&[data.into()],
@@ -209,7 +209,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
209209
trace!("Running TLS dtor {:?} on {:?}", instance, ptr);
210210
assert!(!this.is_null(ptr).unwrap(), "data can't be NULL when dtor is called!");
211211

212-
let ret_place = MPlaceTy::dangling(this.layout_of(this.tcx.mk_unit())?, this).into();
212+
let ret_place = MPlaceTy::dangling(this.machine.layouts.unit, this).into();
213213
this.call_function(
214214
instance,
215215
&[ptr.into()],

0 commit comments

Comments
 (0)