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:
Matthias Krüger
2025-03-21 06:56:47 +01:00
committed by GitHub
4 changed files with 26 additions and 2 deletions
@@ -22,7 +22,7 @@
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 @@ fn before_memory_write(
_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 @@ fn init_local_allocation(
) -> 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 @@ fn before_memory_read(
_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 @@ fn before_alloc_read(_ecx: &InterpCx<'tcx, Self>, _alloc_id: AllocId) -> InterpR
/// 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 @@ fn before_memory_write(
}
/// 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 @@ pub fn deallocate_ptr(
self.tcx,
&mut self.machine,
&mut alloc.extra,
ptr,
(alloc_id, prov),
size,
alloc.align,
@@ -727,6 +728,7 @@ pub fn get_ptr_alloc<'a>(
self.tcx,
&self.machine,
&alloc.extra,
ptr,
(alloc_id, prov),
range,
)?;
@@ -816,7 +818,14 @@ pub fn get_ptr_alloc_mut<'a>(
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 @@ pub fn mem_copy_repeatedly(
tcx,
&self.machine,
&src_alloc.extra,
src,
(src_alloc_id, src_prov),
src_range,
)?;
@@ -1403,6 +1413,7 @@ pub fn mem_copy_repeatedly(
tcx,
extra,
&mut dest_alloc.extra,
dest,
(dest_alloc_id, dest_prov),
dest_range,
)?;
+3
View File
@@ -1366,6 +1366,7 @@ fn before_memory_read(
_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 @@ fn before_memory_write(
_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 @@ fn before_memory_deallocation(
_tcx: TyCtxtAt<'tcx>,
machine: &mut Self,
alloc_extra: &mut AllocExtra<'tcx>,
_ptr: Pointer,
(alloc_id, prove_extra): (AllocId, Self::ProvenanceExtra),
size: Size,
align: Align,