diff --git a/src/lvalue.rs b/src/lvalue.rs index 045f4f715b63349da010d9ccd797376bf419bed7..9d6145ec793e79b8f11d9279d3e343782de47cef 100644 --- a/src/lvalue.rs +++ b/src/lvalue.rs @@ -363,17 +363,12 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> { PrimVal::Bytes(elem_size as u128), PrimValKind::U64); - match self.memory.constraints.add_binop_constraint( + let offset = self.memory.constraints.add_binop_constraint( mir::BinOp::Add, p.offset.as_primval(), byte_index, - PrimValKind::U64) { - PrimVal::Abstract(sbytes) => { - PrimVal::Ptr(Pointer::new_abstract(p.alloc_id, sbytes)) - } - _ => unreachable!(), - } - + PrimValKind::U64); + PrimVal::Ptr(Pointer::with_primval_offset(p.alloc_id, offset)) } (Err(_), 0) => base_ptr, (Err(e), _) => return Err(e), diff --git a/src/memory.rs b/src/memory.rs index 83a637a0aee7cd407e60625bf97bdd04a311c35c..124275d860318d76c110e5c95ee93166f9ca2e45 100644 --- a/src/memory.rs +++ b/src/memory.rs @@ -96,6 +96,15 @@ impl Pointer { Pointer { alloc_id, offset: PointerOffset::Abstract(offset), } } + pub fn with_primval_offset(alloc_id: AllocId, offset: PrimVal) -> Self { + match offset { + PrimVal::Abstract(sbytes) => Pointer::new_abstract(alloc_id, sbytes), + PrimVal::Bytes(b) => Pointer::new(alloc_id, b as u64), + PrimVal::Undef => panic!("tried to construct pointer with undefined offset"), + PrimVal::Ptr(_) => panic!("tried to construct point with pointer offset"), + } + } + pub fn has_concrete_offset(self) -> bool { match self.offset { PointerOffset::Concrete(_) => true, diff --git a/src/terminator/intrinsic.rs b/src/terminator/intrinsic.rs index 79b6b96b1f14f946999352b75e9b3eac08fd7fa0..405a331a9cb29fa7d61cb8de884aea7852d5fa56 100644 --- a/src/terminator/intrinsic.rs +++ b/src/terminator/intrinsic.rs @@ -331,12 +331,8 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> { ptr.to_ptr()?.offset.as_primval(), byte_offset, PrimValKind::U64); - if let PrimVal::Abstract(sbytes) = new_offset { - let new_ptr = Pointer::new_abstract(ptr.to_ptr()?.alloc_id, sbytes); - self.write_primval(dest, PrimVal::Ptr(new_ptr), dest_ty)?; - } else { - unreachable!() - } + let new_ptr = Pointer::with_primval_offset(ptr.to_ptr()?.alloc_id, new_offset); + self.write_primval(dest, PrimVal::Ptr(new_ptr), dest_ty)?; } }