diff options
| -rw-r--r-- | src/librustc/mir/interpret/allocation.rs | 28 | ||||
| m--------- | src/tools/miri | 15 |
2 files changed, 33 insertions, 10 deletions
diff --git a/src/librustc/mir/interpret/allocation.rs b/src/librustc/mir/interpret/allocation.rs index df1d9a98701..13552a61acb 100644 --- a/src/librustc/mir/interpret/allocation.rs +++ b/src/librustc/mir/interpret/allocation.rs @@ -130,6 +130,34 @@ impl<Tag> Allocation<Tag> { } } +impl Allocation<()> { + /// Add Tag and Extra fields + pub fn retag<T, E>( + self, + mut tagger: impl FnMut(AllocId) -> T, + extra: E, + ) -> Allocation<T, E> { + Allocation { + bytes: self.bytes, + size: self.size, + relocations: Relocations::from_presorted( + self.relocations.iter() + // The allocations in the relocations (pointers stored *inside* this allocation) + // all get the base pointer tag. + .map(|&(offset, ((), alloc))| { + let tag = tagger(alloc); + (offset, (tag, alloc)) + }) + .collect() + ), + undef_mask: self.undef_mask, + align: self.align, + mutability: self.mutability, + extra, + } + } +} + /// Raw accessors. Provide access to otherwise private bytes. impl<Tag, Extra> Allocation<Tag, Extra> { pub fn len(&self) -> usize { diff --git a/src/tools/miri b/src/tools/miri -Subproject 69268fb75fdb452296caa9bc4aaeff1674279de +Subproject e479ab26406ed8a473987e5f4a1f3be3e978e5d |
