Type Alias miri::MiriInterpCx
source · pub type MiriInterpCx<'mir, 'tcx> = InterpCx<'mir, 'tcx, MiriMachine<'mir, 'tcx>>;
Expand description
A rustc InterpCx for Miri.
Aliased Type§
struct MiriInterpCx<'mir, 'tcx> {
pub machine: MiriMachine<'mir, 'tcx>,
pub tcx: TyCtxtAt<'tcx>,
pub(crate) param_env: ParamEnv<'tcx>,
pub memory: Memory<'mir, 'tcx, MiriMachine<'mir, 'tcx>>,
pub recursion_limit: Limit,
}
Fields§
§machine: MiriMachine<'mir, 'tcx>
Stores the Machine
instance.
Note: the stack is provided by the machine.
tcx: TyCtxtAt<'tcx>
The results of the type checker, from rustc. The span in this is the “root” of the evaluation, i.e., the const we are evaluating (if this is CTFE).
param_env: ParamEnv<'tcx>
§memory: Memory<'mir, 'tcx, MiriMachine<'mir, 'tcx>>
The virtual memory system.
recursion_limit: Limit
The recursion limit (cached from tcx.recursion_limit(())
)
Trait Implementations§
source§impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
fn emulate_x86_intrinsic( &mut self, link_name: Symbol, abi: Abi, args: &[OpTy<'tcx, Provenance>], dest: &PlaceTy<'tcx, Provenance> ) -> InterpResult<'tcx, EmulateByNameResult<'mir, 'tcx>>
source§impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
fn CreateThread( &mut self, security_op: &OpTy<'tcx, Provenance>, stacksize_op: &OpTy<'tcx, Provenance>, start_op: &OpTy<'tcx, Provenance>, arg_op: &OpTy<'tcx, Provenance>, flags_op: &OpTy<'tcx, Provenance>, thread_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, ThreadId>
fn WaitForSingleObject( &mut self, handle_op: &OpTy<'tcx, Provenance>, timeout_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, u32>
source§impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
fn init_once_get_or_create_id( &mut self, lock_op: &OpTy<'tcx, Provenance>, lock_layout: TyAndLayout<'tcx>, offset: u64 ) -> InterpResult<'tcx, InitOnceId>
source§fn init_once_get_or_create<F>(
&mut self,
existing: F
) -> InterpResult<'tcx, InitOnceId>where
F: FnOnce(&mut MiriInterpCx<'mir, 'tcx>, InitOnceId) -> InterpResult<'tcx, Option<InitOnceId>>,
fn init_once_get_or_create<F>( &mut self, existing: F ) -> InterpResult<'tcx, InitOnceId>where F: FnOnce(&mut MiriInterpCx<'mir, 'tcx>, InitOnceId) -> InterpResult<'tcx, Option<InitOnceId>>,
fn init_once_status(&mut self, id: InitOnceId) -> InitOnceStatus
source§fn init_once_enqueue_and_block(
&mut self,
id: InitOnceId,
thread: ThreadId,
callback: Box<dyn MachineCallback<'mir, 'tcx> + 'tcx>
)
fn init_once_enqueue_and_block( &mut self, id: InitOnceId, thread: ThreadId, callback: Box<dyn MachineCallback<'mir, 'tcx> + 'tcx> )
source§fn init_once_begin(&mut self, id: InitOnceId)
fn init_once_begin(&mut self, id: InitOnceId)
fn init_once_complete(&mut self, id: InitOnceId) -> InterpResult<'tcx>
fn init_once_fail(&mut self, id: InitOnceId) -> InterpResult<'tcx>
source§fn init_once_observe_completed(&mut self, id: InitOnceId)
fn init_once_observe_completed(&mut self, id: InitOnceId)
source§impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
source§fn tb_retag_ptr_value(
&mut self,
kind: RetagKind,
val: &ImmTy<'tcx, Provenance>
) -> InterpResult<'tcx, ImmTy<'tcx, Provenance>>
fn tb_retag_ptr_value( &mut self, kind: RetagKind, val: &ImmTy<'tcx, Provenance> ) -> InterpResult<'tcx, ImmTy<'tcx, Provenance>>
from_ref_ty
and
raw pointers are never reborrowed.source§fn tb_retag_place_contents(
&mut self,
kind: RetagKind,
place: &PlaceTy<'tcx, Provenance>
) -> InterpResult<'tcx>
fn tb_retag_place_contents( &mut self, kind: RetagKind, place: &PlaceTy<'tcx, Provenance> ) -> InterpResult<'tcx>
source§fn tb_protect_place(
&mut self,
place: &MPlaceTy<'tcx, Provenance>
) -> InterpResult<'tcx>
fn tb_protect_place( &mut self, place: &MPlaceTy<'tcx, Provenance> ) -> InterpResult<'tcx>
source§fn tb_expose_tag(
&mut self,
alloc_id: AllocId,
tag: BorTag
) -> InterpResult<'tcx>
fn tb_expose_tag( &mut self, alloc_id: AllocId, tag: BorTag ) -> InterpResult<'tcx>
source§fn print_tree(
&mut self,
alloc_id: AllocId,
show_unnamed: bool
) -> InterpResult<'tcx>
fn print_tree( &mut self, alloc_id: AllocId, show_unnamed: bool ) -> InterpResult<'tcx>
source§fn tb_give_pointer_debug_name(
&mut self,
ptr: Pointer<Option<Provenance>>,
nth_parent: u8,
name: &str
) -> InterpResult<'tcx>
fn tb_give_pointer_debug_name( &mut self, ptr: Pointer<Option<Provenance>>, nth_parent: u8, name: &str ) -> InterpResult<'tcx>
name
and the pointer that receives it is the nth_parent
of ptr
(with 0 representing ptr
itself)source§impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
fn call_intrinsic( &mut self, instance: Instance<'tcx>, args: &[OpTy<'tcx, Provenance>], dest: &PlaceTy<'tcx, Provenance>, ret: Option<BasicBlock>, _unwind: UnwindAction ) -> InterpResult<'tcx>
source§fn emulate_intrinsic_by_name(
&mut self,
intrinsic_name: &str,
generic_args: GenericArgsRef<'tcx>,
args: &[OpTy<'tcx, Provenance>],
dest: &PlaceTy<'tcx, Provenance>
) -> InterpResult<'tcx>
fn emulate_intrinsic_by_name( &mut self, intrinsic_name: &str, generic_args: GenericArgsRef<'tcx>, args: &[OpTy<'tcx, Provenance>], dest: &PlaceTy<'tcx, Provenance> ) -> InterpResult<'tcx>
source§impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
source§fn handle_miri_start_panic(
&mut self,
abi: Abi,
link_name: Symbol,
args: &[OpTy<'tcx, Provenance>],
unwind: UnwindAction
) -> InterpResult<'tcx>
fn handle_miri_start_panic( &mut self, abi: Abi, link_name: Symbol, args: &[OpTy<'tcx, Provenance>], unwind: UnwindAction ) -> InterpResult<'tcx>
miri_start_panic
intrinsic, which is called
by libpanic_unwind to delegate the actual unwinding process to Miri.source§fn handle_try(
&mut self,
args: &[OpTy<'tcx, Provenance>],
dest: &PlaceTy<'tcx, Provenance>,
ret: BasicBlock
) -> InterpResult<'tcx>
fn handle_try( &mut self, args: &[OpTy<'tcx, Provenance>], dest: &PlaceTy<'tcx, Provenance>, ret: BasicBlock ) -> InterpResult<'tcx>
try
intrinsic, the underlying implementation of std::panicking::try
.fn handle_stack_pop_unwind( &mut self, extra: FrameExtra<'tcx>, unwinding: bool ) -> InterpResult<'tcx, StackPopJump>
source§fn start_panic(&mut self, msg: &str, unwind: UnwindAction) -> InterpResult<'tcx>
fn start_panic(&mut self, msg: &str, unwind: UnwindAction) -> InterpResult<'tcx>
source§fn start_panic_nounwind(&mut self, msg: &str) -> InterpResult<'tcx>
fn start_panic_nounwind(&mut self, msg: &str) -> InterpResult<'tcx>
fn assert_panic( &mut self, msg: &AssertMessage<'tcx>, unwind: UnwindAction ) -> InterpResult<'tcx>
source§impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
source§fn emulate_simd_intrinsic(
&mut self,
intrinsic_name: &str,
generic_args: GenericArgsRef<'tcx>,
args: &[OpTy<'tcx, Provenance>],
dest: &PlaceTy<'tcx, Provenance>
) -> InterpResult<'tcx>
fn emulate_simd_intrinsic( &mut self, intrinsic_name: &str, generic_args: GenericArgsRef<'tcx>, args: &[OpTy<'tcx, Provenance>], dest: &PlaceTy<'tcx, Provenance> ) -> InterpResult<'tcx>
intrinsic
; the simd_
prefix has already been removed.source§impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
fn getenv( &mut self, name_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, Pointer<Option<Provenance>>>
fn GetEnvironmentVariableW( &mut self, name_op: &OpTy<'tcx, Provenance>, buf_op: &OpTy<'tcx, Provenance>, size_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, Scalar<Provenance>>
fn GetEnvironmentStringsW( &mut self ) -> InterpResult<'tcx, Pointer<Option<Provenance>>>
fn FreeEnvironmentStringsW( &mut self, env_block_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, Scalar<Provenance>>
fn setenv( &mut self, name_op: &OpTy<'tcx, Provenance>, value_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, i32>
fn SetEnvironmentVariableW( &mut self, name_op: &OpTy<'tcx, Provenance>, value_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, Scalar<Provenance>>
fn unsetenv( &mut self, name_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, i32>
fn getcwd( &mut self, buf_op: &OpTy<'tcx, Provenance>, size_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, Pointer<Option<Provenance>>>
fn GetCurrentDirectoryW( &mut self, size_op: &OpTy<'tcx, Provenance>, buf_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, Scalar<Provenance>>
fn chdir(&mut self, path_op: &OpTy<'tcx, Provenance>) -> InterpResult<'tcx, i32>
fn SetCurrentDirectoryW( &mut self, path_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, Scalar<Provenance>>
source§fn update_environ(&mut self) -> InterpResult<'tcx>
fn update_environ(&mut self) -> InterpResult<'tcx>
environ
static.
The first time it gets called, also initializes extra.environ
.fn getpid(&mut self) -> InterpResult<'tcx, i32>
fn GetCurrentProcessId(&mut self) -> InterpResult<'tcx, u32>
source§impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
fn emulate_foreign_item_by_name( &mut self, link_name: Symbol, abi: Abi, args: &[OpTy<'tcx, Provenance>], dest: &PlaceTy<'tcx, Provenance> ) -> InterpResult<'tcx, EmulateByNameResult<'mir, 'tcx>>
source§impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
fn emulate_foreign_item_by_name( &mut self, link_name: Symbol, _abi: Abi, _args: &[OpTy<'tcx, Provenance>], _dest: &PlaceTy<'tcx, Provenance> ) -> InterpResult<'tcx, EmulateByNameResult<'mir, 'tcx>>
source§impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
fn emulate_foreign_item_by_name( &mut self, link_name: Symbol, abi: Abi, args: &[OpTy<'tcx, Provenance>], dest: &PlaceTy<'tcx, Provenance> ) -> InterpResult<'tcx, EmulateByNameResult<'mir, 'tcx>>
source§impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
fn emulate_foreign_item_by_name( &mut self, link_name: Symbol, abi: Abi, args: &[OpTy<'tcx, Provenance>], dest: &PlaceTy<'tcx, Provenance> ) -> InterpResult<'tcx, EmulateByNameResult<'mir, 'tcx>>
source§impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
fn emulate_x86_ssse3_intrinsic( &mut self, link_name: Symbol, abi: Abi, args: &[OpTy<'tcx, Provenance>], dest: &PlaceTy<'tcx, Provenance> ) -> InterpResult<'tcx, EmulateByNameResult<'mir, 'tcx>>
source§impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
fn emulate_foreign_item_by_name( &mut self, link_name: Symbol, abi: Abi, args: &[OpTy<'tcx, Provenance>], dest: &PlaceTy<'tcx, Provenance> ) -> InterpResult<'tcx, EmulateByNameResult<'mir, 'tcx>>
source§impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
fn call_dlsym( &mut self, dlsym: Dlsym, abi: Abi, args: &[OpTy<'tcx, Provenance>], dest: &PlaceTy<'tcx, Provenance>, ret: Option<BasicBlock> ) -> InterpResult<'tcx>
source§impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
fn mremap( &mut self, old_address: &OpTy<'tcx, Provenance>, old_size: &OpTy<'tcx, Provenance>, new_size: &OpTy<'tcx, Provenance>, flags: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, Scalar<Provenance>>
source§impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
fn mutex_get_or_create_id( &mut self, lock_op: &OpTy<'tcx, Provenance>, lock_layout: TyAndLayout<'tcx>, offset: u64 ) -> InterpResult<'tcx, MutexId>
fn rwlock_get_or_create_id( &mut self, lock_op: &OpTy<'tcx, Provenance>, lock_layout: TyAndLayout<'tcx>, offset: u64 ) -> InterpResult<'tcx, RwLockId>
fn condvar_get_or_create_id( &mut self, lock_op: &OpTy<'tcx, Provenance>, lock_layout: TyAndLayout<'tcx>, offset: u64 ) -> InterpResult<'tcx, CondvarId>
source§fn mutex_get_or_create<F>(&mut self, existing: F) -> InterpResult<'tcx, MutexId>where
F: FnOnce(&mut MiriInterpCx<'mir, 'tcx>, MutexId) -> InterpResult<'tcx, Option<MutexId>>,
fn mutex_get_or_create<F>(&mut self, existing: F) -> InterpResult<'tcx, MutexId>where F: FnOnce(&mut MiriInterpCx<'mir, 'tcx>, MutexId) -> InterpResult<'tcx, Option<MutexId>>,
source§fn mutex_get_owner(&mut self, id: MutexId) -> ThreadId
fn mutex_get_owner(&mut self, id: MutexId) -> ThreadId
source§fn mutex_is_locked(&self, id: MutexId) -> bool
fn mutex_is_locked(&self, id: MutexId) -> bool
source§fn mutex_lock(&mut self, id: MutexId, thread: ThreadId)
fn mutex_lock(&mut self, id: MutexId, thread: ThreadId)
source§fn mutex_unlock(
&mut self,
id: MutexId,
expected_owner: ThreadId
) -> Option<usize>
fn mutex_unlock( &mut self, id: MutexId, expected_owner: ThreadId ) -> Option<usize>
expected_owner
,
return None
.source§fn mutex_enqueue_and_block(&mut self, id: MutexId, thread: ThreadId)
fn mutex_enqueue_and_block(&mut self, id: MutexId, thread: ThreadId)
source§fn rwlock_get_or_create<F>(
&mut self,
existing: F
) -> InterpResult<'tcx, RwLockId>where
F: FnOnce(&mut MiriInterpCx<'mir, 'tcx>, RwLockId) -> InterpResult<'tcx, Option<RwLockId>>,
fn rwlock_get_or_create<F>( &mut self, existing: F ) -> InterpResult<'tcx, RwLockId>where F: FnOnce(&mut MiriInterpCx<'mir, 'tcx>, RwLockId) -> InterpResult<'tcx, Option<RwLockId>>,
source§fn rwlock_is_locked(&self, id: RwLockId) -> bool
fn rwlock_is_locked(&self, id: RwLockId) -> bool
source§fn rwlock_is_write_locked(&self, id: RwLockId) -> bool
fn rwlock_is_write_locked(&self, id: RwLockId) -> bool
source§fn rwlock_reader_lock(&mut self, id: RwLockId, reader: ThreadId)
fn rwlock_reader_lock(&mut self, id: RwLockId, reader: ThreadId)
reader
the list of threads that own
this lock.source§fn rwlock_reader_unlock(&mut self, id: RwLockId, reader: ThreadId) -> bool
fn rwlock_reader_unlock(&mut self, id: RwLockId, reader: ThreadId) -> bool
reader
and potentially give the lock to a new owner.
Returns true
if succeeded, false
if this reader
did not hold the lock.source§fn rwlock_enqueue_and_block_reader(&mut self, id: RwLockId, reader: ThreadId)
fn rwlock_enqueue_and_block_reader(&mut self, id: RwLockId, reader: ThreadId)
source§fn rwlock_writer_lock(&mut self, id: RwLockId, writer: ThreadId)
fn rwlock_writer_lock(&mut self, id: RwLockId, writer: ThreadId)
source§fn rwlock_writer_unlock(
&mut self,
id: RwLockId,
expected_writer: ThreadId
) -> bool
fn rwlock_writer_unlock( &mut self, id: RwLockId, expected_writer: ThreadId ) -> bool
source§fn rwlock_enqueue_and_block_writer(&mut self, id: RwLockId, writer: ThreadId)
fn rwlock_enqueue_and_block_writer(&mut self, id: RwLockId, writer: ThreadId)
source§fn condvar_get_or_create<F>(
&mut self,
existing: F
) -> InterpResult<'tcx, CondvarId>where
F: FnOnce(&mut MiriInterpCx<'mir, 'tcx>, CondvarId) -> InterpResult<'tcx, Option<CondvarId>>,
fn condvar_get_or_create<F>( &mut self, existing: F ) -> InterpResult<'tcx, CondvarId>where F: FnOnce(&mut MiriInterpCx<'mir, 'tcx>, CondvarId) -> InterpResult<'tcx, Option<CondvarId>>,
source§fn condvar_is_awaited(&mut self, id: CondvarId) -> bool
fn condvar_is_awaited(&mut self, id: CondvarId) -> bool
source§fn condvar_wait(&mut self, id: CondvarId, thread: ThreadId, lock: CondvarLock)
fn condvar_wait(&mut self, id: CondvarId, thread: ThreadId, lock: CondvarLock)
source§fn condvar_signal(&mut self, id: CondvarId) -> Option<(ThreadId, CondvarLock)>
fn condvar_signal(&mut self, id: CondvarId) -> Option<(ThreadId, CondvarLock)>
source§fn condvar_remove_waiter(&mut self, id: CondvarId, thread: ThreadId)
fn condvar_remove_waiter(&mut self, id: CondvarId, thread: ThreadId)
fn futex_wait(&mut self, addr: u64, thread: ThreadId, bitset: u32)
fn futex_wake(&mut self, addr: u64, bitset: u32) -> Option<ThreadId>
fn futex_remove_waiter(&mut self, addr: u64, thread: ThreadId)
source§impl<'mir, 'tcx> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
fn pthread_mutexattr_init( &mut self, attr_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, i32>
fn pthread_mutexattr_settype( &mut self, attr_op: &OpTy<'tcx, Provenance>, kind_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, i32>
fn pthread_mutexattr_destroy( &mut self, attr_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, i32>
fn pthread_mutex_init( &mut self, mutex_op: &OpTy<'tcx, Provenance>, attr_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, i32>
fn pthread_mutex_lock( &mut self, mutex_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, i32>
fn pthread_mutex_trylock( &mut self, mutex_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, i32>
fn pthread_mutex_unlock( &mut self, mutex_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, i32>
fn pthread_mutex_destroy( &mut self, mutex_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, i32>
fn pthread_rwlock_rdlock( &mut self, rwlock_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, i32>
fn pthread_rwlock_tryrdlock( &mut self, rwlock_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, i32>
fn pthread_rwlock_wrlock( &mut self, rwlock_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, i32>
fn pthread_rwlock_trywrlock( &mut self, rwlock_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, i32>
fn pthread_rwlock_unlock( &mut self, rwlock_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, i32>
fn pthread_rwlock_destroy( &mut self, rwlock_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, i32>
fn pthread_condattr_init( &mut self, attr_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, i32>
fn pthread_condattr_setclock( &mut self, attr_op: &OpTy<'tcx, Provenance>, clock_id_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, Scalar<Provenance>>
fn pthread_condattr_getclock( &mut self, attr_op: &OpTy<'tcx, Provenance>, clk_id_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, Scalar<Provenance>>
fn pthread_condattr_destroy( &mut self, attr_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, i32>
fn pthread_cond_init( &mut self, cond_op: &OpTy<'tcx, Provenance>, attr_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, i32>
fn pthread_cond_signal( &mut self, cond_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, i32>
fn pthread_cond_broadcast( &mut self, cond_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, i32>
fn pthread_cond_wait( &mut self, cond_op: &OpTy<'tcx, Provenance>, mutex_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, i32>
fn pthread_cond_timedwait( &mut self, cond_op: &OpTy<'tcx, Provenance>, mutex_op: &OpTy<'tcx, Provenance>, abstime_op: &OpTy<'tcx, Provenance>, dest: &PlaceTy<'tcx, Provenance> ) -> InterpResult<'tcx>
fn pthread_cond_destroy( &mut self, cond_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, i32>
source§impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
fn sb_retag_ptr_value( &mut self, kind: RetagKind, val: &ImmTy<'tcx, Provenance> ) -> InterpResult<'tcx, ImmTy<'tcx, Provenance>>
fn sb_retag_place_contents( &mut self, kind: RetagKind, place: &PlaceTy<'tcx, Provenance> ) -> InterpResult<'tcx>
source§fn sb_protect_place(
&mut self,
place: &MPlaceTy<'tcx, Provenance>
) -> InterpResult<'tcx>
fn sb_protect_place( &mut self, place: &MPlaceTy<'tcx, Provenance> ) -> InterpResult<'tcx>
source§fn sb_expose_tag(
&mut self,
alloc_id: AllocId,
tag: BorTag
) -> InterpResult<'tcx>
fn sb_expose_tag( &mut self, alloc_id: AllocId, tag: BorTag ) -> InterpResult<'tcx>
fn print_stacks(&mut self, alloc_id: AllocId) -> InterpResult<'tcx>
source§impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
source§fn get_or_create_thread_local_alloc(
&mut self,
def_id: DefId
) -> InterpResult<'tcx, Pointer<Provenance>>
fn get_or_create_thread_local_alloc( &mut self, def_id: DefId ) -> InterpResult<'tcx, Pointer<Provenance>>
source§fn start_regular_thread(
&mut self,
thread: Option<MPlaceTy<'tcx, Provenance>>,
start_routine: Pointer<Option<Provenance>>,
start_abi: Abi,
func_arg: ImmTy<'tcx, Provenance>,
ret_layout: TyAndLayout<'tcx>
) -> InterpResult<'tcx, ThreadId>
fn start_regular_thread( &mut self, thread: Option<MPlaceTy<'tcx, Provenance>>, start_routine: Pointer<Option<Provenance>>, start_abi: Abi, func_arg: ImmTy<'tcx, Provenance>, ret_layout: TyAndLayout<'tcx> ) -> InterpResult<'tcx, ThreadId>
fn detach_thread( &mut self, thread_id: ThreadId, allow_terminated_joined: bool ) -> InterpResult<'tcx>
fn join_thread(&mut self, joined_thread_id: ThreadId) -> InterpResult<'tcx>
fn join_thread_exclusive( &mut self, joined_thread_id: ThreadId ) -> InterpResult<'tcx>
fn set_active_thread(&mut self, thread_id: ThreadId) -> ThreadId
fn get_active_thread(&self) -> ThreadId
fn active_thread_mut(&mut self) -> &mut Thread<'mir, 'tcx>
fn active_thread_ref(&self) -> &Thread<'mir, 'tcx>
fn get_total_thread_count(&self) -> usize
fn have_all_terminated(&self) -> bool
fn enable_thread(&mut self, thread_id: ThreadId)
fn active_thread_stack( &self ) -> &[Frame<'mir, 'tcx, Provenance, FrameExtra<'tcx>>]
fn active_thread_stack_mut( &mut self ) -> &mut Vec<Frame<'mir, 'tcx, Provenance, FrameExtra<'tcx>>>
source§fn set_thread_name(&mut self, thread: ThreadId, new_thread_name: Vec<u8>)
fn set_thread_name(&mut self, thread: ThreadId, new_thread_name: Vec<u8>)
fn set_thread_name_wide(&mut self, thread: ThreadId, new_thread_name: &[u16])
fn get_thread_name<'c>(&'c self, thread: ThreadId) -> &'c [u8] ⓘwhere 'mir: 'c,
fn block_thread(&mut self, thread: ThreadId)
fn unblock_thread(&mut self, thread: ThreadId)
fn yield_active_thread(&mut self)
fn maybe_preempt_active_thread(&mut self)
fn register_timeout_callback( &mut self, thread: ThreadId, call_time: Time, callback: Box<dyn MachineCallback<'mir, 'tcx> + 'tcx> )
fn unregister_timeout_callback_if_exists(&mut self, thread: ThreadId)
source§fn run_threads(&mut self) -> InterpResult<'tcx, !>
fn run_threads(&mut self) -> InterpResult<'tcx, !>
source§fn terminate_active_thread(&mut self) -> InterpResult<'tcx>
fn terminate_active_thread(&mut self) -> InterpResult<'tcx>
source§impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
source§impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
source§fn read_os_str_from_c_str<'a>(
&'a self,
ptr: Pointer<Option<Provenance>>
) -> InterpResult<'tcx, &'a OsStr>where
'tcx: 'a,
'mir: 'a,
fn read_os_str_from_c_str<'a>( &'a self, ptr: Pointer<Option<Provenance>> ) -> InterpResult<'tcx, &'a OsStr>where 'tcx: 'a, 'mir: 'a,
source§fn read_os_str_from_wide_str<'a>(
&'a self,
ptr: Pointer<Option<Provenance>>
) -> InterpResult<'tcx, OsString>where
'tcx: 'a,
'mir: 'a,
fn read_os_str_from_wide_str<'a>( &'a self, ptr: Pointer<Option<Provenance>> ) -> InterpResult<'tcx, OsString>where 'tcx: 'a, 'mir: 'a,
source§fn write_os_str_to_c_str(
&mut self,
os_str: &OsStr,
ptr: Pointer<Option<Provenance>>,
size: u64
) -> InterpResult<'tcx, (bool, u64)>
fn write_os_str_to_c_str( &mut self, os_str: &OsStr, ptr: Pointer<Option<Provenance>>, size: u64 ) -> InterpResult<'tcx, (bool, u64)>
Ok((false, length))
without trying
to write if size
is not large enough to fit the contents of os_string
plus a null
terminator. It returns Ok((true, length))
if the writing process was successful. The
string length returned does include the null terminator.source§fn write_os_str_to_wide_str(
&mut self,
os_str: &OsStr,
ptr: Pointer<Option<Provenance>>,
size: u64,
truncate: bool
) -> InterpResult<'tcx, (bool, u64)>
fn write_os_str_to_wide_str( &mut self, os_str: &OsStr, ptr: Pointer<Option<Provenance>>, size: u64, truncate: bool ) -> InterpResult<'tcx, (bool, u64)>
source§fn alloc_os_str_as_c_str(
&mut self,
os_str: &OsStr,
memkind: MemoryKind<MiriMemoryKind>
) -> InterpResult<'tcx, Pointer<Option<Provenance>>>
fn alloc_os_str_as_c_str( &mut self, os_str: &OsStr, memkind: MemoryKind<MiriMemoryKind> ) -> InterpResult<'tcx, Pointer<Option<Provenance>>>
OsStr
as a null-terminated sequence of bytes.source§fn alloc_os_str_as_wide_str(
&mut self,
os_str: &OsStr,
memkind: MemoryKind<MiriMemoryKind>
) -> InterpResult<'tcx, Pointer<Option<Provenance>>>
fn alloc_os_str_as_wide_str( &mut self, os_str: &OsStr, memkind: MemoryKind<MiriMemoryKind> ) -> InterpResult<'tcx, Pointer<Option<Provenance>>>
OsStr
as a null-terminated sequence of u16
.source§fn read_path_from_c_str<'a>(
&'a self,
ptr: Pointer<Option<Provenance>>
) -> InterpResult<'tcx, Cow<'a, Path>>where
'tcx: 'a,
'mir: 'a,
fn read_path_from_c_str<'a>( &'a self, ptr: Pointer<Option<Provenance>> ) -> InterpResult<'tcx, Cow<'a, Path>>where 'tcx: 'a, 'mir: 'a,
source§fn read_path_from_wide_str(
&self,
ptr: Pointer<Option<Provenance>>
) -> InterpResult<'tcx, PathBuf>
fn read_path_from_wide_str( &self, ptr: Pointer<Option<Provenance>> ) -> InterpResult<'tcx, PathBuf>
u16
s, and perform path separator conversion if needed.source§fn write_path_to_c_str(
&mut self,
path: &Path,
ptr: Pointer<Option<Provenance>>,
size: u64
) -> InterpResult<'tcx, (bool, u64)>
fn write_path_to_c_str( &mut self, path: &Path, ptr: Pointer<Option<Provenance>>, size: u64 ) -> InterpResult<'tcx, (bool, u64)>
source§fn write_path_to_wide_str(
&mut self,
path: &Path,
ptr: Pointer<Option<Provenance>>,
size: u64,
truncate: bool
) -> InterpResult<'tcx, (bool, u64)>
fn write_path_to_wide_str( &mut self, path: &Path, ptr: Pointer<Option<Provenance>>, size: u64, truncate: bool ) -> InterpResult<'tcx, (bool, u64)>
u16
s),
adjusting path separators if needed.source§fn alloc_path_as_c_str(
&mut self,
path: &Path,
memkind: MemoryKind<MiriMemoryKind>
) -> InterpResult<'tcx, Pointer<Option<Provenance>>>
fn alloc_path_as_c_str( &mut self, path: &Path, memkind: MemoryKind<MiriMemoryKind> ) -> InterpResult<'tcx, Pointer<Option<Provenance>>>
source§fn alloc_path_as_wide_str(
&mut self,
path: &Path,
memkind: MemoryKind<MiriMemoryKind>
) -> InterpResult<'tcx, Pointer<Option<Provenance>>>
fn alloc_path_as_wide_str( &mut self, path: &Path, memkind: MemoryKind<MiriMemoryKind> ) -> InterpResult<'tcx, Pointer<Option<Provenance>>>
u16
s,
adjusting path separators if needed.fn convert_path<'a>( &self, os_str: Cow<'a, OsStr>, direction: PathConversion ) -> Cow<'a, OsStr>
source§impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
fn emit_diagnostic(&self, e: NonHaltingDiagnostic)
source§fn handle_ice(&self)
fn handle_ice(&self)
source§impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
fn emulate_x86_sse2_intrinsic( &mut self, link_name: Symbol, abi: Abi, args: &[OpTy<'tcx, Provenance>], dest: &PlaceTy<'tcx, Provenance> ) -> InterpResult<'tcx, EmulateByNameResult<'mir, 'tcx>>
source§impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
fn call_dlsym( &mut self, dlsym: Dlsym, args: &[OpTy<'tcx, Provenance>], dest: &PlaceTy<'tcx, Provenance>, ret: Option<BasicBlock> ) -> InterpResult<'tcx>
source§impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
fn emulate_foreign_item_by_name( &mut self, link_name: Symbol, abi: Abi, args: &[OpTy<'tcx, Provenance>], dest: &PlaceTy<'tcx, Provenance> ) -> InterpResult<'tcx, EmulateByNameResult<'mir, 'tcx>>
source§impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
fn call_dlsym( &mut self, dlsym: Dlsym, args: &[OpTy<'tcx, Provenance>], dest: &PlaceTy<'tcx, Provenance>, ret: Option<BasicBlock> ) -> InterpResult<'tcx>
source§impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
fn call_dlsym( &mut self, dlsym: Dlsym, _args: &[OpTy<'tcx, Provenance>], _dest: &PlaceTy<'tcx, Provenance>, ret: Option<BasicBlock> ) -> InterpResult<'tcx>
source§impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
fn emulate_x86_sse3_intrinsic( &mut self, link_name: Symbol, abi: Abi, args: &[OpTy<'tcx, Provenance>], dest: &PlaceTy<'tcx, Provenance> ) -> InterpResult<'tcx, EmulateByNameResult<'mir, 'tcx>>
source§impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
fn handle_miri_backtrace_size( &mut self, abi: Abi, link_name: Symbol, args: &[OpTy<'tcx, Provenance>], dest: &PlaceTy<'tcx, Provenance> ) -> InterpResult<'tcx>
fn handle_miri_get_backtrace( &mut self, abi: Abi, link_name: Symbol, args: &[OpTy<'tcx, Provenance>], dest: &PlaceTy<'tcx, Provenance> ) -> InterpResult<'tcx>
fn resolve_frame_pointer( &mut self, ptr: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, (Instance<'tcx>, Loc, String, String)>
fn handle_miri_resolve_frame( &mut self, abi: Abi, link_name: Symbol, args: &[OpTy<'tcx, Provenance>], dest: &PlaceTy<'tcx, Provenance> ) -> InterpResult<'tcx>
fn handle_miri_resolve_frame_names( &mut self, abi: Abi, link_name: Symbol, args: &[OpTy<'tcx, Provenance>] ) -> InterpResult<'tcx>
source§impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
source§fn have_module(&self, path: &[&str]) -> bool
fn have_module(&self, path: &[&str]) -> bool
source§fn try_resolve_path(
&self,
path: &[&str],
namespace: Namespace
) -> Option<Instance<'tcx>>
fn try_resolve_path( &self, path: &[&str], namespace: Namespace ) -> Option<Instance<'tcx>>
source§fn resolve_path(&self, path: &[&str], namespace: Namespace) -> Instance<'tcx>
fn resolve_path(&self, path: &[&str], namespace: Namespace) -> Instance<'tcx>
source§fn eval_path_scalar(&self, path: &[&str]) -> Scalar<Provenance>
fn eval_path_scalar(&self, path: &[&str]) -> Scalar<Provenance>
source§fn eval_libc(&self, name: &str) -> Scalar<Provenance>
fn eval_libc(&self, name: &str) -> Scalar<Provenance>
libc
constant as a Scalar
.source§fn eval_libc_i32(&self, name: &str) -> i32
fn eval_libc_i32(&self, name: &str) -> i32
libc
constant as an i32
.source§fn eval_libc_u32(&self, name: &str) -> u32
fn eval_libc_u32(&self, name: &str) -> u32
libc
constant as an u32
.source§fn eval_windows(&self, module: &str, name: &str) -> Scalar<Provenance>
fn eval_windows(&self, module: &str, name: &str) -> Scalar<Provenance>
windows
constant as a Scalar
.source§fn eval_windows_u32(&self, module: &str, name: &str) -> u32
fn eval_windows_u32(&self, module: &str, name: &str) -> u32
windows
constant as a u32
.source§fn eval_windows_u64(&self, module: &str, name: &str) -> u64
fn eval_windows_u64(&self, module: &str, name: &str) -> u64
windows
constant as a u64
.source§fn libc_ty_layout(&self, name: &str) -> TyAndLayout<'tcx>
fn libc_ty_layout(&self, name: &str) -> TyAndLayout<'tcx>
TyAndLayout
of a libc
typesource§fn windows_ty_layout(&self, name: &str) -> TyAndLayout<'tcx>
fn windows_ty_layout(&self, name: &str) -> TyAndLayout<'tcx>
TyAndLayout
of a windows
typesource§fn project_field_named<P: Projectable<'tcx, Provenance>>(
&self,
base: &P,
name: &str
) -> InterpResult<'tcx, P>
fn project_field_named<P: Projectable<'tcx, Provenance>>( &self, base: &P, name: &str ) -> InterpResult<'tcx, P>
source§fn write_int(
&mut self,
i: impl Into<i128>,
dest: &impl Writeable<'tcx, Provenance>
) -> InterpResult<'tcx>
fn write_int( &mut self, i: impl Into<i128>, dest: &impl Writeable<'tcx, Provenance> ) -> InterpResult<'tcx>
dest
. The target type may be signed or unsigned,
we try to do the right thing anyway. i128
can fit all integer types except for u128
so
this method is fine for almost all integer types.source§fn write_int_fields(
&mut self,
values: &[i128],
dest: &impl Writeable<'tcx, Provenance>
) -> InterpResult<'tcx>
fn write_int_fields( &mut self, values: &[i128], dest: &impl Writeable<'tcx, Provenance> ) -> InterpResult<'tcx>
source§fn write_int_fields_named(
&mut self,
values: &[(&str, i128)],
dest: &impl Writeable<'tcx, Provenance>
) -> InterpResult<'tcx>
fn write_int_fields_named( &mut self, values: &[(&str, i128)], dest: &impl Writeable<'tcx, Provenance> ) -> InterpResult<'tcx>
source§fn write_null(
&mut self,
dest: &impl Writeable<'tcx, Provenance>
) -> InterpResult<'tcx>
fn write_null( &mut self, dest: &impl Writeable<'tcx, Provenance> ) -> InterpResult<'tcx>
dest
.source§fn ptr_is_null(
&self,
ptr: Pointer<Option<Provenance>>
) -> InterpResult<'tcx, bool>
fn ptr_is_null( &self, ptr: Pointer<Option<Provenance>> ) -> InterpResult<'tcx, bool>
source§fn gen_random(
&mut self,
ptr: Pointer<Option<Provenance>>,
len: u64
) -> InterpResult<'tcx>
fn gen_random( &mut self, ptr: Pointer<Option<Provenance>>, len: u64 ) -> InterpResult<'tcx>
dest
.source§fn call_function(
&mut self,
f: Instance<'tcx>,
caller_abi: Abi,
args: &[Immediate<Provenance>],
dest: Option<&PlaceTy<'tcx, Provenance>>,
stack_pop: StackPopCleanup
) -> InterpResult<'tcx>
fn call_function( &mut self, f: Instance<'tcx>, caller_abi: Abi, args: &[Immediate<Provenance>], dest: Option<&PlaceTy<'tcx, Provenance>>, stack_pop: StackPopCleanup ) -> InterpResult<'tcx>
source§fn visit_freeze_sensitive(
&self,
place: &MPlaceTy<'tcx, Provenance>,
size: Size,
action: impl FnMut(AllocRange, bool) -> InterpResult<'tcx>
) -> InterpResult<'tcx>
fn visit_freeze_sensitive( &self, place: &MPlaceTy<'tcx, Provenance>, size: Size, action: impl FnMut(AllocRange, bool) -> InterpResult<'tcx> ) -> InterpResult<'tcx>
place
, sensitive to freezing: the 2nd parameter
of action
will be true if this is frozen, false if this is in an UnsafeCell
.
The range is relative to place
.source§fn check_no_isolation(&self, name: &str) -> InterpResult<'tcx>
fn check_no_isolation(&self, name: &str) -> InterpResult<'tcx>
name
of the foreign function if this is not the
case.source§fn reject_in_isolation(
&self,
op_name: &str,
reject_with: RejectOpWith
) -> InterpResult<'tcx>
fn reject_in_isolation( &self, op_name: &str, reject_with: RejectOpWith ) -> InterpResult<'tcx>
source§fn assert_target_os(&self, target_os: &str, name: &str)
fn assert_target_os(&self, target_os: &str, name: &str)
target_os
. It panics showing a message with the name
of the foreign function
if this is not the case.source§fn assert_target_os_is_unix(&self, name: &str)
fn assert_target_os_is_unix(&self, name: &str)
name
of the foreign function
if this is not the case.source§fn last_error_place(&mut self) -> InterpResult<'tcx, MPlaceTy<'tcx, Provenance>>
fn last_error_place(&mut self) -> InterpResult<'tcx, MPlaceTy<'tcx, Provenance>>
source§fn set_last_error(&mut self, scalar: Scalar<Provenance>) -> InterpResult<'tcx>
fn set_last_error(&mut self, scalar: Scalar<Provenance>) -> InterpResult<'tcx>
source§fn get_last_error(&mut self) -> InterpResult<'tcx, Scalar<Provenance>>
fn get_last_error(&mut self) -> InterpResult<'tcx, Scalar<Provenance>>
source§fn io_error_to_errnum(
&self,
err_kind: ErrorKind
) -> InterpResult<'tcx, Scalar<Provenance>>
fn io_error_to_errnum( &self, err_kind: ErrorKind ) -> InterpResult<'tcx, Scalar<Provenance>>
std::io::ErrorKind
as a platform-specific errnum.source§fn try_errnum_to_io_error(
&self,
errnum: Scalar<Provenance>
) -> InterpResult<'tcx, Option<ErrorKind>>
fn try_errnum_to_io_error( &self, errnum: Scalar<Provenance> ) -> InterpResult<'tcx, Option<ErrorKind>>
io_error_to_errnum
.source§fn set_last_error_from_io_error(
&mut self,
err_kind: ErrorKind
) -> InterpResult<'tcx>
fn set_last_error_from_io_error( &mut self, err_kind: ErrorKind ) -> InterpResult<'tcx>
std::io::ErrorKind
.source§fn try_unwrap_io_result<T: From<i32>>(
&mut self,
result: Result<T>
) -> InterpResult<'tcx, T>
fn try_unwrap_io_result<T: From<i32>>( &mut self, result: Result<T> ) -> InterpResult<'tcx, T>
std::io::Result<T>
and returns an
InterpResult<'tcx,T>::Ok
instead. In case the result is an error, this function returns
Ok(-1)
and sets the last OS error accordingly. Read moresource§fn deref_pointer_as(
&self,
op: &impl Readable<'tcx, Provenance>,
layout: TyAndLayout<'tcx>
) -> InterpResult<'tcx, MPlaceTy<'tcx, Provenance>>
fn deref_pointer_as( &self, op: &impl Readable<'tcx, Provenance>, layout: TyAndLayout<'tcx> ) -> InterpResult<'tcx, MPlaceTy<'tcx, Provenance>>
layout
instead of the pointer’s declared typesource§fn deref_pointer_unchecked(
&self,
val: &ImmTy<'tcx, Provenance>,
layout: TyAndLayout<'tcx>
) -> InterpResult<'tcx, MPlaceTy<'tcx, Provenance>>
fn deref_pointer_unchecked( &self, val: &ImmTy<'tcx, Provenance>, layout: TyAndLayout<'tcx> ) -> InterpResult<'tcx, MPlaceTy<'tcx, Provenance>>
source§fn deref_pointer_and_offset(
&self,
op: &impl Readable<'tcx, Provenance>,
offset: u64,
base_layout: TyAndLayout<'tcx>,
value_layout: TyAndLayout<'tcx>
) -> InterpResult<'tcx, MPlaceTy<'tcx, Provenance>>
fn deref_pointer_and_offset( &self, op: &impl Readable<'tcx, Provenance>, offset: u64, base_layout: TyAndLayout<'tcx>, value_layout: TyAndLayout<'tcx> ) -> InterpResult<'tcx, MPlaceTy<'tcx, Provenance>>
fn deref_pointer_and_read( &self, op: &impl Readable<'tcx, Provenance>, offset: u64, base_layout: TyAndLayout<'tcx>, value_layout: TyAndLayout<'tcx> ) -> InterpResult<'tcx, Scalar<Provenance>>
fn deref_pointer_and_write( &mut self, op: &impl Readable<'tcx, Provenance>, offset: u64, value: impl Into<Scalar<Provenance>>, base_layout: TyAndLayout<'tcx>, value_layout: TyAndLayout<'tcx> ) -> InterpResult<'tcx, ()>
source§fn read_timespec(
&mut self,
tp: &MPlaceTy<'tcx, Provenance>
) -> InterpResult<'tcx, Option<Duration>>
fn read_timespec( &mut self, tp: &MPlaceTy<'tcx, Provenance> ) -> InterpResult<'tcx, Option<Duration>>
timespec
struct and return it as a std::time::Duration
. It returns None
if the value in the timespec
struct is invalid. Some libc functions will return
EINVAL
in this case.source§fn read_c_str<'a>(
&'a self,
ptr: Pointer<Option<Provenance>>
) -> InterpResult<'tcx, &'a [u8]>where
'tcx: 'a,
'mir: 'a,
fn read_c_str<'a>( &'a self, ptr: Pointer<Option<Provenance>> ) -> InterpResult<'tcx, &'a [u8]>where 'tcx: 'a, 'mir: 'a,
source§fn write_c_str(
&mut self,
c_str: &[u8],
ptr: Pointer<Option<Provenance>>,
size: u64
) -> InterpResult<'tcx, (bool, u64)>
fn write_c_str( &mut self, c_str: &[u8], ptr: Pointer<Option<Provenance>>, size: u64 ) -> InterpResult<'tcx, (bool, u64)>
Ok((false, length))
without trying
to write if size
is not large enough to fit the contents of c_str
plus a null
terminator. It returns Ok((true, length))
if the writing process was successful. The
string length returned does include the null terminator.source§fn read_wide_str(
&self,
ptr: Pointer<Option<Provenance>>
) -> InterpResult<'tcx, Vec<u16>>
fn read_wide_str( &self, ptr: Pointer<Option<Provenance>> ) -> InterpResult<'tcx, Vec<u16>>
source§fn write_wide_str(
&mut self,
wide_str: &[u16],
ptr: Pointer<Option<Provenance>>,
size: u64
) -> InterpResult<'tcx, (bool, u64)>
fn write_wide_str( &mut self, wide_str: &[u16], ptr: Pointer<Option<Provenance>>, size: u64 ) -> InterpResult<'tcx, (bool, u64)>
Ok((false, length))
without trying
to write if size
is not large enough to fit the contents of os_string
plus a null
terminator. It returns Ok((true, length))
if the writing process was successful. The
string length returned does include the null terminator. Length is measured in units of
u16.
source§fn check_abi<'a>(&self, abi: Abi, exp_abi: Abi) -> InterpResult<'a, ()>
fn check_abi<'a>(&self, abi: Abi, exp_abi: Abi) -> InterpResult<'a, ()>
fn frame_in_std(&self) -> bool
source§fn handle_unsupported<S: AsRef<str>>(
&mut self,
error_msg: S
) -> InterpResult<'tcx, ()>
fn handle_unsupported<S: AsRef<str>>( &mut self, error_msg: S ) -> InterpResult<'tcx, ()>
fn check_abi_and_shim_symbol_clash( &mut self, abi: Abi, exp_abi: Abi, link_name: Symbol ) -> InterpResult<'tcx, ()>
fn check_shim<'a, const N: usize>( &mut self, abi: Abi, exp_abi: Abi, link_name: Symbol, args: &'a [OpTy<'tcx, Provenance>] ) -> InterpResult<'tcx, &'a [OpTy<'tcx, Provenance>; N]>where &'a [OpTy<'tcx, Provenance>; N]: TryFrom<&'a [OpTy<'tcx, Provenance>]>,
source§fn mark_immutable(&mut self, mplace: &MPlaceTy<'tcx, Provenance>)
fn mark_immutable(&mut self, mplace: &MPlaceTy<'tcx, Provenance>)
fn item_link_name(&self, def_id: DefId) -> Symbol
source§fn float_to_int_checked<F>(
&self,
f: F,
cast_to: TyAndLayout<'tcx>,
round: Round
) -> Option<ImmTy<'tcx, Provenance>>where
F: Float + Into<Scalar<Provenance>>,
fn float_to_int_checked<F>( &self, f: F, cast_to: TyAndLayout<'tcx>, round: Round ) -> Option<ImmTy<'tcx, Provenance>>where F: Float + Into<Scalar<Provenance>>,
f
to integer type dest_ty
after rounding with mode round
.
Returns None
if f
is NaN or out of range.source§fn get_twice_wide_int_ty(&self, ty: Ty<'tcx>) -> Ty<'tcx>
fn get_twice_wide_int_ty(&self, ty: Ty<'tcx>) -> Ty<'tcx>
ty
source§impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
source§fn min_align(&self, size: u64, kind: MiriMemoryKind) -> Align
fn min_align(&self, size: u64, kind: MiriMemoryKind) -> Align
fn malloc( &mut self, size: u64, zero_init: bool, kind: MiriMemoryKind ) -> InterpResult<'tcx, Pointer<Option<Provenance>>>
fn free( &mut self, ptr: Pointer<Option<Provenance>>, kind: MiriMemoryKind ) -> InterpResult<'tcx>
fn realloc( &mut self, old_ptr: Pointer<Option<Provenance>>, new_size: u64, kind: MiriMemoryKind ) -> InterpResult<'tcx, Pointer<Option<Provenance>>>
source§fn lookup_exported_symbol(
&mut self,
link_name: Symbol
) -> InterpResult<'tcx, Option<(&'mir Body<'tcx>, Instance<'tcx>)>>
fn lookup_exported_symbol( &mut self, link_name: Symbol ) -> InterpResult<'tcx, Option<(&'mir Body<'tcx>, Instance<'tcx>)>>
link_name
as the symbol name.source§fn read_byte_slice<'i>(
&'i self,
bytes: &OpTy<'tcx, Provenance>
) -> InterpResult<'tcx, &'i [u8]>where
'mir: 'i,
fn read_byte_slice<'i>( &'i self, bytes: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, &'i [u8]>where 'mir: 'i,
(ptr, len)
argumentsource§fn emulate_foreign_item(
&mut self,
def_id: DefId,
abi: Abi,
args: &[OpTy<'tcx, Provenance>],
dest: &PlaceTy<'tcx, Provenance>,
ret: Option<BasicBlock>,
unwind: UnwindAction
) -> InterpResult<'tcx, Option<(&'mir Body<'tcx>, Instance<'tcx>)>>
fn emulate_foreign_item( &mut self, def_id: DefId, abi: Abi, args: &[OpTy<'tcx, Provenance>], dest: &PlaceTy<'tcx, Provenance>, ret: Option<BasicBlock>, unwind: UnwindAction ) -> InterpResult<'tcx, Option<(&'mir Body<'tcx>, Instance<'tcx>)>>
goto_block
if needed.
Returns Ok(None) if the foreign item was completely handled
by this function.
Returns Ok(Some(body)) if processing the foreign item
is delegated to another function.source§fn emulate_allocator(
&mut self,
default: impl FnOnce(&mut MiriInterpCx<'mir, 'tcx>) -> InterpResult<'tcx>
) -> InterpResult<'tcx, EmulateByNameResult<'mir, 'tcx>>
fn emulate_allocator( &mut self, default: impl FnOnce(&mut MiriInterpCx<'mir, 'tcx>) -> InterpResult<'tcx> ) -> InterpResult<'tcx, EmulateByNameResult<'mir, 'tcx>>
source§fn emulate_foreign_item_by_name(
&mut self,
link_name: Symbol,
abi: Abi,
args: &[OpTy<'tcx, Provenance>],
dest: &PlaceTy<'tcx, Provenance>
) -> InterpResult<'tcx, EmulateByNameResult<'mir, 'tcx>>
fn emulate_foreign_item_by_name( &mut self, link_name: Symbol, abi: Abi, args: &[OpTy<'tcx, Provenance>], dest: &PlaceTy<'tcx, Provenance> ) -> InterpResult<'tcx, EmulateByNameResult<'mir, 'tcx>>
source§fn check_alloc_request(size: u64, align: u64) -> InterpResult<'tcx>
fn check_alloc_request(size: u64, align: u64) -> InterpResult<'tcx>
source§impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
fn call_dlsym( &mut self, dlsym: Dlsym, _args: &[OpTy<'tcx, Provenance>], _dest: &PlaceTy<'tcx, Provenance>, ret: Option<BasicBlock> ) -> InterpResult<'tcx>
source§impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
source§fn emulate_atomic_intrinsic(
&mut self,
intrinsic_name: &str,
args: &[OpTy<'tcx, Provenance>],
dest: &PlaceTy<'tcx, Provenance>
) -> InterpResult<'tcx>
fn emulate_atomic_intrinsic( &mut self, intrinsic_name: &str, args: &[OpTy<'tcx, Provenance>], dest: &PlaceTy<'tcx, Provenance> ) -> InterpResult<'tcx>
intrinsic
; the atomic_
prefix has already been removed.source§impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
fn find_mir_or_eval_fn( &mut self, instance: Instance<'tcx>, abi: Abi, args: &[FnArg<'tcx, Provenance>], dest: &PlaceTy<'tcx, Provenance>, ret: Option<BasicBlock>, unwind: UnwindAction ) -> InterpResult<'tcx, Option<(&'mir Body<'tcx>, Instance<'tcx>)>>
source§fn align_offset(
&mut self,
ptr_op: &OpTy<'tcx, Provenance>,
align_op: &OpTy<'tcx, Provenance>,
dest: &PlaceTy<'tcx, Provenance>,
ret: Option<BasicBlock>,
unwind: UnwindAction
) -> InterpResult<'tcx, bool>
fn align_offset( &mut self, ptr_op: &OpTy<'tcx, Provenance>, align_op: &OpTy<'tcx, Provenance>, dest: &PlaceTy<'tcx, Provenance>, ret: Option<BasicBlock>, unwind: UnwindAction ) -> InterpResult<'tcx, bool>
true
if the computation was performed, and false
if we should just evaluate
the actual MIR of align_offset
.source§impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
fn clock_gettime( &mut self, clk_id_op: &OpTy<'tcx, Provenance>, tp_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, Scalar<Provenance>>
fn gettimeofday( &mut self, tv_op: &OpTy<'tcx, Provenance>, tz_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, i32>
fn GetSystemTimeAsFileTime( &mut self, LPFILETIME_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx>
fn QueryPerformanceCounter( &mut self, lpPerformanceCount_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, Scalar<Provenance>>
fn QueryPerformanceFrequency( &mut self, lpFrequency_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, Scalar<Provenance>>
fn mach_absolute_time(&self) -> InterpResult<'tcx, Scalar<Provenance>>
fn mach_timebase_info( &mut self, info_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, Scalar<Provenance>>
fn nanosleep( &mut self, req_op: &OpTy<'tcx, Provenance>, _rem: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, i32>
fn Sleep(&mut self, timeout: &OpTy<'tcx, Provenance>) -> InterpResult<'tcx>
source§impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
fn validate_overlapping_atomic( &self, place: &MPlaceTy<'tcx, Provenance> ) -> InterpResult<'tcx>
fn buffered_atomic_rmw( &mut self, new_val: Scalar<Provenance>, place: &MPlaceTy<'tcx, Provenance>, atomic: AtomicRwOrd, init: Scalar<Provenance> ) -> InterpResult<'tcx>
fn buffered_atomic_read( &self, place: &MPlaceTy<'tcx, Provenance>, atomic: AtomicReadOrd, latest_in_mo: Scalar<Provenance>, validate: impl FnOnce() -> InterpResult<'tcx> ) -> InterpResult<'tcx, Scalar<Provenance>>
fn buffered_atomic_write( &mut self, val: Scalar<Provenance>, dest: &MPlaceTy<'tcx, Provenance>, atomic: AtomicWriteOrd, init: Scalar<Provenance> ) -> InterpResult<'tcx>
source§fn perform_read_on_buffered_latest(
&self,
place: &MPlaceTy<'tcx, Provenance>,
atomic: AtomicReadOrd,
init: Scalar<Provenance>
) -> InterpResult<'tcx>
fn perform_read_on_buffered_latest( &self, place: &MPlaceTy<'tcx, Provenance>, atomic: AtomicReadOrd, init: Scalar<Provenance> ) -> InterpResult<'tcx>
source§impl<'mir, 'tcx> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
fn AcquireSRWLockExclusive( &mut self, lock_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx>
fn TryAcquireSRWLockExclusive( &mut self, lock_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, Scalar<Provenance>>
fn ReleaseSRWLockExclusive( &mut self, lock_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx>
fn InitOnceBeginInitialize( &mut self, init_once_op: &OpTy<'tcx, Provenance>, flags_op: &OpTy<'tcx, Provenance>, pending_op: &OpTy<'tcx, Provenance>, context_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, Scalar<Provenance>>
fn InitOnceComplete( &mut self, init_once_op: &OpTy<'tcx, Provenance>, flags_op: &OpTy<'tcx, Provenance>, context_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, Scalar<Provenance>>
fn WaitOnAddress( &mut self, ptr_op: &OpTy<'tcx, Provenance>, compare_op: &OpTy<'tcx, Provenance>, size_op: &OpTy<'tcx, Provenance>, timeout_op: &OpTy<'tcx, Provenance>, dest: &PlaceTy<'tcx, Provenance> ) -> InterpResult<'tcx>
fn WakeByAddressSingle( &mut self, ptr_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx>
fn SleepConditionVariableSRW( &mut self, condvar_op: &OpTy<'tcx, Provenance>, lock_op: &OpTy<'tcx, Provenance>, timeout_op: &OpTy<'tcx, Provenance>, flags_op: &OpTy<'tcx, Provenance>, dest: &PlaceTy<'tcx, Provenance> ) -> InterpResult<'tcx, Scalar<Provenance>>
fn WakeConditionVariable( &mut self, condvar_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx>
fn WakeAllConditionVariable( &mut self, condvar_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx>
source§impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
Evaluation context extensions.
source§fn read_scalar_atomic(
&self,
place: &MPlaceTy<'tcx, Provenance>,
atomic: AtomicReadOrd
) -> InterpResult<'tcx, Scalar<Provenance>>
fn read_scalar_atomic( &self, place: &MPlaceTy<'tcx, Provenance>, atomic: AtomicReadOrd ) -> InterpResult<'tcx, Scalar<Provenance>>
source§fn write_scalar_atomic(
&mut self,
val: Scalar<Provenance>,
dest: &MPlaceTy<'tcx, Provenance>,
atomic: AtomicWriteOrd
) -> InterpResult<'tcx>
fn write_scalar_atomic( &mut self, val: Scalar<Provenance>, dest: &MPlaceTy<'tcx, Provenance>, atomic: AtomicWriteOrd ) -> InterpResult<'tcx>
source§fn atomic_op_immediate(
&mut self,
place: &MPlaceTy<'tcx, Provenance>,
rhs: &ImmTy<'tcx, Provenance>,
op: BinOp,
neg: bool,
atomic: AtomicRwOrd
) -> InterpResult<'tcx, ImmTy<'tcx, Provenance>>
fn atomic_op_immediate( &mut self, place: &MPlaceTy<'tcx, Provenance>, rhs: &ImmTy<'tcx, Provenance>, op: BinOp, neg: bool, atomic: AtomicRwOrd ) -> InterpResult<'tcx, ImmTy<'tcx, Provenance>>
source§fn atomic_exchange_scalar(
&mut self,
place: &MPlaceTy<'tcx, Provenance>,
new: Scalar<Provenance>,
atomic: AtomicRwOrd
) -> InterpResult<'tcx, Scalar<Provenance>>
fn atomic_exchange_scalar( &mut self, place: &MPlaceTy<'tcx, Provenance>, new: Scalar<Provenance>, atomic: AtomicRwOrd ) -> InterpResult<'tcx, Scalar<Provenance>>
source§fn atomic_min_max_scalar(
&mut self,
place: &MPlaceTy<'tcx, Provenance>,
rhs: ImmTy<'tcx, Provenance>,
min: bool,
atomic: AtomicRwOrd
) -> InterpResult<'tcx, ImmTy<'tcx, Provenance>>
fn atomic_min_max_scalar( &mut self, place: &MPlaceTy<'tcx, Provenance>, rhs: ImmTy<'tcx, Provenance>, min: bool, atomic: AtomicRwOrd ) -> InterpResult<'tcx, ImmTy<'tcx, Provenance>>
source§fn atomic_compare_exchange_scalar(
&mut self,
place: &MPlaceTy<'tcx, Provenance>,
expect_old: &ImmTy<'tcx, Provenance>,
new: Scalar<Provenance>,
success: AtomicRwOrd,
fail: AtomicReadOrd,
can_fail_spuriously: bool
) -> InterpResult<'tcx, Immediate<Provenance>>
fn atomic_compare_exchange_scalar( &mut self, place: &MPlaceTy<'tcx, Provenance>, expect_old: &ImmTy<'tcx, Provenance>, new: Scalar<Provenance>, success: AtomicRwOrd, fail: AtomicReadOrd, can_fail_spuriously: bool ) -> InterpResult<'tcx, Immediate<Provenance>>
can_fail_spuriously
is true,
then we treat it as a “compare_exchange_weak” operation, and
some portion of the time fail even when the values are actually
identical.source§fn atomic_fence(&mut self, atomic: AtomicFenceOrd) -> InterpResult<'tcx>
fn atomic_fence(&mut self, atomic: AtomicFenceOrd) -> InterpResult<'tcx>
source§fn allow_data_races_all_threads_done(&mut self)
fn allow_data_races_all_threads_done(&mut self)
source§impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
source§fn epoll_create1(
&mut self,
flags: &OpTy<'tcx, Provenance>
) -> InterpResult<'tcx, Scalar<Provenance>>
fn epoll_create1( &mut self, flags: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, Scalar<Provenance>>
Epoll
instance. This file
descriptor is used for all subsequent calls to the epoll interface. If the flags
argument
is 0, then this function is the same as epoll_create()
. Read moresource§fn epoll_ctl(
&mut self,
epfd: &OpTy<'tcx, Provenance>,
op: &OpTy<'tcx, Provenance>,
fd: &OpTy<'tcx, Provenance>,
event: &OpTy<'tcx, Provenance>
) -> InterpResult<'tcx, Scalar<Provenance>>
fn epoll_ctl( &mut self, epfd: &OpTy<'tcx, Provenance>, op: &OpTy<'tcx, Provenance>, fd: &OpTy<'tcx, Provenance>, event: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, Scalar<Provenance>>
Epoll
instance referred to by the file
descriptor epfd
. It requests that the operation op
be performed for the target file
descriptor, fd
. Read moresource§fn epoll_wait(
&mut self,
epfd: &OpTy<'tcx, Provenance>,
events: &OpTy<'tcx, Provenance>,
maxevents: &OpTy<'tcx, Provenance>,
timeout: &OpTy<'tcx, Provenance>
) -> InterpResult<'tcx, Scalar<Provenance>>
fn epoll_wait( &mut self, epfd: &OpTy<'tcx, Provenance>, events: &OpTy<'tcx, Provenance>, maxevents: &OpTy<'tcx, Provenance>, timeout: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, Scalar<Provenance>>
epoll_wait()
system call waits for events on the Epoll
instance referred to by the file descriptor epfd
. The buffer
pointed to by events
is used to return information from the ready
list about file descriptors in the interest list that have some
events available. Up to maxevents
are returned by epoll_wait()
.
The maxevents
argument must be greater than zero.
The timeout
argument specifies the number of milliseconds that
epoll_wait()
will block. Time is measured against the
CLOCK_MONOTONIC clock.
A call to epoll_wait()
will block until either:
• a file descriptor delivers an event;
• the call is interrupted by a signal handler; or
• the timeout expires.
Note that the timeout interval will be rounded up to the system
clock granularity, and kernel scheduling delays mean that the
blocking interval may overrun by a small amount. Specifying a
timeout of -1 causes epoll_wait()
to block indefinitely, while
specifying a timeout equal to zero cause epoll_wait()
to return
immediately, even if no events are available. Read moresource§fn eventfd(
&mut self,
val: &OpTy<'tcx, Provenance>,
flags: &OpTy<'tcx, Provenance>
) -> InterpResult<'tcx, Scalar<Provenance>>
fn eventfd( &mut self, val: &OpTy<'tcx, Provenance>, flags: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, Scalar<Provenance>>
Event
that is used as an event wait/notify mechanism by
user-space applications, and by the kernel to notify user-space applications of events.
The Event
contains an u64
counter maintained by the kernel. The counter is initialized
with the value specified in the initval
argument. Read moresource§fn socketpair(
&mut self,
domain: &OpTy<'tcx, Provenance>,
type_: &OpTy<'tcx, Provenance>,
protocol: &OpTy<'tcx, Provenance>,
sv: &OpTy<'tcx, Provenance>
) -> InterpResult<'tcx, Scalar<Provenance>>
fn socketpair( &mut self, domain: &OpTy<'tcx, Provenance>, type_: &OpTy<'tcx, Provenance>, protocol: &OpTy<'tcx, Provenance>, sv: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, Scalar<Provenance>>
SocketPair
s without specifying the domain, type, or
protocol of the new socket and these are stored in the socket values sv
argument. Read moresource§impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
fn retag_ptr_value( &mut self, kind: RetagKind, val: &ImmTy<'tcx, Provenance> ) -> InterpResult<'tcx, ImmTy<'tcx, Provenance>>
fn retag_place_contents( &mut self, kind: RetagKind, place: &PlaceTy<'tcx, Provenance> ) -> InterpResult<'tcx>
fn protect_place( &mut self, place: &MPlaceTy<'tcx, Provenance> ) -> InterpResult<'tcx>
fn expose_tag(&mut self, alloc_id: AllocId, tag: BorTag) -> InterpResult<'tcx>
fn give_pointer_debug_name( &mut self, ptr: Pointer<Option<Provenance>>, nth_parent: u8, name: &str ) -> InterpResult<'tcx>
fn print_borrow_state( &mut self, alloc_id: AllocId, show_unnamed: bool ) -> InterpResult<'tcx>
source§impl<'mir, 'tcx> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
fn invalid_handle(&mut self, function_name: &str) -> InterpResult<'tcx, !>
fn CloseHandle( &mut self, handle_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx>
source§impl<'mir, 'tcx> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
fn pthread_create( &mut self, thread: &OpTy<'tcx, Provenance>, _attr: &OpTy<'tcx, Provenance>, start_routine: &OpTy<'tcx, Provenance>, arg: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, i32>
fn pthread_join( &mut self, thread: &OpTy<'tcx, Provenance>, retval: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, i32>
fn pthread_detach( &mut self, thread: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, i32>
fn pthread_self(&mut self) -> InterpResult<'tcx, Scalar<Provenance>>
source§fn pthread_setname_np(
&mut self,
thread: Scalar<Provenance>,
name: Scalar<Provenance>,
max_name_len: usize
) -> InterpResult<'tcx, Scalar<Provenance>>
fn pthread_setname_np( &mut self, thread: Scalar<Provenance>, name: Scalar<Provenance>, max_name_len: usize ) -> InterpResult<'tcx, Scalar<Provenance>>
max_name_len
is the maximal length of the name
including the null terminator.fn pthread_getname_np( &mut self, thread: Scalar<Provenance>, name_out: Scalar<Provenance>, len: Scalar<Provenance> ) -> InterpResult<'tcx, Scalar<Provenance>>
fn sched_yield(&mut self) -> InterpResult<'tcx, i32>
source§impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
fn call_dlsym( &mut self, dlsym: Dlsym, abi: Abi, args: &[OpTy<'tcx, Provenance>], dest: &PlaceTy<'tcx, Provenance>, ret: Option<BasicBlock> ) -> InterpResult<'tcx>
source§impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
fn mmap( &mut self, addr: &OpTy<'tcx, Provenance>, length: &OpTy<'tcx, Provenance>, prot: &OpTy<'tcx, Provenance>, flags: &OpTy<'tcx, Provenance>, fd: &OpTy<'tcx, Provenance>, offset: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, Scalar<Provenance>>
fn munmap( &mut self, addr: &OpTy<'tcx, Provenance>, length: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, Scalar<Provenance>>
source§impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
fn call_dlsym( &mut self, dlsym: Dlsym, abi: Abi, args: &[OpTy<'tcx, Provenance>], dest: &PlaceTy<'tcx, Provenance>, ret: Option<BasicBlock> ) -> InterpResult<'tcx>
source§impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
fn open(&mut self, args: &[OpTy<'tcx, Provenance>]) -> InterpResult<'tcx, i32>
fn fcntl(&mut self, args: &[OpTy<'tcx, Provenance>]) -> InterpResult<'tcx, i32>
fn close( &mut self, fd_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, Scalar<Provenance>>
source§fn handle_not_found<T: From<i32>>(&mut self) -> InterpResult<'tcx, T>
fn handle_not_found<T: From<i32>>(&mut self) -> InterpResult<'tcx, T>
FileHandler
. It returns Ok(-1)
and sets
the last OS error to libc::EBADF
(invalid file descriptor). This function uses
T: From<i32>
instead of i32
directly because some fs functions return different integer
types (like read
, that returns an i64
).fn read( &mut self, fd: i32, buf: Pointer<Option<Provenance>>, count: u64 ) -> InterpResult<'tcx, i64>
fn write( &mut self, fd: i32, buf: Pointer<Option<Provenance>>, count: u64 ) -> InterpResult<'tcx, i64>
fn lseek64( &mut self, fd_op: &OpTy<'tcx, Provenance>, offset_op: &OpTy<'tcx, Provenance>, whence_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, Scalar<Provenance>>
fn unlink( &mut self, path_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, i32>
fn symlink( &mut self, target_op: &OpTy<'tcx, Provenance>, linkpath_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, i32>
fn macos_stat( &mut self, path_op: &OpTy<'tcx, Provenance>, buf_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, Scalar<Provenance>>
fn macos_lstat( &mut self, path_op: &OpTy<'tcx, Provenance>, buf_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, Scalar<Provenance>>
fn macos_fstat( &mut self, fd_op: &OpTy<'tcx, Provenance>, buf_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, Scalar<Provenance>>
fn linux_statx( &mut self, dirfd_op: &OpTy<'tcx, Provenance>, pathname_op: &OpTy<'tcx, Provenance>, flags_op: &OpTy<'tcx, Provenance>, mask_op: &OpTy<'tcx, Provenance>, statxbuf_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, i32>
fn rename( &mut self, oldpath_op: &OpTy<'tcx, Provenance>, newpath_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, i32>
fn mkdir( &mut self, path_op: &OpTy<'tcx, Provenance>, mode_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, i32>
fn rmdir(&mut self, path_op: &OpTy<'tcx, Provenance>) -> InterpResult<'tcx, i32>
fn opendir( &mut self, name_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, Scalar<Provenance>>
fn linux_readdir64( &mut self, dirp_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, Scalar<Provenance>>
fn macos_readdir_r( &mut self, dirp_op: &OpTy<'tcx, Provenance>, entry_op: &OpTy<'tcx, Provenance>, result_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, Scalar<Provenance>>
fn closedir( &mut self, dirp_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, i32>
fn ftruncate64( &mut self, fd_op: &OpTy<'tcx, Provenance>, length_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, Scalar<Provenance>>
fn fsync(&mut self, fd_op: &OpTy<'tcx, Provenance>) -> InterpResult<'tcx, i32>
fn fdatasync( &mut self, fd_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, i32>
fn sync_file_range( &mut self, fd_op: &OpTy<'tcx, Provenance>, offset_op: &OpTy<'tcx, Provenance>, nbytes_op: &OpTy<'tcx, Provenance>, flags_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, Scalar<Provenance>>
fn readlink( &mut self, pathname_op: &OpTy<'tcx, Provenance>, buf_op: &OpTy<'tcx, Provenance>, bufsize_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, i64>
fn isatty( &mut self, miri_fd: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, Scalar<Provenance>>
fn realpath( &mut self, path_op: &OpTy<'tcx, Provenance>, processed_path_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, Scalar<Provenance>>
fn mkstemp( &mut self, template_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, i32>
source§impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
fn emulate_x86_sse_intrinsic( &mut self, link_name: Symbol, abi: Abi, args: &[OpTy<'tcx, Provenance>], dest: &PlaceTy<'tcx, Provenance> ) -> InterpResult<'tcx, EmulateByNameResult<'mir, 'tcx>>
source§impl<'mir, 'tcx> EvalContextExt<'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx> EvalContextExt<'tcx> for MiriInterpCx<'mir, 'tcx>
fn binary_ptr_op( &self, bin_op: BinOp, left: &ImmTy<'tcx, Provenance>, right: &ImmTy<'tcx, Provenance> ) -> InterpResult<'tcx, (ImmTy<'tcx, Provenance>, bool)>
source§impl<'mir, 'tcx: 'mir> EvalContextExtPriv<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExtPriv<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
source§fn init_once_observe_attempt(&mut self, id: InitOnceId)
fn init_once_observe_attempt(&mut self, id: InitOnceId)
fn init_once_wake_waiter( &mut self, id: InitOnceId, waiter: InitOnceWaiter<'mir, 'tcx> ) -> InterpResult<'tcx>
source§impl<'mir, 'tcx: 'mir> EvalContextExtPriv<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExtPriv<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
source§fn get_or_create_id<Id: SyncId>(
&mut self,
next_id: Id,
lock_op: &OpTy<'tcx, Provenance>,
lock_layout: TyAndLayout<'tcx>,
offset: u64
) -> InterpResult<'tcx, Option<Id>>
fn get_or_create_id<Id: SyncId>( &mut self, next_id: Id, lock_op: &OpTy<'tcx, Provenance>, lock_layout: TyAndLayout<'tcx>, offset: u64 ) -> InterpResult<'tcx, Option<Id>>
source§fn rwlock_dequeue_and_lock_reader(&mut self, id: RwLockId) -> bool
fn rwlock_dequeue_and_lock_reader(&mut self, id: RwLockId) -> bool
true
if some thread got the rwlock.source§fn rwlock_dequeue_and_lock_writer(&mut self, id: RwLockId) -> bool
fn rwlock_dequeue_and_lock_writer(&mut self, id: RwLockId) -> bool
true
if some thread got the rwlock.source§fn mutex_dequeue_and_lock(&mut self, id: MutexId) -> bool
fn mutex_dequeue_and_lock(&mut self, id: MutexId) -> bool
true
if some thread has the mutex now.source§impl<'mir, 'tcx> EvalContextExtPriv<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx> EvalContextExtPriv<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
source§fn reacquire_cond_lock(
&mut self,
thread: ThreadId,
lock: RwLockId,
mode: RwLockMode
) -> InterpResult<'tcx>
fn reacquire_cond_lock( &mut self, thread: ThreadId, lock: RwLockId, mode: RwLockMode ) -> InterpResult<'tcx>
fn srwlock_get_id( &mut self, rwlock_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, RwLockId>
fn init_once_get_id( &mut self, init_once_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, InitOnceId>
fn condvar_get_id( &mut self, condvar_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, CondvarId>
source§impl<'mir, 'tcx: 'mir> EvalContextExtPrivate<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextExtPrivate<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
fn macos_stat_write_buf( &mut self, metadata: FileMetadata, buf_op: &OpTy<'tcx, Provenance> ) -> InterpResult<'tcx, i32>
fn file_type_to_d_type( &mut self, file_type: Result<FileType> ) -> InterpResult<'tcx, i32>
source§impl<'mir, 'tcx: 'mir> EvalContextPrivExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextPrivExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
source§fn run_timeout_callback(&mut self) -> InterpResult<'tcx>
fn run_timeout_callback(&mut self) -> InterpResult<'tcx>
fn run_on_stack_empty(&mut self) -> InterpResult<'tcx, Poll<()>>
source§impl<'mir, 'tcx: 'mir> EvalContextPrivExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextPrivExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
fn atomic_load( &mut self, args: &[OpTy<'tcx, Provenance>], dest: &PlaceTy<'tcx, Provenance>, atomic: AtomicReadOrd ) -> InterpResult<'tcx>
fn atomic_store( &mut self, args: &[OpTy<'tcx, Provenance>], atomic: AtomicWriteOrd ) -> InterpResult<'tcx>
fn compiler_fence_intrinsic( &mut self, args: &[OpTy<'tcx, Provenance>], atomic: AtomicFenceOrd ) -> InterpResult<'tcx>
fn atomic_fence_intrinsic( &mut self, args: &[OpTy<'tcx, Provenance>], atomic: AtomicFenceOrd ) -> InterpResult<'tcx>
fn atomic_op( &mut self, args: &[OpTy<'tcx, Provenance>], dest: &PlaceTy<'tcx, Provenance>, atomic_op: AtomicOp, atomic: AtomicRwOrd ) -> InterpResult<'tcx>
fn atomic_exchange( &mut self, args: &[OpTy<'tcx, Provenance>], dest: &PlaceTy<'tcx, Provenance>, atomic: AtomicRwOrd ) -> InterpResult<'tcx>
fn atomic_compare_exchange_impl( &mut self, args: &[OpTy<'tcx, Provenance>], dest: &PlaceTy<'tcx, Provenance>, success: AtomicRwOrd, fail: AtomicReadOrd, can_fail_spuriously: bool ) -> InterpResult<'tcx>
fn atomic_compare_exchange( &mut self, args: &[OpTy<'tcx, Provenance>], dest: &PlaceTy<'tcx, Provenance>, success: AtomicRwOrd, fail: AtomicReadOrd ) -> InterpResult<'tcx>
fn atomic_compare_exchange_weak( &mut self, args: &[OpTy<'tcx, Provenance>], dest: &PlaceTy<'tcx, Provenance>, success: AtomicRwOrd, fail: AtomicReadOrd ) -> InterpResult<'tcx>
source§impl<'mir, 'tcx: 'mir> EvalContextPrivExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextPrivExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
source§fn allow_data_races_ref<R>(
&self,
op: impl FnOnce(&MiriInterpCx<'mir, 'tcx>) -> R
) -> R
fn allow_data_races_ref<R>( &self, op: impl FnOnce(&MiriInterpCx<'mir, 'tcx>) -> R ) -> R
source§fn allow_data_races_mut<R>(
&mut self,
op: impl FnOnce(&mut MiriInterpCx<'mir, 'tcx>) -> R
) -> R
fn allow_data_races_mut<R>( &mut self, op: impl FnOnce(&mut MiriInterpCx<'mir, 'tcx>) -> R ) -> R
allow_data_races_ref
, this temporarily disables any data-race detection and
so should only be used for atomic operations or internal state that the program cannot
access.source§fn atomic_access_check(
&self,
place: &MPlaceTy<'tcx, Provenance>
) -> InterpResult<'tcx>
fn atomic_access_check( &self, place: &MPlaceTy<'tcx, Provenance> ) -> InterpResult<'tcx>
source§fn validate_atomic_load(
&self,
place: &MPlaceTy<'tcx, Provenance>,
atomic: AtomicReadOrd
) -> InterpResult<'tcx>
fn validate_atomic_load( &self, place: &MPlaceTy<'tcx, Provenance>, atomic: AtomicReadOrd ) -> InterpResult<'tcx>
source§fn validate_atomic_store(
&mut self,
place: &MPlaceTy<'tcx, Provenance>,
atomic: AtomicWriteOrd
) -> InterpResult<'tcx>
fn validate_atomic_store( &mut self, place: &MPlaceTy<'tcx, Provenance>, atomic: AtomicWriteOrd ) -> InterpResult<'tcx>
source§fn validate_atomic_rmw(
&mut self,
place: &MPlaceTy<'tcx, Provenance>,
atomic: AtomicRwOrd
) -> InterpResult<'tcx>
fn validate_atomic_rmw( &mut self, place: &MPlaceTy<'tcx, Provenance>, atomic: AtomicRwOrd ) -> InterpResult<'tcx>
source§fn validate_atomic_op<A: Debug + Copy>(
&self,
place: &MPlaceTy<'tcx, Provenance>,
atomic: A,
description: &str,
op: impl FnMut(&mut MemoryCellClocks, &mut ThreadClockSet, VectorIdx, A) -> Result<(), DataRace>
) -> InterpResult<'tcx>
fn validate_atomic_op<A: Debug + Copy>( &self, place: &MPlaceTy<'tcx, Provenance>, atomic: A, description: &str, op: impl FnMut(&mut MemoryCellClocks, &mut ThreadClockSet, VectorIdx, A) -> Result<(), DataRace> ) -> InterpResult<'tcx>
source§impl<'mir, 'tcx: 'mir> EvalContextPrivExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx: 'mir> EvalContextPrivExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
source§fn schedule_windows_tls_dtors(&mut self) -> InterpResult<'tcx>
fn schedule_windows_tls_dtors(&mut self) -> InterpResult<'tcx>
source§fn schedule_macos_tls_dtor(&mut self) -> InterpResult<'tcx>
fn schedule_macos_tls_dtor(&mut self) -> InterpResult<'tcx>
source§fn schedule_next_pthread_tls_dtor(
&mut self,
state: &mut RunningDtorState
) -> InterpResult<'tcx, Poll<()>>
fn schedule_next_pthread_tls_dtor( &mut self, state: &mut RunningDtorState ) -> InterpResult<'tcx, Poll<()>>
true
if found
a destructor to schedule, and false
otherwise.source§impl<'mir: 'ecx, 'tcx: 'mir, 'ecx> EvalContextPrivExt<'mir, 'tcx, 'ecx> for MiriInterpCx<'mir, 'tcx>
impl<'mir: 'ecx, 'tcx: 'mir, 'ecx> EvalContextPrivExt<'mir, 'tcx, 'ecx> for MiriInterpCx<'mir, 'tcx>
Retagging/reborrowing. Policy on which permission to grant to each pointer should be left to the implementation of NewPermission.
source§fn tb_reborrow(
&mut self,
place: &MPlaceTy<'tcx, Provenance>,
ptr_size: Size,
new_perm: NewPermission,
new_tag: BorTag
) -> InterpResult<'tcx, Option<Provenance>>
fn tb_reborrow( &mut self, place: &MPlaceTy<'tcx, Provenance>, ptr_size: Size, new_perm: NewPermission, new_tag: BorTag ) -> InterpResult<'tcx, Option<Provenance>>
source§fn tb_retag_reference(
&mut self,
val: &ImmTy<'tcx, Provenance>,
new_perm: NewPermission
) -> InterpResult<'tcx, ImmTy<'tcx, Provenance>>
fn tb_retag_reference( &mut self, val: &ImmTy<'tcx, Provenance>, new_perm: NewPermission ) -> InterpResult<'tcx, ImmTy<'tcx, Provenance>>
source§impl<'mir: 'ecx, 'tcx: 'mir, 'ecx> EvalContextPrivExt<'mir, 'tcx, 'ecx> for MiriInterpCx<'mir, 'tcx>
impl<'mir: 'ecx, 'tcx: 'mir, 'ecx> EvalContextPrivExt<'mir, 'tcx, 'ecx> for MiriInterpCx<'mir, 'tcx>
Retagging/reborrowing. There is some policy in here, such as which permissions to grant for which references, and when to add protectors.
source§fn sb_reborrow(
&mut self,
place: &MPlaceTy<'tcx, Provenance>,
size: Size,
new_perm: NewPermission,
new_tag: BorTag,
retag_info: RetagInfo
) -> InterpResult<'tcx, Option<Provenance>>
fn sb_reborrow( &mut self, place: &MPlaceTy<'tcx, Provenance>, size: Size, new_perm: NewPermission, new_tag: BorTag, retag_info: RetagInfo ) -> InterpResult<'tcx, Option<Provenance>>
source§fn sb_retag_reference(
&mut self,
val: &ImmTy<'tcx, Provenance>,
new_perm: NewPermission,
info: RetagInfo
) -> InterpResult<'tcx, ImmTy<'tcx, Provenance>>
fn sb_retag_reference( &mut self, val: &ImmTy<'tcx, Provenance>, new_perm: NewPermission, info: RetagInfo ) -> InterpResult<'tcx, ImmTy<'tcx, Provenance>>
kind
indicates what kind of reference is being created.source§impl<'mir, 'tcx> MiriInterpCxExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
impl<'mir, 'tcx> MiriInterpCxExt<'mir, 'tcx> for MiriInterpCx<'mir, 'tcx>
fn eval_context_ref(&self) -> &MiriInterpCx<'mir, 'tcx>
fn eval_context_mut(&mut self) -> &mut MiriInterpCx<'mir, 'tcx>
source§impl VisitTags for MiriInterpCx<'_, '_>
impl VisitTags for MiriInterpCx<'_, '_>
Layout§
Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...)
attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.
Size: 2352 bytes