measureme::Profiler::new(out).expect("Couldn't create `measureme` profiler")
});
let rng = StdRng::seed_from_u64(config.seed.unwrap_or(0));
- let stacked_borrows = if config.stacked_borrows {
- Some(RefCell::new(stacked_borrows::GlobalStateInner::new(
+ let stacked_borrows = config.stacked_borrows.then(|| {
+ RefCell::new(stacked_borrows::GlobalStateInner::new(
config.tracked_pointer_tags.clone(),
config.tracked_call_ids.clone(),
config.retag_fields,
- )))
- } else {
- None
- };
- let data_race =
- if config.data_race_detector { Some(data_race::GlobalState::new()) } else { None };
+ ))
+ });
+ let data_race = config.data_race_detector.then(|| data_race::GlobalState::new(config));
Evaluator {
stacked_borrows,
data_race,
) -> InterpResult<'tcx, Pointer<Provenance>> {
let link_name = ecx.item_link_name(def_id);
if let Some(&ptr) = ecx.machine.extern_statics.get(&link_name) {
+ // Various parts of the engine rely on `get_alloc_info` for size and alignment
+ // information. That uses the type information of this static.
+ // Make sure it matches the Miri allocation for this.
+ let Provenance::Concrete { alloc_id, .. } = ptr.provenance else {
+ panic!("extern_statics cannot contain wildcards")
+ };
+ let (shim_size, shim_align, _kind) = ecx.get_alloc_info(alloc_id);
+ let extern_decl_layout =
+ ecx.tcx.layout_of(ty::ParamEnv::empty().and(ecx.tcx.type_of(def_id))).unwrap();
+ if extern_decl_layout.size != shim_size || extern_decl_layout.align.abi != shim_align {
+ throw_unsup_format!(
+ "`extern` static `{name}` from crate `{krate}` has been declared \
+ with a size of {decl_size} bytes and alignment of {decl_align} bytes, \
+ but Miri emulates it via an extern static shim \
+ with a size of {shim_size} bytes and alignment of {shim_align} bytes",
+ name = ecx.tcx.def_path_str(def_id),
+ krate = ecx.tcx.crate_name(def_id.krate),
+ decl_size = extern_decl_layout.size.bytes(),
+ decl_align = extern_decl_layout.align.abi.bytes(),
+ shim_size = shim_size.bytes(),
+ shim_align = shim_align.bytes(),
+ )
+ }
Ok(ptr)
} else {
throw_unsup_format!(
- "`extern` static `{}` from crate `{}` is not supported by Miri",
- ecx.tcx.def_path_str(def_id),
- ecx.tcx.crate_name(def_id.krate),
+ "`extern` static `{name}` from crate `{krate}` is not supported by Miri",
+ name = ecx.tcx.def_path_str(def_id),
+ krate = ecx.tcx.crate_name(def_id.krate),
)
}
}
}
let alloc = alloc.into_owned();
- let stacks = if let Some(stacked_borrows) = &ecx.machine.stacked_borrows {
- Some(Stacks::new_allocation(
+ let stacks = ecx.machine.stacked_borrows.as_ref().map(|stacked_borrows| {
+ Stacks::new_allocation(
id,
alloc.size(),
stacked_borrows,
kind,
ecx.machine.current_span(),
- ))
- } else {
- None
- };
- let race_alloc = if let Some(data_race) = &ecx.machine.data_race {
- Some(data_race::AllocExtra::new_allocation(
+ )
+ });
+ let race_alloc = ecx.machine.data_race.as_ref().map(|data_race| {
+ data_race::AllocExtra::new_allocation(
data_race,
&ecx.machine.threads,
alloc.size(),
kind,
- ))
- } else {
- None
- };
- let buffer_alloc = if ecx.machine.weak_memory {
- Some(weak_memory::AllocExtra::new_allocation())
- } else {
- None
- };
+ )
+ });
+ let buffer_alloc = ecx.machine.weak_memory.then(weak_memory::AllocExtra::new_allocation);
let alloc: Allocation<Provenance, Self::AllocExtra> = alloc.adjust_from_tcx(
&ecx.tcx,
AllocExtra {
if cfg!(debug_assertions) {
// The machine promises to never call us on thread-local or extern statics.
let alloc_id = ptr.provenance;
- match ecx.tcx.get_global_alloc(alloc_id) {
+ match ecx.tcx.try_get_global_alloc(alloc_id) {
Some(GlobalAlloc::Static(def_id)) if ecx.tcx.is_thread_local_static(def_id) => {
panic!("adjust_alloc_base_pointer called on thread-local static")
}
ptr: Pointer<Self::Provenance>,
) -> InterpResult<'tcx> {
match ptr.provenance {
- Provenance::Concrete { alloc_id, sb } => {
- intptrcast::GlobalStateInner::expose_ptr(ecx, alloc_id, sb);
- }
+ Provenance::Concrete { alloc_id, sb } =>
+ intptrcast::GlobalStateInner::expose_ptr(ecx, alloc_id, sb),
Provenance::Wildcard => {
// No need to do anything for wildcard pointers as
// their provenances have already been previously exposed.
+ Ok(())
}
}
- Ok(())
}
/// Convert a pointer with provenance into an allocation-offset pair,