Rollup merge of #138713 - RalfJung:memory-hook-pointers, r=oli-obk
interpret memory access hooks: also pass through the Pointer used for the access In some ongoing work on the Miri side, we need the absolute address that the memory access occurred at. That is non-trivial to obtain since we don't have an `ecx`. So pass through the `Pointer` used for the access, which contains the address, and which is available everywhere we are calling these hooks. r? `@oli-obk`
This commit is contained in:
commit
7c1b128383
4 changed files with 26 additions and 2 deletions
|
@ -22,7 +22,7 @@ use crate::errors::{LongRunning, LongRunningWarn};
|
|||
use crate::fluent_generated as fluent;
|
||||
use crate::interpret::{
|
||||
self, AllocId, AllocInit, AllocRange, ConstAllocation, CtfeProvenance, FnArg, Frame,
|
||||
GlobalAlloc, ImmTy, InterpCx, InterpResult, MPlaceTy, OpTy, RangeSet, Scalar,
|
||||
GlobalAlloc, ImmTy, InterpCx, InterpResult, MPlaceTy, OpTy, Pointer, RangeSet, Scalar,
|
||||
compile_time_machine, interp_ok, throw_exhaust, throw_inval, throw_ub, throw_ub_custom,
|
||||
throw_unsup, throw_unsup_format,
|
||||
};
|
||||
|
@ -688,6 +688,7 @@ impl<'tcx> interpret::Machine<'tcx> for CompileTimeMachine<'tcx> {
|
|||
_tcx: TyCtxtAt<'tcx>,
|
||||
_machine: &mut Self,
|
||||
_alloc_extra: &mut Self::AllocExtra,
|
||||
_ptr: Pointer<Option<Self::Provenance>>,
|
||||
(_alloc_id, immutable): (AllocId, bool),
|
||||
range: AllocRange,
|
||||
) -> InterpResult<'tcx> {
|
||||
|
|
|
@ -400,6 +400,8 @@ pub trait Machine<'tcx>: Sized {
|
|||
) -> InterpResult<'tcx, Self::AllocExtra>;
|
||||
|
||||
/// Hook for performing extra checks on a memory read access.
|
||||
/// `ptr` will always be a pointer with the provenance in `prov` pointing to the beginning of
|
||||
/// `range`.
|
||||
///
|
||||
/// This will *not* be called during validation!
|
||||
///
|
||||
|
@ -413,6 +415,7 @@ pub trait Machine<'tcx>: Sized {
|
|||
_tcx: TyCtxtAt<'tcx>,
|
||||
_machine: &Self,
|
||||
_alloc_extra: &Self::AllocExtra,
|
||||
_ptr: Pointer<Option<Self::Provenance>>,
|
||||
_prov: (AllocId, Self::ProvenanceExtra),
|
||||
_range: AllocRange,
|
||||
) -> InterpResult<'tcx> {
|
||||
|
@ -432,11 +435,14 @@ pub trait Machine<'tcx>: Sized {
|
|||
|
||||
/// Hook for performing extra checks on a memory write access.
|
||||
/// This is not invoked for ZST accesses, as no write actually happens.
|
||||
/// `ptr` will always be a pointer with the provenance in `prov` pointing to the beginning of
|
||||
/// `range`.
|
||||
#[inline(always)]
|
||||
fn before_memory_write(
|
||||
_tcx: TyCtxtAt<'tcx>,
|
||||
_machine: &mut Self,
|
||||
_alloc_extra: &mut Self::AllocExtra,
|
||||
_ptr: Pointer<Option<Self::Provenance>>,
|
||||
_prov: (AllocId, Self::ProvenanceExtra),
|
||||
_range: AllocRange,
|
||||
) -> InterpResult<'tcx> {
|
||||
|
@ -444,11 +450,14 @@ pub trait Machine<'tcx>: Sized {
|
|||
}
|
||||
|
||||
/// Hook for performing extra operations on a memory deallocation.
|
||||
/// `ptr` will always be a pointer with the provenance in `prov` pointing to the beginning of
|
||||
/// the allocation.
|
||||
#[inline(always)]
|
||||
fn before_memory_deallocation(
|
||||
_tcx: TyCtxtAt<'tcx>,
|
||||
_machine: &mut Self,
|
||||
_alloc_extra: &mut Self::AllocExtra,
|
||||
_ptr: Pointer<Option<Self::Provenance>>,
|
||||
_prov: (AllocId, Self::ProvenanceExtra),
|
||||
_size: Size,
|
||||
_align: Align,
|
||||
|
|
|
@ -385,6 +385,7 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
|
|||
self.tcx,
|
||||
&mut self.machine,
|
||||
&mut alloc.extra,
|
||||
ptr,
|
||||
(alloc_id, prov),
|
||||
size,
|
||||
alloc.align,
|
||||
|
@ -727,6 +728,7 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
|
|||
self.tcx,
|
||||
&self.machine,
|
||||
&alloc.extra,
|
||||
ptr,
|
||||
(alloc_id, prov),
|
||||
range,
|
||||
)?;
|
||||
|
@ -816,7 +818,14 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
|
|||
if let Some((alloc_id, offset, prov, alloc, machine)) = ptr_and_alloc {
|
||||
let range = alloc_range(offset, size);
|
||||
if !validation_in_progress {
|
||||
M::before_memory_write(tcx, machine, &mut alloc.extra, (alloc_id, prov), range)?;
|
||||
M::before_memory_write(
|
||||
tcx,
|
||||
machine,
|
||||
&mut alloc.extra,
|
||||
ptr,
|
||||
(alloc_id, prov),
|
||||
range,
|
||||
)?;
|
||||
}
|
||||
interp_ok(Some(AllocRefMut { alloc, range, tcx: *tcx, alloc_id }))
|
||||
} else {
|
||||
|
@ -1373,6 +1382,7 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
|
|||
tcx,
|
||||
&self.machine,
|
||||
&src_alloc.extra,
|
||||
src,
|
||||
(src_alloc_id, src_prov),
|
||||
src_range,
|
||||
)?;
|
||||
|
@ -1403,6 +1413,7 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
|
|||
tcx,
|
||||
extra,
|
||||
&mut dest_alloc.extra,
|
||||
dest,
|
||||
(dest_alloc_id, dest_prov),
|
||||
dest_range,
|
||||
)?;
|
||||
|
|
|
@ -1366,6 +1366,7 @@ impl<'tcx> Machine<'tcx> for MiriMachine<'tcx> {
|
|||
_tcx: TyCtxtAt<'tcx>,
|
||||
machine: &Self,
|
||||
alloc_extra: &AllocExtra<'tcx>,
|
||||
_ptr: Pointer,
|
||||
(alloc_id, prov_extra): (AllocId, Self::ProvenanceExtra),
|
||||
range: AllocRange,
|
||||
) -> InterpResult<'tcx> {
|
||||
|
@ -1390,6 +1391,7 @@ impl<'tcx> Machine<'tcx> for MiriMachine<'tcx> {
|
|||
_tcx: TyCtxtAt<'tcx>,
|
||||
machine: &mut Self,
|
||||
alloc_extra: &mut AllocExtra<'tcx>,
|
||||
_ptr: Pointer,
|
||||
(alloc_id, prov_extra): (AllocId, Self::ProvenanceExtra),
|
||||
range: AllocRange,
|
||||
) -> InterpResult<'tcx> {
|
||||
|
@ -1414,6 +1416,7 @@ impl<'tcx> Machine<'tcx> for MiriMachine<'tcx> {
|
|||
_tcx: TyCtxtAt<'tcx>,
|
||||
machine: &mut Self,
|
||||
alloc_extra: &mut AllocExtra<'tcx>,
|
||||
_ptr: Pointer,
|
||||
(alloc_id, prove_extra): (AllocId, Self::ProvenanceExtra),
|
||||
size: Size,
|
||||
align: Align,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue