InterpResult, InterpError, InterpCx, StackPopCleanup, struct_error,
Scalar, Tag, Pointer, FnVal,
MemoryExtra, MiriMemoryKind, Evaluator, TlsEvalContextExt, HelpersEvalContextExt,
+ ShimsEnvVars,
};
-use crate::shims::env::EnvVars;
/// Configuration needed to spawn a Miri instance.
#[derive(Clone)]
MemoryExtra::new(StdRng::seed_from_u64(config.seed.unwrap_or(0)), config.validate),
);
+ ShimsEnvVars::init(config.communicate, &mut ecx, &tcx);
+
let main_instance = ty::Instance::mono(ecx.tcx.tcx, main_id);
let main_mir = ecx.load_mir(main_instance.def)?;
assert!(args.next().is_none(), "start lang item has more arguments than expected");
- if config.communicate {
- EnvVars::init(&mut ecx, &tcx);
- }
-
Ok(ecx)
}
pub use crate::shims::intrinsics::EvalContextExt as IntrinsicsEvalContextExt;
pub use crate::shims::tls::{EvalContextExt as TlsEvalContextExt, TlsData};
pub use crate::shims::dlsym::{Dlsym, EvalContextExt as DlsymEvalContextExt};
+pub use crate::shims::env::{EnvVars as ShimsEnvVars};
pub use crate::operator::EvalContextExt as OperatorEvalContextExt;
pub use crate::range_map::RangeMap;
pub use crate::helpers::{EvalContextExt as HelpersEvalContextExt};
use rustc::mir;
use crate::*;
-use crate::shims::env::EnvVars;
// Some global facts about the emulated machine.
pub const PAGE_SIZE: u64 = 4*1024; // FIXME: adjust to target architecture
pub struct Evaluator<'tcx> {
/// Environment variables set by `setenv`.
/// Miri does not expose env vars from the host to the emulated program.
- pub(crate) env_vars: EnvVars,
+ pub(crate) env_vars: ShimsEnvVars,
/// Program arguments (`Option` because we can only initialize them after creating the ecx).
/// These are *pointers* to argc/argv because macOS.
impl<'tcx> Evaluator<'tcx> {
pub(crate) fn new(communicate: bool) -> Self {
Evaluator {
- env_vars: EnvVars::default(),
+ // `env_vars` could be initialized properly here if `Memory` were available before
+ // calling this method.
+ env_vars: ShimsEnvVars::default(),
argc: None,
argv: None,
cmd_line: None,
impl EnvVars {
pub(crate) fn init<'mir, 'tcx>(
+ communicate: bool,
ecx: &mut InterpCx<'mir, 'tcx, Evaluator<'tcx>>,
tcx: &TyCtxt<'tcx>,
) {
- for (name, value) in std::env::vars() {
- let value = alloc_env_value(value.as_bytes(), ecx.memory_mut(), tcx);
- ecx.machine.env_vars.map.insert(name.into_bytes(), value);
+ if communicate {
+ for (name, value) in std::env::vars() {
+ let value = alloc_env_value(value.as_bytes(), ecx.memory_mut(), tcx);
+ ecx.machine.env_vars.map.insert(name.into_bytes(), value);
+ }
}
}