Skip to content

Commit

Permalink
Split out the stable part of smir into its own crate to prevent accid…
Browse files Browse the repository at this point in the history
…ental usage of forever unstable things
  • Loading branch information
oli-obk committed Sep 19, 2023
1 parent 5ea306e commit 1bc8681
Show file tree
Hide file tree
Showing 20 changed files with 115 additions and 117 deletions.
11 changes: 10 additions & 1 deletion Cargo.lock
Original file line number Diff line number Diff line change
Expand Up @@ -3194,6 +3194,7 @@ dependencies = [
"rustc_driver",
"rustc_driver_impl",
"rustc_smir",
"stable_mir",
]

[[package]]
Expand Down Expand Up @@ -4358,7 +4359,7 @@ dependencies = [
"rustc_session",
"rustc_span",
"rustc_target",
"scoped-tls",
"stable_mir",
"tracing",
]

Expand Down Expand Up @@ -4909,6 +4910,14 @@ version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"

[[package]]
name = "stable_mir"
version = "0.1.0-preview"
dependencies = [
"scoped-tls",
"tracing",
]

[[package]]
name = "stacker"
version = "0.1.15"
Expand Down
1 change: 1 addition & 0 deletions compiler/rustc/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ rustc_codegen_ssa = { path = "../rustc_codegen_ssa" }
# Make sure rustc_smir ends up in the sysroot, because this
# crate is intended to be used by stable MIR consumers, which are not in-tree
rustc_smir = { path = "../rustc_smir" }
stable_mir = { path = "../stable_mir" }

[dependencies.jemalloc-sys]
version = "0.5.0"
Expand Down
26 changes: 8 additions & 18 deletions compiler/rustc_smir/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,14 @@ version = "0.0.0"
edition = "2021"

[dependencies]
# Use optional dependencies for rustc_* in order to support building this crate separately.
rustc_hir = { path = "../rustc_hir", optional = true }
rustc_middle = { path = "../rustc_middle", optional = true }
rustc_span = { path = "../rustc_span", optional = true }
rustc_target = { path = "../rustc_target", optional = true }
rustc_driver = { path = "../rustc_driver", optional = true }
rustc_interface = { path = "../rustc_interface", optional = true}
rustc_session = {path = "../rustc_session", optional = true}
rustc_hir = { path = "../rustc_hir" }
rustc_middle = { path = "../rustc_middle" }
rustc_span = { path = "../rustc_span" }
rustc_target = { path = "../rustc_target" }
rustc_driver = { path = "../rustc_driver" }
rustc_interface = { path = "../rustc_interface" }
rustc_session = {path = "../rustc_session" }
tracing = "0.1"
scoped-tls = "1.0"
stable_mir = {path = "../stable_mir" }

[features]
default = [
"rustc_hir",
"rustc_middle",
"rustc_span",
"rustc_target",
"rustc_driver",
"rustc_interface",
"rustc_session",
]
16 changes: 1 addition & 15 deletions compiler/rustc_smir/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,26 +10,12 @@
html_root_url = "https://doc.rust-lang.org/nightly/nightly-rustc/",
test(attr(allow(unused_variables), deny(warnings)))
)]
#![cfg_attr(not(feature = "default"), feature(rustc_private))]
#![feature(rustc_private)]
#![feature(ptr_metadata)]
#![feature(type_alias_impl_trait)] // Used to define opaque types.
#![feature(intra_doc_pointers)]

// Declare extern rustc_* crates to enable building this crate separately from the compiler.
#[cfg(not(feature = "default"))]
extern crate rustc_hir;
#[cfg(not(feature = "default"))]
extern crate rustc_middle;
#[cfg(not(feature = "default"))]
extern crate rustc_span;
#[cfg(not(feature = "default"))]
extern crate rustc_target;

pub mod rustc_internal;
pub mod stable_mir;

// Make this module private for now since external users should not call these directly.
mod rustc_smir;

#[macro_use]
extern crate scoped_tls;
6 changes: 3 additions & 3 deletions compiler/rustc_smir/src/rustc_internal/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,14 @@
use std::ops::{ControlFlow, Index};

use crate::rustc_internal;
use crate::stable_mir::CompilerError;
use crate::{rustc_smir::Tables, stable_mir};
use crate::rustc_smir::Tables;
use rustc_driver::{Callbacks, Compilation, RunCompiler};
use rustc_interface::{interface, Queries};
use rustc_middle::mir::interpret::AllocId;
use rustc_middle::ty::TyCtxt;
pub use rustc_span::def_id::{CrateNum, DefId};
use rustc_span::Span;
use stable_mir::CompilerError;

impl<'tcx> Index<stable_mir::DefId> for Tables<'tcx> {
type Output = DefId;
Expand Down Expand Up @@ -129,7 +129,7 @@ pub fn crate_num(item: &stable_mir::Crate) -> CrateNum {
}

pub fn run(tcx: TyCtxt<'_>, f: impl FnOnce()) {
crate::stable_mir::run(
stable_mir::run(
Tables { tcx, def_ids: vec![], alloc_ids: vec![], spans: vec![], types: vec![] },
f,
);
Expand Down
8 changes: 3 additions & 5 deletions compiler/rustc_smir/src/rustc_smir/alloc.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
use rustc_middle::mir::interpret::{alloc_range, AllocRange, ConstValue, Pointer};

use crate::{
rustc_smir::{Stable, Tables},
stable_mir::mir::Mutability,
stable_mir::ty::{Allocation, ProvenanceMap},
};
use crate::rustc_smir::{Stable, Tables};
use stable_mir::mir::Mutability;
use stable_mir::ty::{Allocation, ProvenanceMap};

/// Creates new empty `Allocation` from given `Align`.
fn new_empty_allocation(align: rustc_target::abi::Align) -> Allocation {
Expand Down
17 changes: 4 additions & 13 deletions compiler/rustc_smir/src/rustc_smir/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,16 @@
//!
//! For now, we are developing everything inside `rustc`, thus, we keep this module private.

use crate::stable_mir::mir::{CopyNonOverlapping, UserTypeProjection, VariantIdx};
use crate::stable_mir::ty::{
FloatTy, GenericParamDef, IntTy, Movability, RigidTy, Span, TyKind, UintTy,
};
use crate::stable_mir::{self, opaque, CompilerError, Context};
use hir::def::DefKind;
use rustc_hir as hir;
use rustc_middle::mir::interpret::{alloc_range, AllocId};
use rustc_middle::mir::{self, ConstantKind};
use rustc_middle::ty::{self, Ty, TyCtxt, Variance};
use rustc_span::def_id::{CrateNum, DefId, LOCAL_CRATE};
use rustc_span::ErrorGuaranteed;
use rustc_target::abi::FieldIdx;
use stable_mir::mir::{CopyNonOverlapping, UserTypeProjection, VariantIdx};
use stable_mir::ty::{FloatTy, GenericParamDef, IntTy, Movability, RigidTy, Span, TyKind, UintTy};
use stable_mir::{self, opaque, Context};
use tracing::debug;

mod alloc;
Expand Down Expand Up @@ -112,7 +109,7 @@ impl<'tcx> Context for Tables<'tcx> {
}
}

fn ty_kind(&mut self, ty: crate::stable_mir::ty::Ty) -> TyKind {
fn ty_kind(&mut self, ty: stable_mir::ty::Ty) -> TyKind {
self.types[ty.0].clone().stable(self)
}

Expand Down Expand Up @@ -1523,12 +1520,6 @@ impl<'tcx> Stable<'tcx> for rustc_span::Span {
}
}

impl<T> From<ErrorGuaranteed> for CompilerError<T> {
fn from(_error: ErrorGuaranteed) -> Self {
CompilerError::CompilationFailed
}
}

impl<'tcx> Stable<'tcx> for DefKind {
type T = stable_mir::DefKind;

Expand Down
8 changes: 8 additions & 0 deletions compiler/stable_mir/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
[package]
name = "stable_mir"
version = "0.1.0-preview"
edition = "2021"

[dependencies]
tracing = "0.1"
scoped-tls = "1.0"
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
use std::ops::ControlFlow;

use super::{
ty::{
Allocation, Binder, Const, ConstDef, ConstantKind, ExistentialPredicate, FnSig,
GenericArgKind, GenericArgs, Promoted, RigidTy, TermKind, Ty, TyKind, UnevaluatedConst,
},
Opaque,
use crate::Opaque;

use super::ty::{
Allocation, Binder, Const, ConstDef, ConstantKind, ExistentialPredicate, FnSig, GenericArgKind,
GenericArgs, Promoted, RigidTy, TermKind, Ty, TyKind, UnevaluatedConst,
};

pub trait Folder: Sized {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,21 @@
//! Module that implements the public interface to the Stable MIR.
//! The WIP stable interface to rustc internals.
//!
//! This module shall contain all type definitions and APIs that we expect third-party tools to invoke to
//! interact with the compiler.
//! For more information see <https://github.com/rust-lang/project-stable-mir>
//!
//! The goal is to eventually move this module to its own crate which shall be published on
//! [crates.io](https://crates.io).
//! # Note
//!
//! This API is still completely unstable and subject to change.

#![doc(
html_root_url = "https://doc.rust-lang.org/nightly/nightly-rustc/",
test(attr(allow(unused_variables), deny(warnings)))
)]
//!
//! ## Note:
//! This crate shall contain all type definitions and APIs that we expect third-party tools to invoke to
//! interact with the compiler.
//!
//! There shouldn't be any direct references to internal compiler constructs in this module.
//! If you need an internal construct, consider using `rustc_internal` or `rustc_smir`.
//! The goal is to eventually be published on
//! [crates.io](https://crates.io).

use std::cell::Cell;
use std::fmt;
Expand All @@ -19,6 +25,9 @@ use self::ty::{
GenericPredicates, Generics, ImplDef, ImplTrait, Span, TraitDecl, TraitDef, Ty, TyKind,
};

#[macro_use]
extern crate scoped_tls;

pub mod fold;
pub mod mir;
pub mod ty;
Expand All @@ -32,11 +41,11 @@ pub type CrateNum = usize;

/// A unique identification number for each item accessible for the current compilation unit.
#[derive(Clone, Copy, PartialEq, Eq)]
pub struct DefId(pub(crate) usize);
pub struct DefId(pub usize);

impl Debug for DefId {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("DefId:")
f.debug_struct("DefId")
.field("id", &self.0)
.field("name", &with(|cx| cx.name_of_def_id(*self)))
.finish()
Expand All @@ -45,7 +54,7 @@ impl Debug for DefId {

/// A unique identification number for each provenance
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub struct AllocId(pub(crate) usize);
pub struct AllocId(pub usize);

/// A list of crate items.
pub type CrateItems = Vec<CrateItem>;
Expand Down Expand Up @@ -73,7 +82,7 @@ pub enum CompilerError<T> {
/// Holds information about a crate.
#[derive(Clone, PartialEq, Eq, Debug)]
pub struct Crate {
pub(crate) id: CrateNum,
pub id: CrateNum,
pub name: Symbol,
pub is_local: bool,
}
Expand All @@ -84,7 +93,7 @@ pub type DefKind = Opaque;
/// For now, it only stores the item DefId. Use functions inside `rustc_internal` module to
/// use this item.
#[derive(Clone, PartialEq, Eq, Debug)]
pub struct CrateItem(pub(crate) DefId);
pub struct CrateItem(pub DefId);

impl CrateItem {
pub fn body(&self) -> mir::Body {
Expand Down Expand Up @@ -170,9 +179,12 @@ pub trait Context {
/// Prints the name of given `DefId`
fn name_of_def_id(&self, def_id: DefId) -> String;

/// Prints a human readable form of `Span`
fn print_span(&self, span: Span) -> String;

/// Prints the kind of given `DefId`
fn def_kind(&mut self, def_id: DefId) -> DefKind;

/// `Span` of an item
fn span_of_an_item(&mut self, def_id: DefId) -> Span;

Expand Down Expand Up @@ -200,7 +212,7 @@ pub fn run(mut context: impl Context, f: impl FnOnce()) {

/// Loads the current context and calls a function with it.
/// Do not nest these, as that will ICE.
pub(crate) fn with<R>(f: impl FnOnce(&mut dyn Context) -> R) -> R {
pub fn with<R>(f: impl FnOnce(&mut dyn Context) -> R) -> R {
assert!(TLV.is_set());
TLV.with(|tlv| {
let ptr = tlv.get();
Expand All @@ -225,6 +237,6 @@ impl std::fmt::Debug for Opaque {
}
}

pub(crate) fn opaque<T: Debug>(value: &T) -> Opaque {
pub fn opaque<T: Debug>(value: &T) -> Opaque {
Opaque(format!("{value:?}"))
}
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
use crate::stable_mir::ty::{
AdtDef, ClosureDef, Const, GeneratorDef, GenericArgs, Movability, Region,
};
use crate::stable_mir::Opaque;
use crate::stable_mir::{self, ty::Ty, Span};
use crate::ty::{AdtDef, ClosureDef, Const, GeneratorDef, GenericArgs, Movability, Region};
use crate::Opaque;
use crate::{ty::Ty, Span};

#[derive(Clone, Debug)]
pub struct Body {
Expand Down Expand Up @@ -135,7 +133,7 @@ pub enum AsyncGeneratorKind {
}

pub(crate) type LocalDefId = Opaque;
/// [`rustc_middle::mir::Coverage`] is heavily tied to internal details of the
/// The rustc coverage data structures are heavily tied to internal details of the
/// coverage implementation that are likely to change, and are unlikely to be
/// useful to third-party tools for the foreseeable future.
pub(crate) type Coverage = Opaque;
Expand Down Expand Up @@ -215,7 +213,7 @@ pub enum Rvalue {
/// generator lowering, `Generator` aggregate kinds are disallowed too.
Aggregate(AggregateKind, Vec<Operand>),

/// * `Offset` has the same semantics as [`offset`](pointer::offset), except that the second
/// * `Offset` has the same semantics as `<*const T>::offset`, except that the second
/// parameter may be a `usize` as well.
/// * The comparison operations accept `bool`s, `char`s, signed or unsigned integers, floats,
/// raw pointers, or function pointers and return a `bool`. The types of the operands must be
Expand Down Expand Up @@ -245,16 +243,14 @@ pub enum Rvalue {
/// deref operation, immediately followed by one or more projections.
CopyForDeref(Place),

/// Computes the discriminant of the place, returning it as an integer of type
/// [`discriminant_ty`]. Returns zero for types without discriminant.
/// Computes the discriminant of the place, returning it as an integer.
/// Returns zero for types without discriminant.
///
/// The validity requirements for the underlying value are undecided for this rvalue, see
/// [#91095]. Note too that the value of the discriminant is not the same thing as the
/// variant index; use [`discriminant_for_variant`] to convert.
/// variant index;
///
/// [`discriminant_ty`]: rustc_middle::ty::Ty::discriminant_ty
/// [#91095]: https://github.com/rust-lang/rust/issues/91095
/// [`discriminant_for_variant`]: rustc_middle::ty::Ty::discriminant_for_variant
Discriminant(Place),

/// Yields the length of the place, as a `usize`.
Expand Down Expand Up @@ -295,7 +291,7 @@ pub enum Rvalue {
///
/// **Needs clarification**: Are there weird additional semantics here related to the runtime
/// nature of this operation?
ThreadLocalRef(stable_mir::CrateItem),
ThreadLocalRef(crate::CrateItem),

/// Computes a value as described by the operation.
NullaryOp(NullOp, Ty),
Expand Down

0 comments on commit 1bc8681

Please sign in to comment.