ctfe interpreter: extend provenance so that it can track whether a pointer is immutable
This commit is contained in:
parent
8e13be084a
commit
cb32ffd8da
@ -199,7 +199,8 @@ impl<'gcc, 'tcx> ConstMethods<'tcx> for CodegenCx<'gcc, 'tcx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
Scalar::Ptr(ptr, _size) => {
|
Scalar::Ptr(ptr, _size) => {
|
||||||
let (alloc_id, offset) = ptr.into_parts();
|
let (prov, offset) = ptr.into_parts(); // we know the `offset` is relative
|
||||||
|
let alloc_id = prov.alloc_id();
|
||||||
let base_addr =
|
let base_addr =
|
||||||
match self.tcx.global_alloc(alloc_id) {
|
match self.tcx.global_alloc(alloc_id) {
|
||||||
GlobalAlloc::Memory(alloc) => {
|
GlobalAlloc::Memory(alloc) => {
|
||||||
|
@ -285,7 +285,8 @@ pub fn const_alloc_to_gcc<'gcc, 'tcx>(cx: &CodegenCx<'gcc, 'tcx>, alloc: ConstAl
|
|||||||
let pointer_size = dl.pointer_size.bytes() as usize;
|
let pointer_size = dl.pointer_size.bytes() as usize;
|
||||||
|
|
||||||
let mut next_offset = 0;
|
let mut next_offset = 0;
|
||||||
for &(offset, alloc_id) in alloc.provenance().ptrs().iter() {
|
for &(offset, prov) in alloc.provenance().ptrs().iter() {
|
||||||
|
let alloc_id = prov.alloc_id();
|
||||||
let offset = offset.bytes();
|
let offset = offset.bytes();
|
||||||
assert_eq!(offset as usize as u64, offset);
|
assert_eq!(offset as usize as u64, offset);
|
||||||
let offset = offset as usize;
|
let offset = offset as usize;
|
||||||
@ -313,7 +314,7 @@ pub fn const_alloc_to_gcc<'gcc, 'tcx>(cx: &CodegenCx<'gcc, 'tcx>, alloc: ConstAl
|
|||||||
|
|
||||||
llvals.push(cx.scalar_to_backend(
|
llvals.push(cx.scalar_to_backend(
|
||||||
InterpScalar::from_pointer(
|
InterpScalar::from_pointer(
|
||||||
interpret::Pointer::new(alloc_id, Size::from_bytes(ptr_offset)),
|
interpret::Pointer::new(prov, Size::from_bytes(ptr_offset)),
|
||||||
&cx.tcx,
|
&cx.tcx,
|
||||||
),
|
),
|
||||||
abi::Scalar::Initialized { value: Primitive::Pointer(address_space), valid_range: WrappingRange::full(dl.pointer_size) },
|
abi::Scalar::Initialized { value: Primitive::Pointer(address_space), valid_range: WrappingRange::full(dl.pointer_size) },
|
||||||
|
Loading…
x
Reference in New Issue
Block a user