diff options
| author | Ralf Jung <post@ralfj.de> | 2024-05-27 23:28:32 +0200 |
|---|---|---|
| committer | Ralf Jung <post@ralfj.de> | 2024-05-27 23:33:54 +0200 |
| commit | 869306418d47f9755f81e1dec9749a167e98d155 (patch) | |
| tree | d515021fed0c84bb37bc9f4057860c6ca41e0641 /compiler/rustc_middle/src | |
| parent | b0f86189380c64e4a090233a0a0a97f1e87fe88e (diff) | |
| download | rust-869306418d47f9755f81e1dec9749a167e98d155.tar.gz rust-869306418d47f9755f81e1dec9749a167e98d155.zip | |
miri: avoid making a full copy of all new allocations
Diffstat (limited to 'compiler/rustc_middle/src')
| -rw-r--r-- | compiler/rustc_middle/src/mir/interpret/allocation.rs | 43 |
1 files changed, 21 insertions, 22 deletions
diff --git a/compiler/rustc_middle/src/mir/interpret/allocation.rs b/compiler/rustc_middle/src/mir/interpret/allocation.rs index 791e87735f4..b0f8a047b82 100644 --- a/compiler/rustc_middle/src/mir/interpret/allocation.rs +++ b/compiler/rustc_middle/src/mir/interpret/allocation.rs @@ -266,19 +266,6 @@ impl AllocRange { // The constructors are all without extra; the extra gets added by a machine hook later. impl<Prov: Provenance, Bytes: AllocBytes> Allocation<Prov, (), Bytes> { - /// Creates an allocation from an existing `Bytes` value - this is needed for miri FFI support - pub fn from_raw_bytes(bytes: Bytes, align: Align, mutability: Mutability) -> Self { - let size = Size::from_bytes(bytes.len()); - Self { - bytes, - provenance: ProvenanceMap::new(), - init_mask: InitMask::new(size, true), - align, - mutability, - extra: (), - } - } - /// Creates an allocation initialized by the given bytes pub fn from_bytes<'a>( slice: impl Into<Cow<'a, [u8]>>, @@ -342,18 +329,30 @@ impl<Prov: Provenance, Bytes: AllocBytes> Allocation<Prov, (), Bytes> { Err(x) => x, } } + + /// Add the extra. + pub fn with_extra<Extra>(self, extra: Extra) -> Allocation<Prov, Extra, Bytes> { + Allocation { + bytes: self.bytes, + provenance: self.provenance, + init_mask: self.init_mask, + align: self.align, + mutability: self.mutability, + extra, + } + } } impl Allocation { /// Adjust allocation from the ones in `tcx` to a custom Machine instance - /// with a different `Provenance`, `Extra` and `Byte` type. - pub fn adjust_from_tcx<Prov: Provenance, Extra, Bytes: AllocBytes, Err>( - self, + /// with a different `Provenance` and `Byte` type. + pub fn adjust_from_tcx<Prov: Provenance, Bytes: AllocBytes, Err>( + &self, cx: &impl HasDataLayout, - extra: Extra, mut adjust_ptr: impl FnMut(Pointer<CtfeProvenance>) -> Result<Pointer<Prov>, Err>, - ) -> Result<Allocation<Prov, Extra, Bytes>, Err> { - let mut bytes = self.bytes; + ) -> Result<Allocation<Prov, (), Bytes>, Err> { + // Copy the data. + let mut bytes = Bytes::from_bytes(Cow::Borrowed(&*self.bytes), self.align); // Adjust provenance of pointers stored in this allocation. let mut new_provenance = Vec::with_capacity(self.provenance.ptrs().len()); let ptr_size = cx.data_layout().pointer_size.bytes_usize(); @@ -369,12 +368,12 @@ impl Allocation { } // Create allocation. Ok(Allocation { - bytes: AllocBytes::from_bytes(Cow::Owned(Vec::from(bytes)), self.align), + bytes, provenance: ProvenanceMap::from_presorted_ptrs(new_provenance), - init_mask: self.init_mask, + init_mask: self.init_mask.clone(), align: self.align, mutability: self.mutability, - extra, + extra: self.extra, }) } } |
