Struct rustc_mir::const_eval::machine::CompileTimeInterpreter [−][src]
Extra machine state for CTFE, and the Machine instance
Fields
steps_remaining: usizeFor now, the number of terminators that can be evaluated before we throw a resource exhuastion error.
Setting this to 0 disables the limit and allows the interpreter to run forever.
stack: Vec<Frame<'mir, 'tcx, (), ()>>The virtual call stack.
Implementations
impl<'mir, 'tcx> CompileTimeInterpreter<'mir, 'tcx>[src]
Trait Implementations
impl<'mir, 'tcx> Machine<'mir, 'tcx> for CompileTimeInterpreter<'mir, 'tcx>[src]
type PointerTag = ()
Tag tracked alongside every pointer. This is used to implement “Stacked Borrows”
https://www.ralfj.de/blog/2018/08/07/stacked-borrows.html.
The default() is used for pointers to consts, statics, vtables and functions.
The Debug formatting is used for displaying pointers; we cannot use Display
as () does not implement that, but it should be “nice” output. Read more
type ExtraFnVal = !
Machines can define extra (non-instance) things that represent values of function pointers.
For example, Miri uses this to return a function pointer from dlsym
that can later be called to execute the right thing. Read more
type MemoryMap = FxHashMap<AllocId, (MemoryKind<Self::MemoryKind>, Allocation)>
Memory’s allocation map
const GLOBAL_KIND: Option<Self::MemoryKind>[src]
type AllocExtra = ()
Extra data stored in every allocation.
type FrameExtra = ()
Extra data stored in every call frame.
fn enforce_alignment(_memory_extra: &Self::MemoryExtra) -> bool[src]
fn force_int_for_alignment_check(_memory_extra: &Self::MemoryExtra) -> bool[src]
fn enforce_validity(_ecx: &InterpCx<'mir, 'tcx, Self>) -> bool[src]
fn call_extra_fn(
_ecx: &mut InterpCx<'mir, 'tcx, Self>,
fn_val: !,
_abi: Abi,
_args: &[OpTy<'tcx>],
_ret: Option<(&PlaceTy<'tcx>, BasicBlock)>,
_unwind: Option<BasicBlock>
) -> InterpResult<'tcx>[src]
_ecx: &mut InterpCx<'mir, 'tcx, Self>,
fn_val: !,
_abi: Abi,
_args: &[OpTy<'tcx>],
_ret: Option<(&PlaceTy<'tcx>, BasicBlock)>,
_unwind: Option<BasicBlock>
) -> InterpResult<'tcx>
fn init_allocation_extra<'b>(
_memory_extra: &Self::MemoryExtra,
_id: AllocId,
alloc: Cow<'b, Allocation>,
_kind: Option<MemoryKind<Self::MemoryKind>>
) -> (Cow<'b, Allocation<Self::PointerTag>>, Self::PointerTag)[src]
_memory_extra: &Self::MemoryExtra,
_id: AllocId,
alloc: Cow<'b, Allocation>,
_kind: Option<MemoryKind<Self::MemoryKind>>
) -> (Cow<'b, Allocation<Self::PointerTag>>, Self::PointerTag)
fn tag_global_base_pointer(
_memory_extra: &Self::MemoryExtra,
_id: AllocId
) -> Self::PointerTag[src]
_memory_extra: &Self::MemoryExtra,
_id: AllocId
) -> Self::PointerTag
type MemoryKind = MemoryKind
Additional memory kinds a machine wishes to distinguish from the builtin ones
type MemoryExtra = MemoryExtra
Extra data stored in memory. A reference to this is available when AllocExtra
gets initialized, so you can e.g., have an Rc here if there is global state you
need access to in the AllocExtra hooks. Read more
fn load_mir(
ecx: &InterpCx<'mir, 'tcx, Self>,
instance: InstanceDef<'tcx>
) -> InterpResult<'tcx, &'tcx Body<'tcx>>[src]
ecx: &InterpCx<'mir, 'tcx, Self>,
instance: InstanceDef<'tcx>
) -> InterpResult<'tcx, &'tcx Body<'tcx>>
fn find_mir_or_eval_fn(
ecx: &mut InterpCx<'mir, 'tcx, Self>,
instance: Instance<'tcx>,
_abi: Abi,
args: &[OpTy<'tcx>],
_ret: Option<(&PlaceTy<'tcx>, BasicBlock)>,
_unwind: Option<BasicBlock>
) -> InterpResult<'tcx, Option<&'mir Body<'tcx>>>[src]
ecx: &mut InterpCx<'mir, 'tcx, Self>,
instance: Instance<'tcx>,
_abi: Abi,
args: &[OpTy<'tcx>],
_ret: Option<(&PlaceTy<'tcx>, BasicBlock)>,
_unwind: Option<BasicBlock>
) -> InterpResult<'tcx, Option<&'mir Body<'tcx>>>
fn call_intrinsic(
ecx: &mut InterpCx<'mir, 'tcx, Self>,
instance: Instance<'tcx>,
args: &[OpTy<'tcx>],
ret: Option<(&PlaceTy<'tcx>, BasicBlock)>,
_unwind: Option<BasicBlock>
) -> InterpResult<'tcx>[src]
ecx: &mut InterpCx<'mir, 'tcx, Self>,
instance: Instance<'tcx>,
args: &[OpTy<'tcx>],
ret: Option<(&PlaceTy<'tcx>, BasicBlock)>,
_unwind: Option<BasicBlock>
) -> InterpResult<'tcx>
fn assert_panic(
ecx: &mut InterpCx<'mir, 'tcx, Self>,
msg: &AssertMessage<'tcx>,
_unwind: Option<BasicBlock>
) -> InterpResult<'tcx>[src]
ecx: &mut InterpCx<'mir, 'tcx, Self>,
msg: &AssertMessage<'tcx>,
_unwind: Option<BasicBlock>
) -> InterpResult<'tcx>
fn abort(
_ecx: &mut InterpCx<'mir, 'tcx, Self>,
msg: String
) -> InterpResult<'tcx, !>[src]
_ecx: &mut InterpCx<'mir, 'tcx, Self>,
msg: String
) -> InterpResult<'tcx, !>
fn ptr_to_int(
_mem: &Memory<'mir, 'tcx, Self>,
_ptr: Pointer
) -> InterpResult<'tcx, u64>[src]
_mem: &Memory<'mir, 'tcx, Self>,
_ptr: Pointer
) -> InterpResult<'tcx, u64>
fn binary_ptr_op(
_ecx: &InterpCx<'mir, 'tcx, Self>,
_bin_op: BinOp,
_left: &ImmTy<'tcx>,
_right: &ImmTy<'tcx>
) -> InterpResult<'tcx, (Scalar, bool, Ty<'tcx>)>[src]
_ecx: &InterpCx<'mir, 'tcx, Self>,
_bin_op: BinOp,
_left: &ImmTy<'tcx>,
_right: &ImmTy<'tcx>
) -> InterpResult<'tcx, (Scalar, bool, Ty<'tcx>)>
fn box_alloc(
_ecx: &mut InterpCx<'mir, 'tcx, Self>,
_dest: &PlaceTy<'tcx>
) -> InterpResult<'tcx>[src]
_ecx: &mut InterpCx<'mir, 'tcx, Self>,
_dest: &PlaceTy<'tcx>
) -> InterpResult<'tcx>
fn before_terminator(ecx: &mut InterpCx<'mir, 'tcx, Self>) -> InterpResult<'tcx>[src]
fn init_frame_extra(
ecx: &mut InterpCx<'mir, 'tcx, Self>,
frame: Frame<'mir, 'tcx>
) -> InterpResult<'tcx, Frame<'mir, 'tcx>>[src]
ecx: &mut InterpCx<'mir, 'tcx, Self>,
frame: Frame<'mir, 'tcx>
) -> InterpResult<'tcx, Frame<'mir, 'tcx>>
fn stack<'a>(
ecx: &'a InterpCx<'mir, 'tcx, Self>
) -> &'a [Frame<'mir, 'tcx, Self::PointerTag, Self::FrameExtra>][src]
ecx: &'a InterpCx<'mir, 'tcx, Self>
) -> &'a [Frame<'mir, 'tcx, Self::PointerTag, Self::FrameExtra>]
fn stack_mut<'a>(
ecx: &'a mut InterpCx<'mir, 'tcx, Self>
) -> &'a mut Vec<Frame<'mir, 'tcx, Self::PointerTag, Self::FrameExtra>>[src]
ecx: &'a mut InterpCx<'mir, 'tcx, Self>
) -> &'a mut Vec<Frame<'mir, 'tcx, Self::PointerTag, Self::FrameExtra>>
fn before_access_global(
memory_extra: &MemoryExtra,
alloc_id: AllocId,
allocation: &Allocation,
static_def_id: Option<DefId>,
is_write: bool
) -> InterpResult<'tcx>[src]
memory_extra: &MemoryExtra,
alloc_id: AllocId,
allocation: &Allocation,
static_def_id: Option<DefId>,
is_write: bool
) -> InterpResult<'tcx>
fn access_local(
_ecx: &InterpCx<'mir, 'tcx, Self>,
frame: &Frame<'mir, 'tcx, Self::PointerTag, Self::FrameExtra>,
local: Local
) -> InterpResult<'tcx, Operand<Self::PointerTag>>[src]
_ecx: &InterpCx<'mir, 'tcx, Self>,
frame: &Frame<'mir, 'tcx, Self::PointerTag, Self::FrameExtra>,
local: Local
) -> InterpResult<'tcx, Operand<Self::PointerTag>>
fn access_local_mut<'a>(
ecx: &'a mut InterpCx<'mir, 'tcx, Self>,
frame: usize,
local: Local
) -> InterpResult<'tcx, Result<&'a mut LocalValue<Self::PointerTag>, MemPlace<Self::PointerTag>>> where
'tcx: 'mir, [src]
ecx: &'a mut InterpCx<'mir, 'tcx, Self>,
frame: usize,
local: Local
) -> InterpResult<'tcx, Result<&'a mut LocalValue<Self::PointerTag>, MemPlace<Self::PointerTag>>> where
'tcx: 'mir,
fn thread_local_static_alloc_id(
_ecx: &mut InterpCx<'mir, 'tcx, Self>,
def_id: DefId
) -> InterpResult<'tcx, AllocId>[src]
_ecx: &mut InterpCx<'mir, 'tcx, Self>,
def_id: DefId
) -> InterpResult<'tcx, AllocId>
fn extern_static_alloc_id(
mem: &Memory<'mir, 'tcx, Self>,
def_id: DefId
) -> InterpResult<'tcx, AllocId>[src]
mem: &Memory<'mir, 'tcx, Self>,
def_id: DefId
) -> InterpResult<'tcx, AllocId>
fn before_deallocation(
_memory_extra: &mut Self::MemoryExtra,
_id: AllocId
) -> InterpResult<'tcx>[src]
_memory_extra: &mut Self::MemoryExtra,
_id: AllocId
) -> InterpResult<'tcx>
fn after_static_mem_initialized(
_ecx: &mut InterpCx<'mir, 'tcx, Self>,
_ptr: Pointer<Self::PointerTag>,
_size: Size
) -> InterpResult<'tcx>[src]
_ecx: &mut InterpCx<'mir, 'tcx, Self>,
_ptr: Pointer<Self::PointerTag>,
_size: Size
) -> InterpResult<'tcx>
fn retag(
_ecx: &mut InterpCx<'mir, 'tcx, Self>,
_kind: RetagKind,
_place: &PlaceTy<'tcx, Self::PointerTag>
) -> InterpResult<'tcx>[src]
_ecx: &mut InterpCx<'mir, 'tcx, Self>,
_kind: RetagKind,
_place: &PlaceTy<'tcx, Self::PointerTag>
) -> InterpResult<'tcx>
fn after_stack_push(_ecx: &mut InterpCx<'mir, 'tcx, Self>) -> InterpResult<'tcx>[src]
fn after_stack_pop(
_ecx: &mut InterpCx<'mir, 'tcx, Self>,
_frame: Frame<'mir, 'tcx, Self::PointerTag, Self::FrameExtra>,
_unwinding: bool
) -> InterpResult<'tcx, StackPopJump>[src]
_ecx: &mut InterpCx<'mir, 'tcx, Self>,
_frame: Frame<'mir, 'tcx, Self::PointerTag, Self::FrameExtra>,
_unwinding: bool
) -> InterpResult<'tcx, StackPopJump>
fn int_to_ptr(
_mem: &Memory<'mir, 'tcx, Self>,
int: u64
) -> InterpResult<'tcx, Pointer<Self::PointerTag>>[src]
_mem: &Memory<'mir, 'tcx, Self>,
int: u64
) -> InterpResult<'tcx, Pointer<Self::PointerTag>>
Auto Trait Implementations
impl<'mir, 'tcx> !RefUnwindSafe for CompileTimeInterpreter<'mir, 'tcx>
impl<'mir, 'tcx> !Send for CompileTimeInterpreter<'mir, 'tcx>
impl<'mir, 'tcx> !Sync for CompileTimeInterpreter<'mir, 'tcx>
impl<'mir, 'tcx> Unpin for CompileTimeInterpreter<'mir, 'tcx> where
'tcx: 'mir,
'tcx: 'mir,
impl<'mir, 'tcx> !UnwindSafe for CompileTimeInterpreter<'mir, 'tcx>
Blanket Implementations
impl<T> Any for T where
T: 'static + ?Sized, [src]
T: 'static + ?Sized,
impl<T> Borrow<T> for T where
T: ?Sized, [src]
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized, [src]
T: ?Sized,
pub fn borrow_mut(&mut self) -> &mut T[src]
impl<T> From<T> for T[src]
impl<T, U> Into<U> for T where
U: From<T>, [src]
U: From<T>,
impl<T, U> TryFrom<U> for T where
U: Into<T>, [src]
U: Into<T>,
type Error = Infallible
The type returned in the event of a conversion error.
pub fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>[src]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>, [src]
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error
The type returned in the event of a conversion error.