Skip to content

Commit 1a748f0

Browse files
authored
Rollup merge of #113827 - spastorino:smir-types-4, r=oli-obk
Add Foreign, Never, FnDef, Closure and Generator tys to SMIR r? ``@oli-obk``
2 parents 6102785 + c5819b2 commit 1a748f0

File tree

3 files changed

+101
-27
lines changed

3 files changed

+101
-27
lines changed

Diff for: compiler/rustc_smir/src/rustc_internal/mod.rs

+32
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,22 @@ pub fn adt_def(did: DefId) -> stable_mir::ty::AdtDef {
3131
with_tables(|t| t.adt_def(did))
3232
}
3333

34+
pub fn foreign_def(did: DefId) -> stable_mir::ty::ForeignDef {
35+
with_tables(|t| t.foreign_def(did))
36+
}
37+
38+
pub fn fn_def(did: DefId) -> stable_mir::ty::FnDef {
39+
with_tables(|t| t.fn_def(did))
40+
}
41+
42+
pub fn closure_def(did: DefId) -> stable_mir::ty::ClosureDef {
43+
with_tables(|t| t.closure_def(did))
44+
}
45+
46+
pub fn generator_def(did: DefId) -> stable_mir::ty::GeneratorDef {
47+
with_tables(|t| t.generator_def(did))
48+
}
49+
3450
impl<'tcx> Tables<'tcx> {
3551
pub fn item_def_id(&self, item: &stable_mir::CrateItem) -> DefId {
3652
self.def_ids[item.0]
@@ -44,6 +60,22 @@ impl<'tcx> Tables<'tcx> {
4460
stable_mir::ty::AdtDef(self.create_def_id(did))
4561
}
4662

63+
pub fn foreign_def(&mut self, did: DefId) -> stable_mir::ty::ForeignDef {
64+
stable_mir::ty::ForeignDef(self.create_def_id(did))
65+
}
66+
67+
pub fn fn_def(&mut self, did: DefId) -> stable_mir::ty::FnDef {
68+
stable_mir::ty::FnDef(self.create_def_id(did))
69+
}
70+
71+
pub fn closure_def(&mut self, did: DefId) -> stable_mir::ty::ClosureDef {
72+
stable_mir::ty::ClosureDef(self.create_def_id(did))
73+
}
74+
75+
pub fn generator_def(&mut self, did: DefId) -> stable_mir::ty::GeneratorDef {
76+
stable_mir::ty::GeneratorDef(self.create_def_id(did))
77+
}
78+
4779
fn create_def_id(&mut self, did: DefId) -> stable_mir::DefId {
4880
// FIXME: this becomes inefficient when we have too many ids
4981
for (i, &d) in self.def_ids.iter().enumerate() {

Diff for: compiler/rustc_smir/src/rustc_smir/mod.rs

+44-23
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,11 @@
88
//! For now, we are developing everything inside `rustc`, thus, we keep this module private.
99
1010
use crate::rustc_internal::{self, opaque};
11-
use crate::stable_mir::ty::{AdtSubsts, FloatTy, GenericArgKind, IntTy, RigidTy, TyKind, UintTy};
11+
use crate::stable_mir::ty::{
12+
FloatTy, GenericArgKind, GenericArgs, IntTy, Movability, RigidTy, TyKind, UintTy,
13+
};
1214
use crate::stable_mir::{self, Context};
15+
use rustc_hir as hir;
1316
use rustc_middle::mir;
1417
use rustc_middle::ty::{self, Ty, TyCtxt};
1518
use rustc_span::def_id::{CrateNum, DefId, LOCAL_CRATE};
@@ -94,26 +97,13 @@ impl<'tcx> Tables<'tcx> {
9497
ty::FloatTy::F32 => TyKind::RigidTy(RigidTy::Float(FloatTy::F32)),
9598
ty::FloatTy::F64 => TyKind::RigidTy(RigidTy::Float(FloatTy::F64)),
9699
},
97-
ty::Adt(adt_def, substs) => TyKind::RigidTy(RigidTy::Adt(
100+
ty::Adt(adt_def, generic_args) => TyKind::RigidTy(RigidTy::Adt(
98101
rustc_internal::adt_def(adt_def.did()),
99-
AdtSubsts(
100-
substs
101-
.iter()
102-
.map(|arg| match arg.unpack() {
103-
ty::GenericArgKind::Lifetime(region) => {
104-
GenericArgKind::Lifetime(opaque(&region))
105-
}
106-
ty::GenericArgKind::Type(ty) => {
107-
GenericArgKind::Type(self.intern_ty(ty))
108-
}
109-
ty::GenericArgKind::Const(const_) => {
110-
GenericArgKind::Const(opaque(&const_))
111-
}
112-
})
113-
.collect(),
114-
),
102+
self.generic_args(generic_args),
115103
)),
116-
ty::Foreign(_) => todo!(),
104+
ty::Foreign(def_id) => {
105+
TyKind::RigidTy(RigidTy::Foreign(rustc_internal::foreign_def(*def_id)))
106+
}
117107
ty::Str => TyKind::RigidTy(RigidTy::Str),
118108
ty::Array(ty, constant) => {
119109
TyKind::RigidTy(RigidTy::Array(self.intern_ty(*ty), opaque(constant)))
@@ -125,12 +115,25 @@ impl<'tcx> Tables<'tcx> {
125115
ty::Ref(region, ty, mutbl) => {
126116
TyKind::RigidTy(RigidTy::Ref(opaque(region), self.intern_ty(*ty), mutbl.stable()))
127117
}
128-
ty::FnDef(_, _) => todo!(),
118+
ty::FnDef(def_id, generic_args) => TyKind::RigidTy(RigidTy::FnDef(
119+
rustc_internal::fn_def(*def_id),
120+
self.generic_args(generic_args),
121+
)),
129122
ty::FnPtr(_) => todo!(),
130123
ty::Dynamic(_, _, _) => todo!(),
131-
ty::Closure(_, _) => todo!(),
132-
ty::Generator(_, _, _) => todo!(),
133-
ty::Never => todo!(),
124+
ty::Closure(def_id, generic_args) => TyKind::RigidTy(RigidTy::Closure(
125+
rustc_internal::closure_def(*def_id),
126+
self.generic_args(generic_args),
127+
)),
128+
ty::Generator(def_id, generic_args, movability) => TyKind::RigidTy(RigidTy::Generator(
129+
rustc_internal::generator_def(*def_id),
130+
self.generic_args(generic_args),
131+
match movability {
132+
hir::Movability::Static => Movability::Static,
133+
hir::Movability::Movable => Movability::Movable,
134+
},
135+
)),
136+
ty::Never => TyKind::RigidTy(RigidTy::Never),
134137
ty::Tuple(fields) => TyKind::RigidTy(RigidTy::Tuple(
135138
fields.iter().map(|ty| self.intern_ty(ty)).collect(),
136139
)),
@@ -155,6 +158,24 @@ impl<'tcx> Tables<'tcx> {
155158
self.types.push(ty);
156159
stable_mir::ty::Ty(id)
157160
}
161+
162+
fn generic_args(
163+
&mut self,
164+
generic_args: &ty::GenericArgs<'tcx>,
165+
) -> stable_mir::ty::GenericArgs {
166+
GenericArgs(
167+
generic_args
168+
.iter()
169+
.map(|arg| match arg.unpack() {
170+
ty::GenericArgKind::Lifetime(region) => {
171+
GenericArgKind::Lifetime(opaque(&region))
172+
}
173+
ty::GenericArgKind::Type(ty) => GenericArgKind::Type(self.intern_ty(ty)),
174+
ty::GenericArgKind::Const(const_) => GenericArgKind::Const(opaque(&const_)),
175+
})
176+
.collect(),
177+
)
178+
}
158179
}
159180

160181
/// Build a stable mir crate from a given crate number.

Diff for: compiler/rustc_smir/src/stable_mir/ty.rs

+25-4
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,17 @@ pub enum RigidTy {
2525
Int(IntTy),
2626
Uint(UintTy),
2727
Float(FloatTy),
28-
Adt(AdtDef, AdtSubsts),
28+
Adt(AdtDef, GenericArgs),
29+
Foreign(ForeignDef),
2930
Str,
3031
Array(Ty, Const),
3132
Slice(Ty),
3233
RawPtr(Ty, Mutability),
3334
Ref(Region, Ty, Mutability),
35+
FnDef(FnDef, GenericArgs),
36+
Closure(ClosureDef, GenericArgs),
37+
Generator(GeneratorDef, GenericArgs, Movability),
38+
Never,
3439
Tuple(Vec<Ty>),
3540
}
3641

@@ -60,17 +65,33 @@ pub enum FloatTy {
6065
F64,
6166
}
6267

68+
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
69+
pub enum Movability {
70+
Static,
71+
Movable,
72+
}
73+
74+
#[derive(Clone, PartialEq, Eq, Debug)]
75+
pub struct ForeignDef(pub(crate) DefId);
76+
77+
#[derive(Clone, PartialEq, Eq, Debug)]
78+
pub struct FnDef(pub(crate) DefId);
79+
80+
#[derive(Clone, PartialEq, Eq, Debug)]
81+
pub struct ClosureDef(pub(crate) DefId);
82+
83+
#[derive(Clone, PartialEq, Eq, Debug)]
84+
pub struct GeneratorDef(pub(crate) DefId);
85+
6386
#[derive(Clone, PartialEq, Eq, Debug)]
6487
pub struct AdtDef(pub(crate) DefId);
6588

6689
#[derive(Clone, Debug)]
67-
pub struct AdtSubsts(pub Vec<GenericArgKind>);
90+
pub struct GenericArgs(pub Vec<GenericArgKind>);
6891

6992
#[derive(Clone, Debug)]
7093
pub enum GenericArgKind {
71-
// FIXME add proper region
7294
Lifetime(Region),
7395
Type(Ty),
74-
// FIXME add proper const
7596
Const(Const),
7697
}

0 commit comments

Comments
 (0)