Move some logic using rustc datastructures to the rustc_smir
module
This commit is contained in:
parent
03b03f9fee
commit
92cfd209f1
124
compiler/rustc_smir/src/rustc_smir/alloc.rs
Normal file
124
compiler/rustc_smir/src/rustc_smir/alloc.rs
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
use rustc_middle::mir::interpret::{alloc_range, AllocRange, ConstValue, Pointer};
|
||||||
|
|
||||||
|
use crate::{
|
||||||
|
rustc_internal::opaque,
|
||||||
|
rustc_smir::{Stable, Tables},
|
||||||
|
stable_mir::mir::Mutability,
|
||||||
|
stable_mir::ty::{Allocation, ProvenanceMap},
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Creates new empty `Allocation` from given `Align`.
|
||||||
|
fn new_empty_allocation(align: rustc_target::abi::Align) -> Allocation {
|
||||||
|
Allocation {
|
||||||
|
bytes: Vec::new(),
|
||||||
|
provenance: ProvenanceMap { ptrs: Vec::new() },
|
||||||
|
align: align.bytes(),
|
||||||
|
mutability: Mutability::Not,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// We need this method instead of a Stable implementation
|
||||||
|
// because we need to get `Ty` of the const we are trying to create, to do that
|
||||||
|
// we need to have access to `ConstantKind` but we can't access that inside Stable impl.
|
||||||
|
#[allow(rustc::usage_of_qualified_ty)]
|
||||||
|
pub fn new_allocation<'tcx>(
|
||||||
|
ty: rustc_middle::ty::Ty<'tcx>,
|
||||||
|
const_value: ConstValue<'tcx>,
|
||||||
|
tables: &mut Tables<'tcx>,
|
||||||
|
) -> Allocation {
|
||||||
|
match const_value {
|
||||||
|
ConstValue::Scalar(scalar) => {
|
||||||
|
let size = scalar.size();
|
||||||
|
let align = tables
|
||||||
|
.tcx
|
||||||
|
.layout_of(rustc_middle::ty::ParamEnv::reveal_all().and(ty))
|
||||||
|
.unwrap()
|
||||||
|
.align;
|
||||||
|
let mut allocation = rustc_middle::mir::interpret::Allocation::uninit(size, align.abi);
|
||||||
|
allocation
|
||||||
|
.write_scalar(&tables.tcx, alloc_range(rustc_target::abi::Size::ZERO, size), scalar)
|
||||||
|
.unwrap();
|
||||||
|
allocation.stable(tables)
|
||||||
|
}
|
||||||
|
ConstValue::ZeroSized => {
|
||||||
|
let align =
|
||||||
|
tables.tcx.layout_of(rustc_middle::ty::ParamEnv::empty().and(ty)).unwrap().align;
|
||||||
|
new_empty_allocation(align.abi)
|
||||||
|
}
|
||||||
|
ConstValue::Slice { data, start, end } => {
|
||||||
|
let alloc_id = tables.tcx.create_memory_alloc(data);
|
||||||
|
let ptr = Pointer::new(alloc_id, rustc_target::abi::Size::from_bytes(start));
|
||||||
|
let scalar_ptr = rustc_middle::mir::interpret::Scalar::from_pointer(ptr, &tables.tcx);
|
||||||
|
let scalar_len = rustc_middle::mir::interpret::Scalar::from_target_usize(
|
||||||
|
(end - start) as u64,
|
||||||
|
&tables.tcx,
|
||||||
|
);
|
||||||
|
let layout =
|
||||||
|
tables.tcx.layout_of(rustc_middle::ty::ParamEnv::reveal_all().and(ty)).unwrap();
|
||||||
|
let mut allocation =
|
||||||
|
rustc_middle::mir::interpret::Allocation::uninit(layout.size, layout.align.abi);
|
||||||
|
allocation
|
||||||
|
.write_scalar(
|
||||||
|
&tables.tcx,
|
||||||
|
alloc_range(rustc_target::abi::Size::ZERO, tables.tcx.data_layout.pointer_size),
|
||||||
|
scalar_ptr,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
allocation
|
||||||
|
.write_scalar(
|
||||||
|
&tables.tcx,
|
||||||
|
alloc_range(tables.tcx.data_layout.pointer_size, scalar_len.size()),
|
||||||
|
scalar_len,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
allocation.stable(tables)
|
||||||
|
}
|
||||||
|
ConstValue::ByRef { alloc, offset } => {
|
||||||
|
let ty_size = tables
|
||||||
|
.tcx
|
||||||
|
.layout_of(rustc_middle::ty::ParamEnv::reveal_all().and(ty))
|
||||||
|
.unwrap()
|
||||||
|
.size;
|
||||||
|
allocation_filter(&alloc.0, alloc_range(offset, ty_size), tables)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Creates an `Allocation` only from information within the `AllocRange`.
|
||||||
|
pub(super) fn allocation_filter<'tcx>(
|
||||||
|
alloc: &rustc_middle::mir::interpret::Allocation,
|
||||||
|
alloc_range: AllocRange,
|
||||||
|
tables: &mut Tables<'tcx>,
|
||||||
|
) -> Allocation {
|
||||||
|
let mut bytes: Vec<Option<u8>> = alloc
|
||||||
|
.inspect_with_uninit_and_ptr_outside_interpreter(
|
||||||
|
alloc_range.start.bytes_usize()..alloc_range.end().bytes_usize(),
|
||||||
|
)
|
||||||
|
.iter()
|
||||||
|
.copied()
|
||||||
|
.map(Some)
|
||||||
|
.collect();
|
||||||
|
for (i, b) in bytes.iter_mut().enumerate() {
|
||||||
|
if !alloc
|
||||||
|
.init_mask()
|
||||||
|
.get(rustc_target::abi::Size::from_bytes(i + alloc_range.start.bytes_usize()))
|
||||||
|
{
|
||||||
|
*b = None;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let mut ptrs = Vec::new();
|
||||||
|
for (offset, prov) in alloc
|
||||||
|
.provenance()
|
||||||
|
.ptrs()
|
||||||
|
.iter()
|
||||||
|
.filter(|a| a.0 >= alloc_range.start && a.0 <= alloc_range.end())
|
||||||
|
{
|
||||||
|
ptrs.push((offset.bytes_usize() - alloc_range.start.bytes_usize(), opaque(prov)));
|
||||||
|
}
|
||||||
|
Allocation {
|
||||||
|
bytes: bytes,
|
||||||
|
provenance: ProvenanceMap { ptrs },
|
||||||
|
align: alloc.align.bytes(),
|
||||||
|
mutability: alloc.mutability.stable(tables),
|
||||||
|
}
|
||||||
|
}
|
@ -9,10 +9,7 @@
|
|||||||
|
|
||||||
use crate::rustc_internal::{self, opaque};
|
use crate::rustc_internal::{self, opaque};
|
||||||
use crate::stable_mir::mir::{CopyNonOverlapping, UserTypeProjection, VariantIdx};
|
use crate::stable_mir::mir::{CopyNonOverlapping, UserTypeProjection, VariantIdx};
|
||||||
use crate::stable_mir::ty::{
|
use crate::stable_mir::ty::{FloatTy, GenericParamDef, IntTy, Movability, RigidTy, TyKind, UintTy};
|
||||||
allocation_filter, new_allocation, FloatTy, GenericParamDef, IntTy, Movability, RigidTy,
|
|
||||||
TyKind, UintTy,
|
|
||||||
};
|
|
||||||
use crate::stable_mir::{self, Context};
|
use crate::stable_mir::{self, Context};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_middle::mir::interpret::alloc_range;
|
use rustc_middle::mir::interpret::alloc_range;
|
||||||
@ -22,6 +19,8 @@ use rustc_span::def_id::{CrateNum, DefId, LOCAL_CRATE};
|
|||||||
use rustc_target::abi::FieldIdx;
|
use rustc_target::abi::FieldIdx;
|
||||||
use tracing::debug;
|
use tracing::debug;
|
||||||
|
|
||||||
|
mod alloc;
|
||||||
|
|
||||||
impl<'tcx> Context for Tables<'tcx> {
|
impl<'tcx> Context for Tables<'tcx> {
|
||||||
fn local_crate(&self) -> stable_mir::Crate {
|
fn local_crate(&self) -> stable_mir::Crate {
|
||||||
smir_crate(self.tcx, LOCAL_CRATE)
|
smir_crate(self.tcx, LOCAL_CRATE)
|
||||||
@ -1085,7 +1084,7 @@ impl<'tcx> Stable<'tcx> for ty::Const<'tcx> {
|
|||||||
literal: match self.kind() {
|
literal: match self.kind() {
|
||||||
ty::Value(val) => {
|
ty::Value(val) => {
|
||||||
let const_val = tables.tcx.valtree_to_const_val((self.ty(), val));
|
let const_val = tables.tcx.valtree_to_const_val((self.ty(), val));
|
||||||
stable_mir::ty::ConstantKind::Allocated(new_allocation(
|
stable_mir::ty::ConstantKind::Allocated(alloc::new_allocation(
|
||||||
self.ty(),
|
self.ty(),
|
||||||
const_val,
|
const_val,
|
||||||
tables,
|
tables,
|
||||||
@ -1130,7 +1129,11 @@ impl<'tcx> Stable<'tcx> for mir::interpret::Allocation {
|
|||||||
type T = stable_mir::ty::Allocation;
|
type T = stable_mir::ty::Allocation;
|
||||||
|
|
||||||
fn stable(&self, tables: &mut Tables<'tcx>) -> Self::T {
|
fn stable(&self, tables: &mut Tables<'tcx>) -> Self::T {
|
||||||
allocation_filter(self, alloc_range(rustc_target::abi::Size::ZERO, self.size()), tables)
|
alloc::allocation_filter(
|
||||||
|
self,
|
||||||
|
alloc_range(rustc_target::abi::Size::ZERO, self.size()),
|
||||||
|
tables,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1188,7 +1191,7 @@ impl<'tcx> Stable<'tcx> for rustc_middle::mir::ConstantKind<'tcx> {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
ConstantKind::Val(val, ty) => {
|
ConstantKind::Val(val, ty) => {
|
||||||
stable_mir::ty::ConstantKind::Allocated(new_allocation(ty, val, tables))
|
stable_mir::ty::ConstantKind::Allocated(alloc::new_allocation(ty, val, tables))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,5 @@
|
|||||||
use rustc_middle::mir::interpret::{alloc_range, AllocRange, ConstValue, Pointer};
|
|
||||||
|
|
||||||
use super::{mir::Mutability, mir::Safety, with, DefId};
|
use super::{mir::Mutability, mir::Safety, with, DefId};
|
||||||
use crate::{
|
use crate::rustc_internal::Opaque;
|
||||||
rustc_internal::{opaque, Opaque},
|
|
||||||
rustc_smir::{Stable, Tables},
|
|
||||||
};
|
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug)]
|
#[derive(Copy, Clone, Debug)]
|
||||||
pub struct Ty(pub usize);
|
pub struct Ty(pub usize);
|
||||||
@ -286,124 +281,6 @@ pub struct Allocation {
|
|||||||
pub mutability: Mutability,
|
pub mutability: Mutability,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Allocation {
|
|
||||||
/// Creates new empty `Allocation` from given `Align`.
|
|
||||||
fn new_empty_allocation(align: rustc_target::abi::Align) -> Allocation {
|
|
||||||
Allocation {
|
|
||||||
bytes: Vec::new(),
|
|
||||||
provenance: ProvenanceMap { ptrs: Vec::new() },
|
|
||||||
align: align.bytes(),
|
|
||||||
mutability: Mutability::Not,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// We need this method instead of a Stable implementation
|
|
||||||
// because we need to get `Ty` of the const we are trying to create, to do that
|
|
||||||
// we need to have access to `ConstantKind` but we can't access that inside Stable impl.
|
|
||||||
#[allow(rustc::usage_of_qualified_ty)]
|
|
||||||
pub fn new_allocation<'tcx>(
|
|
||||||
ty: rustc_middle::ty::Ty<'tcx>,
|
|
||||||
const_value: ConstValue<'tcx>,
|
|
||||||
tables: &mut Tables<'tcx>,
|
|
||||||
) -> Allocation {
|
|
||||||
match const_value {
|
|
||||||
ConstValue::Scalar(scalar) => {
|
|
||||||
let size = scalar.size();
|
|
||||||
let align = tables
|
|
||||||
.tcx
|
|
||||||
.layout_of(rustc_middle::ty::ParamEnv::reveal_all().and(ty))
|
|
||||||
.unwrap()
|
|
||||||
.align;
|
|
||||||
let mut allocation = rustc_middle::mir::interpret::Allocation::uninit(size, align.abi);
|
|
||||||
allocation
|
|
||||||
.write_scalar(&tables.tcx, alloc_range(rustc_target::abi::Size::ZERO, size), scalar)
|
|
||||||
.unwrap();
|
|
||||||
allocation.stable(tables)
|
|
||||||
}
|
|
||||||
ConstValue::ZeroSized => {
|
|
||||||
let align =
|
|
||||||
tables.tcx.layout_of(rustc_middle::ty::ParamEnv::empty().and(ty)).unwrap().align;
|
|
||||||
Allocation::new_empty_allocation(align.abi)
|
|
||||||
}
|
|
||||||
ConstValue::Slice { data, start, end } => {
|
|
||||||
let alloc_id = tables.tcx.create_memory_alloc(data);
|
|
||||||
let ptr = Pointer::new(alloc_id, rustc_target::abi::Size::from_bytes(start));
|
|
||||||
let scalar_ptr = rustc_middle::mir::interpret::Scalar::from_pointer(ptr, &tables.tcx);
|
|
||||||
let scalar_len = rustc_middle::mir::interpret::Scalar::from_target_usize(
|
|
||||||
(end - start) as u64,
|
|
||||||
&tables.tcx,
|
|
||||||
);
|
|
||||||
let layout =
|
|
||||||
tables.tcx.layout_of(rustc_middle::ty::ParamEnv::reveal_all().and(ty)).unwrap();
|
|
||||||
let mut allocation =
|
|
||||||
rustc_middle::mir::interpret::Allocation::uninit(layout.size, layout.align.abi);
|
|
||||||
allocation
|
|
||||||
.write_scalar(
|
|
||||||
&tables.tcx,
|
|
||||||
alloc_range(rustc_target::abi::Size::ZERO, tables.tcx.data_layout.pointer_size),
|
|
||||||
scalar_ptr,
|
|
||||||
)
|
|
||||||
.unwrap();
|
|
||||||
allocation
|
|
||||||
.write_scalar(
|
|
||||||
&tables.tcx,
|
|
||||||
alloc_range(tables.tcx.data_layout.pointer_size, scalar_len.size()),
|
|
||||||
scalar_len,
|
|
||||||
)
|
|
||||||
.unwrap();
|
|
||||||
allocation.stable(tables)
|
|
||||||
}
|
|
||||||
ConstValue::ByRef { alloc, offset } => {
|
|
||||||
let ty_size = tables
|
|
||||||
.tcx
|
|
||||||
.layout_of(rustc_middle::ty::ParamEnv::reveal_all().and(ty))
|
|
||||||
.unwrap()
|
|
||||||
.size;
|
|
||||||
allocation_filter(&alloc.0, alloc_range(offset, ty_size), tables)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Creates an `Allocation` only from information within the `AllocRange`.
|
|
||||||
pub fn allocation_filter<'tcx>(
|
|
||||||
alloc: &rustc_middle::mir::interpret::Allocation,
|
|
||||||
alloc_range: AllocRange,
|
|
||||||
tables: &mut Tables<'tcx>,
|
|
||||||
) -> Allocation {
|
|
||||||
let mut bytes: Vec<Option<u8>> = alloc
|
|
||||||
.inspect_with_uninit_and_ptr_outside_interpreter(
|
|
||||||
alloc_range.start.bytes_usize()..alloc_range.end().bytes_usize(),
|
|
||||||
)
|
|
||||||
.iter()
|
|
||||||
.copied()
|
|
||||||
.map(Some)
|
|
||||||
.collect();
|
|
||||||
for (i, b) in bytes.iter_mut().enumerate() {
|
|
||||||
if !alloc
|
|
||||||
.init_mask()
|
|
||||||
.get(rustc_target::abi::Size::from_bytes(i + alloc_range.start.bytes_usize()))
|
|
||||||
{
|
|
||||||
*b = None;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let mut ptrs = Vec::new();
|
|
||||||
for (offset, prov) in alloc
|
|
||||||
.provenance()
|
|
||||||
.ptrs()
|
|
||||||
.iter()
|
|
||||||
.filter(|a| a.0 >= alloc_range.start && a.0 <= alloc_range.end())
|
|
||||||
{
|
|
||||||
ptrs.push((offset.bytes_usize() - alloc_range.start.bytes_usize(), opaque(prov)));
|
|
||||||
}
|
|
||||||
Allocation {
|
|
||||||
bytes: bytes,
|
|
||||||
provenance: ProvenanceMap { ptrs },
|
|
||||||
align: alloc.align.bytes(),
|
|
||||||
mutability: alloc.mutability.stable(tables),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub enum ConstantKind {
|
pub enum ConstantKind {
|
||||||
Allocated(Allocation),
|
Allocated(Allocation),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user