interpret memory access hooks: also pass through the Pointer used for the access
This commit is contained in:
@@ -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,
|
||||
)?;
|
||||
|
||||
Reference in New Issue
Block a user