Use it in the library, and InstSimplify
it away in the easy places
This commit is contained in:
parent
4f4442655e
commit
de64ff76f8
11 changed files with 328 additions and 28 deletions
|
@ -603,6 +603,17 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
|||
Ok(self.read_immediate(op)?.to_scalar())
|
||||
}
|
||||
|
||||
pub fn read_mem_place_meta(
|
||||
&self,
|
||||
op: &impl Readable<'tcx, M::Provenance>,
|
||||
) -> InterpResult<'tcx, MemPlaceMeta<M::Provenance>> {
|
||||
Ok(if op.layout().is_zst() {
|
||||
MemPlaceMeta::None
|
||||
} else {
|
||||
MemPlaceMeta::Meta(self.read_scalar(op)?)
|
||||
})
|
||||
}
|
||||
|
||||
// Pointer-sized reads are fairly common and need target layout access, so we wrap them in
|
||||
// convenience functions.
|
||||
|
||||
|
|
|
@ -9,7 +9,7 @@ use rustc_middle::mir;
|
|||
use rustc_middle::ty::layout::LayoutOf;
|
||||
use rustc_target::abi::{FieldIdx, FIRST_VARIANT};
|
||||
|
||||
use super::{ImmTy, InterpCx, InterpResult, Machine, PlaceTy, Projectable, Scalar};
|
||||
use super::{ImmTy, Immediate, InterpCx, InterpResult, Machine, PlaceTy, Projectable, Scalar};
|
||||
use crate::util;
|
||||
|
||||
impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
||||
|
@ -303,6 +303,21 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
|||
let variant_dest = self.project_downcast(dest, variant_index)?;
|
||||
(variant_index, variant_dest, active_field_index)
|
||||
}
|
||||
mir::AggregateKind::RawPtr(..) => {
|
||||
// Trying to `project_field` into pointers tends not to work,
|
||||
// so build the `Immediate` from the parts directly.
|
||||
let [data, meta] = &operands.raw else {
|
||||
bug!("{kind:?} should have 2 operands, had {operands:?}");
|
||||
};
|
||||
let data = self.eval_operand(data, None)?;
|
||||
let data = self.read_pointer(&data)?;
|
||||
let meta = self.eval_operand(meta, None)?;
|
||||
let meta = self.read_mem_place_meta(&meta)?;
|
||||
let ptr_imm = Immediate::new_pointer_with_meta(data, meta, self);
|
||||
let ptr = ImmTy::from_immediate(ptr_imm, dest.layout);
|
||||
self.copy_op(&ptr, dest)?;
|
||||
return Ok(());
|
||||
}
|
||||
_ => (FIRST_VARIANT, dest.clone(), None),
|
||||
};
|
||||
if active_field_index.is_some() {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue