const GLOBAL_KIND: Option<!> = None; // no copying of globals from `tcx` to machine memory
- // We do not check for alignment to avoid having to carry an `Align`
- // in `ConstValue::ByRef`.
- const CHECK_ALIGN: bool = false;
+ #[inline(always)]
+ fn enforce_alignment(_memory_extra: &Self::MemoryExtra) -> bool {
+ // We do not check for alignment to avoid having to carry an `Align`
+ // in `ConstValue::ByRef`.
+ false
+ }
#[inline(always)]
fn enforce_validity(_ecx: &InterpCx<'mir, 'tcx, Self>) -> bool {
const GLOBAL_KIND: Option<Self::MemoryKind>;
/// Whether memory accesses should be alignment-checked.
- const CHECK_ALIGN: bool;
+ fn enforce_alignment(memory_extra: &Self::MemoryExtra) -> bool;
/// Whether to enforce the validity invariant
fn enforce_validity(ecx: &InterpCx<'mir, 'tcx, Self>) -> bool;
size: Size,
align: Align,
) -> InterpResult<'tcx, Option<Pointer<M::PointerTag>>> {
- let align = M::CHECK_ALIGN.then_some(align);
+ let align = M::enforce_alignment(&self.extra).then_some(align);
self.check_ptr_access_align(sptr, size, align, CheckInAllocMsg::MemoryAccessTest)
}
/// Like `check_ptr_access`, but *definitely* checks alignment when `align`
- /// is `Some` (overriding `M::CHECK_ALIGN`). Also lets the caller control
+ /// is `Some` (overriding `M::enforce_alignment`). Also lets the caller control
/// the error message for the out-of-bounds case.
pub fn check_ptr_access_align(
&self,
const GLOBAL_KIND: Option<!> = None; // no copying of globals from `tcx` to machine memory
- const CHECK_ALIGN: bool = false;
+ #[inline(always)]
+ fn enforce_alignment(_memory_extra: &Self::MemoryExtra) -> bool {
+ false
+ }
#[inline(always)]
fn enforce_validity(_ecx: &InterpCx<'mir, 'tcx, Self>) -> bool {