mirror of
https://github.com/rust-lang/rust.git
synced 2025-05-14 02:49:40 +00:00
Rollup merge of #114320 - ouz-a:smir_statements, r=oli-obk
Cover statements for stable_mir Added missing statements to stable_mir, used opaque types for few types that are only used for diagnostic. cc https://github.com/rust-lang/project-stable-mir/issues/16 r? `@oli-obk`
This commit is contained in:
commit
41364c7c1d
@ -8,11 +8,13 @@
|
||||
//! For now, we are developing everything inside `rustc`, thus, we keep this module private.
|
||||
|
||||
use crate::rustc_internal::{self, opaque};
|
||||
use crate::stable_mir::mir::{CopyNonOverlapping, UserTypeProjection, VariantIdx};
|
||||
use crate::stable_mir::ty::{FloatTy, IntTy, Movability, RigidTy, TyKind, UintTy};
|
||||
use crate::stable_mir::{self, Context};
|
||||
use rustc_hir as hir;
|
||||
use rustc_middle::mir;
|
||||
use rustc_middle::ty::{self, Ty, TyCtxt};
|
||||
use rustc_middle::mir::coverage::CodeRegion;
|
||||
use rustc_middle::mir::{self};
|
||||
use rustc_middle::ty::{self, Ty, TyCtxt, Variance};
|
||||
use rustc_span::def_id::{CrateNum, DefId, LOCAL_CRATE};
|
||||
use rustc_target::abi::FieldIdx;
|
||||
use tracing::debug;
|
||||
@ -110,17 +112,38 @@ impl<'tcx> Stable<'tcx> for mir::Statement<'tcx> {
|
||||
Assign(assign) => {
|
||||
stable_mir::mir::Statement::Assign(assign.0.stable(tables), assign.1.stable(tables))
|
||||
}
|
||||
FakeRead(_) => todo!(),
|
||||
SetDiscriminant { .. } => todo!(),
|
||||
Deinit(_) => todo!(),
|
||||
StorageLive(_) => todo!(),
|
||||
StorageDead(_) => todo!(),
|
||||
Retag(_, _) => todo!(),
|
||||
PlaceMention(_) => todo!(),
|
||||
AscribeUserType(_, _) => todo!(),
|
||||
Coverage(_) => todo!(),
|
||||
Intrinsic(_) => todo!(),
|
||||
ConstEvalCounter => todo!(),
|
||||
FakeRead(fake_read_place) => stable_mir::mir::Statement::FakeRead(
|
||||
fake_read_place.0.stable(tables),
|
||||
fake_read_place.1.stable(tables),
|
||||
),
|
||||
SetDiscriminant { place: plc, variant_index: idx } => {
|
||||
stable_mir::mir::Statement::SetDiscriminant {
|
||||
place: plc.as_ref().stable(tables),
|
||||
variant_index: idx.stable(tables),
|
||||
}
|
||||
}
|
||||
Deinit(place) => stable_mir::mir::Statement::Deinit(place.stable(tables)),
|
||||
StorageLive(place) => stable_mir::mir::Statement::StorageLive(place.stable(tables)),
|
||||
StorageDead(place) => stable_mir::mir::Statement::StorageDead(place.stable(tables)),
|
||||
Retag(retag, place) => {
|
||||
stable_mir::mir::Statement::Retag(retag.stable(tables), place.stable(tables))
|
||||
}
|
||||
PlaceMention(place) => stable_mir::mir::Statement::PlaceMention(place.stable(tables)),
|
||||
AscribeUserType(place_projection, variance) => {
|
||||
stable_mir::mir::Statement::AscribeUserType {
|
||||
place: place_projection.as_ref().0.stable(tables),
|
||||
projections: place_projection.as_ref().1.stable(tables),
|
||||
variance: variance.stable(tables),
|
||||
}
|
||||
}
|
||||
Coverage(coverage) => stable_mir::mir::Statement::Coverage(stable_mir::mir::Coverage {
|
||||
kind: coverage.kind.stable(tables),
|
||||
code_region: coverage.code_region.as_ref().map(|reg| reg.stable(tables)),
|
||||
}),
|
||||
Intrinsic(intrinstic) => {
|
||||
stable_mir::mir::Statement::Intrinsic(intrinstic.stable(tables))
|
||||
}
|
||||
ConstEvalCounter => stable_mir::mir::Statement::ConstEvalCounter,
|
||||
Nop => stable_mir::mir::Statement::Nop,
|
||||
}
|
||||
}
|
||||
@ -364,6 +387,22 @@ impl<'tcx> Stable<'tcx> for rustc_hir::Unsafety {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> Stable<'tcx> for mir::FakeReadCause {
|
||||
type T = stable_mir::mir::FakeReadCause;
|
||||
fn stable(&self, _: &mut Tables<'tcx>) -> Self::T {
|
||||
use mir::FakeReadCause::*;
|
||||
match self {
|
||||
ForMatchGuard => stable_mir::mir::FakeReadCause::ForMatchGuard,
|
||||
ForMatchedPlace(local_def_id) => {
|
||||
stable_mir::mir::FakeReadCause::ForMatchedPlace(opaque(local_def_id))
|
||||
}
|
||||
ForGuardBinding => stable_mir::mir::FakeReadCause::ForGuardBinding,
|
||||
ForLet(local_def_id) => stable_mir::mir::FakeReadCause::ForLet(opaque(local_def_id)),
|
||||
ForIndex => stable_mir::mir::FakeReadCause::ForIndex,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> Stable<'tcx> for FieldIdx {
|
||||
type T = usize;
|
||||
fn stable(&self, _: &mut Tables<'tcx>) -> Self::T {
|
||||
@ -393,6 +432,110 @@ impl<'tcx> Stable<'tcx> for mir::Place<'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> Stable<'tcx> for mir::coverage::CoverageKind {
|
||||
type T = stable_mir::mir::CoverageKind;
|
||||
fn stable(&self, tables: &mut Tables<'tcx>) -> Self::T {
|
||||
use rustc_middle::mir::coverage::CoverageKind;
|
||||
match self {
|
||||
CoverageKind::Counter { function_source_hash, id } => {
|
||||
stable_mir::mir::CoverageKind::Counter {
|
||||
function_source_hash: *function_source_hash as usize,
|
||||
id: opaque(id),
|
||||
}
|
||||
}
|
||||
CoverageKind::Expression { id, lhs, op, rhs } => {
|
||||
stable_mir::mir::CoverageKind::Expression {
|
||||
id: opaque(id),
|
||||
lhs: opaque(lhs),
|
||||
op: op.stable(tables),
|
||||
rhs: opaque(rhs),
|
||||
}
|
||||
}
|
||||
CoverageKind::Unreachable => stable_mir::mir::CoverageKind::Unreachable,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> Stable<'tcx> for mir::UserTypeProjection {
|
||||
type T = stable_mir::mir::UserTypeProjection;
|
||||
|
||||
fn stable(&self, _: &mut Tables<'tcx>) -> Self::T {
|
||||
UserTypeProjection { base: self.base.as_usize(), projection: format!("{:?}", self.projs) }
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> Stable<'tcx> for mir::coverage::Op {
|
||||
type T = stable_mir::mir::Op;
|
||||
|
||||
fn stable(&self, _: &mut Tables<'tcx>) -> Self::T {
|
||||
use rustc_middle::mir::coverage::Op::*;
|
||||
match self {
|
||||
Subtract => stable_mir::mir::Op::Subtract,
|
||||
Add => stable_mir::mir::Op::Add,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> Stable<'tcx> for mir::Local {
|
||||
type T = stable_mir::mir::Local;
|
||||
fn stable(&self, _: &mut Tables<'tcx>) -> Self::T {
|
||||
self.as_usize()
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> Stable<'tcx> for rustc_target::abi::VariantIdx {
|
||||
type T = VariantIdx;
|
||||
fn stable(&self, _: &mut Tables<'tcx>) -> Self::T {
|
||||
self.as_usize()
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> Stable<'tcx> for Variance {
|
||||
type T = stable_mir::mir::Variance;
|
||||
fn stable(&self, _: &mut Tables<'tcx>) -> Self::T {
|
||||
match self {
|
||||
Variance::Bivariant => stable_mir::mir::Variance::Bivariant,
|
||||
Variance::Contravariant => stable_mir::mir::Variance::Contravariant,
|
||||
Variance::Covariant => stable_mir::mir::Variance::Covariant,
|
||||
Variance::Invariant => stable_mir::mir::Variance::Invariant,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> Stable<'tcx> for mir::RetagKind {
|
||||
type T = stable_mir::mir::RetagKind;
|
||||
fn stable(&self, _: &mut Tables<'tcx>) -> Self::T {
|
||||
use rustc_middle::mir::RetagKind;
|
||||
match self {
|
||||
RetagKind::FnEntry => stable_mir::mir::RetagKind::FnEntry,
|
||||
RetagKind::TwoPhase => stable_mir::mir::RetagKind::TwoPhase,
|
||||
RetagKind::Raw => stable_mir::mir::RetagKind::Raw,
|
||||
RetagKind::Default => stable_mir::mir::RetagKind::Default,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> Stable<'tcx> for rustc_middle::ty::UserTypeAnnotationIndex {
|
||||
type T = usize;
|
||||
fn stable(&self, _: &mut Tables<'tcx>) -> Self::T {
|
||||
self.as_usize()
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> Stable<'tcx> for CodeRegion {
|
||||
type T = stable_mir::mir::CodeRegion;
|
||||
|
||||
fn stable(&self, _: &mut Tables<'tcx>) -> Self::T {
|
||||
stable_mir::mir::CodeRegion {
|
||||
file_name: self.file_name.as_str().to_string(),
|
||||
start_line: self.start_line as usize,
|
||||
start_col: self.start_col as usize,
|
||||
end_line: self.end_line as usize,
|
||||
end_col: self.end_col as usize,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> Stable<'tcx> for mir::UnwindAction {
|
||||
type T = stable_mir::mir::UnwindAction;
|
||||
fn stable(&self, _: &mut Tables<'tcx>) -> Self::T {
|
||||
@ -406,6 +549,26 @@ impl<'tcx> Stable<'tcx> for mir::UnwindAction {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> Stable<'tcx> for mir::NonDivergingIntrinsic<'tcx> {
|
||||
type T = stable_mir::mir::NonDivergingIntrinsic;
|
||||
|
||||
fn stable(&self, tables: &mut Tables<'tcx>) -> Self::T {
|
||||
use rustc_middle::mir::NonDivergingIntrinsic;
|
||||
match self {
|
||||
NonDivergingIntrinsic::Assume(op) => {
|
||||
stable_mir::mir::NonDivergingIntrinsic::Assume(op.stable(tables))
|
||||
}
|
||||
NonDivergingIntrinsic::CopyNonOverlapping(copy_non_overlapping) => {
|
||||
stable_mir::mir::NonDivergingIntrinsic::CopyNonOverlapping(CopyNonOverlapping {
|
||||
src: copy_non_overlapping.src.stable(tables),
|
||||
dst: copy_non_overlapping.dst.stable(tables),
|
||||
count: copy_non_overlapping.count.stable(tables),
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> Stable<'tcx> for mir::AssertMessage<'tcx> {
|
||||
type T = stable_mir::mir::AssertMessage;
|
||||
fn stable(&self, tables: &mut Tables<'tcx>) -> Self::T {
|
||||
|
@ -1,3 +1,4 @@
|
||||
use crate::rustc_internal::Opaque;
|
||||
use crate::stable_mir::ty::{
|
||||
AdtDef, ClosureDef, Const, GeneratorDef, GenericArgs, Movability, Region,
|
||||
};
|
||||
@ -133,9 +134,101 @@ pub enum AsyncGeneratorKind {
|
||||
Fn,
|
||||
}
|
||||
|
||||
pub(crate) type LocalDefId = Opaque;
|
||||
pub(crate) type CounterValueReference = Opaque;
|
||||
pub(crate) type InjectedExpressionId = Opaque;
|
||||
pub(crate) type ExpressionOperandId = Opaque;
|
||||
|
||||
/// The FakeReadCause describes the type of pattern why a FakeRead statement exists.
|
||||
#[derive(Clone, Debug)]
|
||||
pub enum FakeReadCause {
|
||||
ForMatchGuard,
|
||||
ForMatchedPlace(LocalDefId),
|
||||
ForGuardBinding,
|
||||
ForLet(LocalDefId),
|
||||
ForIndex,
|
||||
}
|
||||
|
||||
/// Describes what kind of retag is to be performed
|
||||
#[derive(Clone, Debug)]
|
||||
pub enum RetagKind {
|
||||
FnEntry,
|
||||
TwoPhase,
|
||||
Raw,
|
||||
Default,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub enum Variance {
|
||||
Covariant,
|
||||
Invariant,
|
||||
Contravariant,
|
||||
Bivariant,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub enum Op {
|
||||
Subtract,
|
||||
Add,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub enum CoverageKind {
|
||||
Counter {
|
||||
function_source_hash: usize,
|
||||
id: CounterValueReference,
|
||||
},
|
||||
Expression {
|
||||
id: InjectedExpressionId,
|
||||
lhs: ExpressionOperandId,
|
||||
op: Op,
|
||||
rhs: ExpressionOperandId,
|
||||
},
|
||||
Unreachable,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct CodeRegion {
|
||||
pub file_name: String,
|
||||
pub start_line: usize,
|
||||
pub start_col: usize,
|
||||
pub end_line: usize,
|
||||
pub end_col: usize,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct Coverage {
|
||||
pub kind: CoverageKind,
|
||||
pub code_region: Option<CodeRegion>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct CopyNonOverlapping {
|
||||
pub src: Operand,
|
||||
pub dst: Operand,
|
||||
pub count: Operand,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub enum NonDivergingIntrinsic {
|
||||
Assume(Operand),
|
||||
CopyNonOverlapping(CopyNonOverlapping),
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub enum Statement {
|
||||
Assign(Place, Rvalue),
|
||||
FakeRead(FakeReadCause, Place),
|
||||
SetDiscriminant { place: Place, variant_index: VariantIdx },
|
||||
Deinit(Place),
|
||||
StorageLive(Local),
|
||||
StorageDead(Local),
|
||||
Retag(RetagKind, Place),
|
||||
PlaceMention(Place),
|
||||
AscribeUserType { place: Place, projections: UserTypeProjection, variance: Variance },
|
||||
Coverage(Coverage),
|
||||
Intrinsic(NonDivergingIntrinsic),
|
||||
ConstEvalCounter,
|
||||
Nop,
|
||||
}
|
||||
|
||||
@ -271,14 +364,22 @@ pub enum Operand {
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct Place {
|
||||
pub local: usize,
|
||||
pub local: Local,
|
||||
pub projection: String,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct UserTypeProjection {
|
||||
pub base: UserTypeAnnotationIndex,
|
||||
pub projection: String,
|
||||
}
|
||||
|
||||
pub type Local = usize;
|
||||
|
||||
type FieldIdx = usize;
|
||||
|
||||
/// The source-order index of a variant in a type.
|
||||
type VariantIdx = usize;
|
||||
pub type VariantIdx = usize;
|
||||
|
||||
type UserTypeAnnotationIndex = usize;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user