Skip to content

Commit

Permalink
Rollup merge of rust-lang#114320 - ouz-a:smir_statements, r=oli-obk
Browse files Browse the repository at this point in the history
Cover statements for stable_mir

Added missing statements to stable_mir, used opaque types for few types that are only used for diagnostic.

cc rust-lang/project-stable-mir#16

r? `@oli-obk`
  • Loading branch information
matthiaskrgr authored Aug 1, 2023
2 parents 00ad3cc + 2ff62fd commit 41364c7
Show file tree
Hide file tree
Showing 2 changed files with 279 additions and 15 deletions.
189 changes: 176 additions & 13 deletions compiler/rustc_smir/src/rustc_smir/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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,
}
}
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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 {
Expand All @@ -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 {
Expand Down
105 changes: 103 additions & 2 deletions compiler/rustc_smir/src/stable_mir/mir/body.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
use crate::rustc_internal::Opaque;
use crate::stable_mir::ty::{
AdtDef, ClosureDef, Const, GeneratorDef, GenericArgs, Movability, Region,
};
Expand Down Expand Up @@ -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,
}

Expand Down Expand Up @@ -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;

Expand Down

0 comments on commit 41364c7

Please sign in to comment.