|
2 | 2 | //!
|
3 | 3 | //! The main entry point is the `step` method.
|
4 | 4 |
|
5 |
| -use crate::interpret::OpTy; |
6 | 5 | use rustc_middle::mir;
|
7 | 6 | use rustc_middle::mir::interpret::{InterpResult, Scalar};
|
8 | 7 | use rustc_target::abi::LayoutOf;
|
@@ -119,7 +118,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
119 | 118 | let src = self.eval_operand(src, None)?;
|
120 | 119 | let dst = self.eval_operand(dst, None)?;
|
121 | 120 | let count = self.eval_operand(count, None)?;
|
122 |
| - self.copy(&src, &dst, &count, /* nonoverlapping */ true)?; |
| 121 | + self.copy_intrinsic(&src, &dst, &count, /* nonoverlapping */ true)?; |
123 | 122 | }
|
124 | 123 |
|
125 | 124 | // Statements we do not track.
|
@@ -149,37 +148,6 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
149 | 148 | Ok(())
|
150 | 149 | }
|
151 | 150 |
|
152 |
| - pub(crate) fn copy( |
153 |
| - &mut self, |
154 |
| - src: &OpTy<'tcx, <M as Machine<'mir, 'tcx>>::PointerTag>, |
155 |
| - dst: &OpTy<'tcx, <M as Machine<'mir, 'tcx>>::PointerTag>, |
156 |
| - count: &OpTy<'tcx, <M as Machine<'mir, 'tcx>>::PointerTag>, |
157 |
| - nonoverlapping: bool, |
158 |
| - ) -> InterpResult<'tcx> { |
159 |
| - let count = self.read_scalar(&count)?.to_machine_usize(self)?; |
160 |
| - let layout = self.layout_of(src.layout.ty.builtin_deref(true).unwrap().ty)?; |
161 |
| - let (size, align) = (layout.size, layout.align.abi); |
162 |
| - let size = size.checked_mul(count, self).ok_or_else(|| { |
163 |
| - err_ub_format!( |
164 |
| - "overflow computing total size of `{}`", |
165 |
| - if nonoverlapping { "copy_nonoverlapping" } else { "copy" } |
166 |
| - ) |
167 |
| - })?; |
168 |
| - |
169 |
| - // Make sure we check both pointers for an access of the total size and aligment, |
170 |
| - // *even if* the total size is 0. |
171 |
| - let src = |
172 |
| - self.memory.check_ptr_access(self.read_scalar(&src)?.check_init()?, size, align)?; |
173 |
| - |
174 |
| - let dst = |
175 |
| - self.memory.check_ptr_access(self.read_scalar(&dst)?.check_init()?, size, align)?; |
176 |
| - |
177 |
| - if let (Some(src), Some(dst)) = (src, dst) { |
178 |
| - self.memory.copy(src, dst, size, nonoverlapping)?; |
179 |
| - } |
180 |
| - Ok(()) |
181 |
| - } |
182 |
| - |
183 | 151 | /// Evaluate an assignment statement.
|
184 | 152 | ///
|
185 | 153 | /// There is no separate `eval_rvalue` function. Instead, the code for handling each rvalue
|
|
0 commit comments