Rustc changes for permissive provenance
This commit is contained in:
@@ -770,7 +770,9 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
||||
if reachable.insert(id) {
|
||||
// This is a new allocation, add its relocations to `todo`.
|
||||
if let Some((_, alloc)) = self.memory.alloc_map.get(id) {
|
||||
todo.extend(alloc.relocations().values().map(|tag| tag.get_alloc_id()));
|
||||
todo.extend(
|
||||
alloc.relocations().values().filter_map(|tag| tag.get_alloc_id()),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -805,7 +807,7 @@ impl<'a, 'mir, 'tcx, M: Machine<'mir, 'tcx>> std::fmt::Debug for DumpAllocs<'a,
|
||||
allocs_to_print: &mut VecDeque<AllocId>,
|
||||
alloc: &Allocation<Tag, Extra>,
|
||||
) -> std::fmt::Result {
|
||||
for alloc_id in alloc.relocations().values().map(|tag| tag.get_alloc_id()) {
|
||||
for alloc_id in alloc.relocations().values().filter_map(|tag| tag.get_alloc_id()) {
|
||||
allocs_to_print.push_back(alloc_id);
|
||||
}
|
||||
write!(fmt, "{}", display_allocation(tcx, alloc))
|
||||
@@ -1125,7 +1127,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
||||
Err(ptr) => ptr.into(),
|
||||
Ok(bits) => {
|
||||
let addr = u64::try_from(bits).unwrap();
|
||||
let ptr = M::ptr_from_addr(&self, addr);
|
||||
let ptr = M::ptr_from_addr_transmute(&self, addr);
|
||||
if addr == 0 {
|
||||
assert!(ptr.provenance.is_none(), "null pointer can never have an AllocId");
|
||||
}
|
||||
@@ -1165,10 +1167,14 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
||||
ptr: Pointer<Option<M::PointerTag>>,
|
||||
) -> Result<(AllocId, Size, M::TagExtra), u64> {
|
||||
match ptr.into_pointer_or_addr() {
|
||||
Ok(ptr) => {
|
||||
let (alloc_id, offset, extra) = M::ptr_get_alloc(self, ptr);
|
||||
Ok((alloc_id, offset, extra))
|
||||
}
|
||||
Ok(ptr) => match M::ptr_get_alloc(self, ptr) {
|
||||
Some((alloc_id, offset, extra)) => Ok((alloc_id, offset, extra)),
|
||||
None => {
|
||||
assert!(M::PointerTag::OFFSET_IS_ADDR);
|
||||
let (_, addr) = ptr.into_parts();
|
||||
Err(addr.bytes())
|
||||
}
|
||||
},
|
||||
Err(addr) => Err(addr.bytes()),
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user