|
4 | 4 |
|
5 | 5 | use either::Either;
|
6 | 6 | use rustc_index::IndexSlice;
|
7 |
| -use rustc_middle::ty::layout::LayoutOf; |
8 |
| -use rustc_middle::{bug, mir, span_bug}; |
| 7 | +use rustc_middle::{bug, mir}; |
9 | 8 | use rustc_target::abi::{FieldIdx, FIRST_VARIANT};
|
10 | 9 | use tracing::{info, instrument, trace};
|
11 | 10 |
|
@@ -94,7 +93,7 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
|
94 | 93 | M::retag_place_contents(self, *kind, &dest)?;
|
95 | 94 | }
|
96 | 95 |
|
97 |
| - Intrinsic(box intrinsic) => self.emulate_nondiverging_intrinsic(intrinsic)?, |
| 96 | + Intrinsic(box intrinsic) => self.eval_nondiverging_intrinsic(intrinsic)?, |
98 | 97 |
|
99 | 98 | // Evaluate the place expression, without reading from it.
|
100 | 99 | PlaceMention(box place) => {
|
@@ -179,6 +178,12 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
|
179 | 178 | self.write_immediate(*result, &dest)?;
|
180 | 179 | }
|
181 | 180 |
|
| 181 | + NullaryOp(null_op, ty) => { |
| 182 | + let ty = self.instantiate_from_current_frame_and_normalize_erasing_regions(ty)?; |
| 183 | + let val = self.nullary_op(null_op, ty)?; |
| 184 | + self.write_immediate(*val, &dest)?; |
| 185 | + } |
| 186 | + |
182 | 187 | Aggregate(box ref kind, ref operands) => {
|
183 | 188 | self.write_aggregate(kind, operands, &dest)?;
|
184 | 189 | }
|
@@ -230,38 +235,6 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
|
230 | 235 | self.write_immediate(*val, &dest)?;
|
231 | 236 | }
|
232 | 237 |
|
233 |
| - NullaryOp(ref null_op, ty) => { |
234 |
| - let ty = self.instantiate_from_current_frame_and_normalize_erasing_regions(ty)?; |
235 |
| - let layout = self.layout_of(ty)?; |
236 |
| - if let mir::NullOp::SizeOf | mir::NullOp::AlignOf = null_op |
237 |
| - && layout.is_unsized() |
238 |
| - { |
239 |
| - span_bug!( |
240 |
| - self.frame().current_span(), |
241 |
| - "{null_op:?} MIR operator called for unsized type {ty}", |
242 |
| - ); |
243 |
| - } |
244 |
| - let val = match null_op { |
245 |
| - mir::NullOp::SizeOf => { |
246 |
| - let val = layout.size.bytes(); |
247 |
| - Scalar::from_target_usize(val, self) |
248 |
| - } |
249 |
| - mir::NullOp::AlignOf => { |
250 |
| - let val = layout.align.abi.bytes(); |
251 |
| - Scalar::from_target_usize(val, self) |
252 |
| - } |
253 |
| - mir::NullOp::OffsetOf(fields) => { |
254 |
| - let val = self |
255 |
| - .tcx |
256 |
| - .offset_of_subfield(self.param_env, layout, fields.iter()) |
257 |
| - .bytes(); |
258 |
| - Scalar::from_target_usize(val, self) |
259 |
| - } |
260 |
| - mir::NullOp::UbChecks => Scalar::from_bool(self.tcx.sess.ub_checks()), |
261 |
| - }; |
262 |
| - self.write_scalar(val, &dest)?; |
263 |
| - } |
264 |
| - |
265 | 238 | ShallowInitBox(ref operand, _) => {
|
266 | 239 | let src = self.eval_operand(operand, None)?;
|
267 | 240 | let v = self.read_immediate(&src)?;
|
|
0 commit comments