diff options
| author | Matthias Krüger <476013+matthiaskrgr@users.noreply.github.com> | 2025-03-21 06:56:47 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-03-21 06:56:47 +0100 |
| commit | 7c1b128383a397945686dba983747bd1b0efd43e (patch) | |
| tree | 521c9385f1c86db29f5d7ef740a44e00706ab2ef /compiler/rustc_const_eval/src | |
| parent | ff8738a0f7d51b496c2a9178d70bfa58f667da67 (diff) | |
| parent | b9f59f61078b2dbcf9f2bfffb0459842ee854e03 (diff) | |
| download | rust-7c1b128383a397945686dba983747bd1b0efd43e.tar.gz rust-7c1b128383a397945686dba983747bd1b0efd43e.zip | |
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`
Diffstat (limited to 'compiler/rustc_const_eval/src')
| -rw-r--r-- | compiler/rustc_const_eval/src/const_eval/machine.rs | 3 | ||||
| -rw-r--r-- | compiler/rustc_const_eval/src/interpret/machine.rs | 9 | ||||
| -rw-r--r-- | compiler/rustc_const_eval/src/interpret/memory.rs | 13 |
3 files changed, 23 insertions, 2 deletions
diff --git a/compiler/rustc_const_eval/src/const_eval/machine.rs b/compiler/rustc_const_eval/src/const_eval/machine.rs index 4db862afd9f..496f6c86f71 100644 --- a/compiler/rustc_const_eval/src/const_eval/machine.rs +++ b/compiler/rustc_const_eval/src/const_eval/machine.rs @@ -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> { diff --git a/compiler/rustc_const_eval/src/interpret/machine.rs b/compiler/rustc_const_eval/src/interpret/machine.rs index a21bf018d01..e5026eff21f 100644 --- a/compiler/rustc_const_eval/src/interpret/machine.rs +++ b/compiler/rustc_const_eval/src/interpret/machine.rs @@ -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, diff --git a/compiler/rustc_const_eval/src/interpret/memory.rs b/compiler/rustc_const_eval/src/interpret/memory.rs index 75726269a86..8f286971e63 100644 --- a/compiler/rustc_const_eval/src/interpret/memory.rs +++ b/compiler/rustc_const_eval/src/interpret/memory.rs @@ -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, )?; |
