Struct rustc_mir::transform::const_prop::ConstPropMachine [−][src]
Fields
stack: Vec<Frame<'mir, 'tcx, (), ()>>The virtual call stack.
written_only_inside_own_block_locals: FxHashSet<Local>OnlyInsideOwnBlock locals that were written in the current block get erased at the end.
only_propagate_inside_block_locals: BitSet<Local>Locals that need to be cleared after every block terminates.
can_const_prop: IndexVec<Local, ConstPropMode>Implementations
impl<'mir, 'tcx> ConstPropMachine<'mir, 'tcx>[src]
fn new(
only_propagate_inside_block_locals: BitSet<Local>,
can_const_prop: IndexVec<Local, ConstPropMode>
) -> Self[src]
only_propagate_inside_block_locals: BitSet<Local>,
can_const_prop: IndexVec<Local, ConstPropMode>
) -> Self
Trait Implementations
impl<'mir, 'tcx> Machine<'mir, 'tcx> for ConstPropMachine<'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 = !
Additional memory kinds a machine wishes to distinguish from the builtin ones
type 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 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 access_local(
_ecx: &InterpCx<'mir, 'tcx, Self>,
frame: &Frame<'mir, 'tcx, Self::PointerTag, Self::FrameExtra>,
local: Local
) -> InterpResult<'tcx, InterpOperand<Self::PointerTag>>[src]
_ecx: &InterpCx<'mir, 'tcx, Self>,
frame: &Frame<'mir, 'tcx, Self::PointerTag, Self::FrameExtra>,
local: Local
) -> InterpResult<'tcx, InterpOperand<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>>>[src]
ecx: &'a mut InterpCx<'mir, 'tcx, Self>,
frame: usize,
local: Local
) -> InterpResult<'tcx, Result<&'a mut LocalValue<Self::PointerTag>, MemPlace<Self::PointerTag>>>
fn before_access_global(
_memory_extra: &(),
_alloc_id: AllocId,
allocation: &Allocation<Self::PointerTag, Self::AllocExtra>,
_static_def_id: Option<DefId>,
is_write: bool
) -> InterpResult<'tcx>[src]
_memory_extra: &(),
_alloc_id: AllocId,
allocation: &Allocation<Self::PointerTag, Self::AllocExtra>,
_static_def_id: Option<DefId>,
is_write: bool
) -> InterpResult<'tcx>
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 abort(
_ecx: &mut InterpCx<'mir, 'tcx, Self>,
_msg: String
) -> InterpResult<'tcx, !>[src]
_ecx: &mut InterpCx<'mir, 'tcx, Self>,
_msg: String
) -> InterpResult<'tcx, !>
fn before_terminator(
_ecx: &mut InterpCx<'mir, 'tcx, Self>
) -> InterpResult<'tcx>[src]
_ecx: &mut InterpCx<'mir, 'tcx, Self>
) -> InterpResult<'tcx>
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 ConstPropMachine<'mir, 'tcx>
impl<'mir, 'tcx> !Send for ConstPropMachine<'mir, 'tcx>
impl<'mir, 'tcx> !Sync for ConstPropMachine<'mir, 'tcx>
impl<'mir, 'tcx> Unpin for ConstPropMachine<'mir, 'tcx> where
'tcx: 'mir,
'tcx: 'mir,
impl<'mir, 'tcx> !UnwindSafe for ConstPropMachine<'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.