Add FnPtr ty to SMIR
This commit is contained in:
parent
93bcc2ef98
commit
17b8977f9b
@ -47,6 +47,14 @@ pub fn generator_def(did: DefId) -> stable_mir::ty::GeneratorDef {
|
|||||||
with_tables(|t| t.generator_def(did))
|
with_tables(|t| t.generator_def(did))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn param_def(did: DefId) -> stable_mir::ty::ParamDef {
|
||||||
|
with_tables(|t| t.param_def(did))
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn br_named_def(did: DefId) -> stable_mir::ty::BrNamedDef {
|
||||||
|
with_tables(|t| t.br_named_def(did))
|
||||||
|
}
|
||||||
|
|
||||||
impl<'tcx> Tables<'tcx> {
|
impl<'tcx> Tables<'tcx> {
|
||||||
pub fn item_def_id(&self, item: &stable_mir::CrateItem) -> DefId {
|
pub fn item_def_id(&self, item: &stable_mir::CrateItem) -> DefId {
|
||||||
self.def_ids[item.0]
|
self.def_ids[item.0]
|
||||||
@ -76,6 +84,14 @@ pub fn generator_def(&mut self, did: DefId) -> stable_mir::ty::GeneratorDef {
|
|||||||
stable_mir::ty::GeneratorDef(self.create_def_id(did))
|
stable_mir::ty::GeneratorDef(self.create_def_id(did))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn param_def(&mut self, did: DefId) -> stable_mir::ty::ParamDef {
|
||||||
|
stable_mir::ty::ParamDef(self.create_def_id(did))
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn br_named_def(&mut self, did: DefId) -> stable_mir::ty::BrNamedDef {
|
||||||
|
stable_mir::ty::BrNamedDef(self.create_def_id(did))
|
||||||
|
}
|
||||||
|
|
||||||
fn create_def_id(&mut self, did: DefId) -> stable_mir::DefId {
|
fn create_def_id(&mut self, did: DefId) -> stable_mir::DefId {
|
||||||
// FIXME: this becomes inefficient when we have too many ids
|
// FIXME: this becomes inefficient when we have too many ids
|
||||||
for (i, &d) in self.def_ids.iter().enumerate() {
|
for (i, &d) in self.def_ids.iter().enumerate() {
|
||||||
|
@ -123,7 +123,7 @@ fn rustc_ty_to_ty(&mut self, ty: Ty<'tcx>) -> TyKind {
|
|||||||
rustc_internal::fn_def(*def_id),
|
rustc_internal::fn_def(*def_id),
|
||||||
generic_args.stable(self),
|
generic_args.stable(self),
|
||||||
)),
|
)),
|
||||||
ty::FnPtr(_) => todo!(),
|
ty::FnPtr(poly_fn_sig) => TyKind::RigidTy(RigidTy::FnPtr(poly_fn_sig.stable(self))),
|
||||||
ty::Dynamic(_, _, _) => todo!(),
|
ty::Dynamic(_, _, _) => todo!(),
|
||||||
ty::Closure(def_id, generic_args) => TyKind::RigidTy(RigidTy::Closure(
|
ty::Closure(def_id, generic_args) => TyKind::RigidTy(RigidTy::Closure(
|
||||||
rustc_internal::closure_def(*def_id),
|
rustc_internal::closure_def(*def_id),
|
||||||
@ -581,3 +581,98 @@ fn stable(&self, tables: &mut Tables<'tcx>) -> Self::T {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<'tcx> Stable<'tcx> for ty::PolyFnSig<'tcx> {
|
||||||
|
type T = stable_mir::ty::PolyFnSig;
|
||||||
|
fn stable(&self, tables: &mut Tables<'tcx>) -> Self::T {
|
||||||
|
use stable_mir::ty::Binder;
|
||||||
|
|
||||||
|
Binder {
|
||||||
|
value: self.skip_binder().stable(tables),
|
||||||
|
bound_vars: self
|
||||||
|
.bound_vars()
|
||||||
|
.iter()
|
||||||
|
.map(|bound_var| bound_var.stable(tables))
|
||||||
|
.collect(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> Stable<'tcx> for ty::FnSig<'tcx> {
|
||||||
|
type T = stable_mir::ty::FnSig;
|
||||||
|
fn stable(&self, tables: &mut Tables<'tcx>) -> Self::T {
|
||||||
|
use rustc_target::spec::abi;
|
||||||
|
use stable_mir::ty::{Abi, FnSig, Unsafety};
|
||||||
|
|
||||||
|
FnSig {
|
||||||
|
inputs_and_output: self
|
||||||
|
.inputs_and_output
|
||||||
|
.iter()
|
||||||
|
.map(|ty| tables.intern_ty(ty))
|
||||||
|
.collect(),
|
||||||
|
c_variadic: self.c_variadic,
|
||||||
|
unsafety: match self.unsafety {
|
||||||
|
hir::Unsafety::Normal => Unsafety::Normal,
|
||||||
|
hir::Unsafety::Unsafe => Unsafety::Unsafe,
|
||||||
|
},
|
||||||
|
abi: match self.abi {
|
||||||
|
abi::Abi::Rust => Abi::Rust,
|
||||||
|
abi::Abi::C { unwind } => Abi::C { unwind },
|
||||||
|
abi::Abi::Cdecl { unwind } => Abi::Cdecl { unwind },
|
||||||
|
abi::Abi::Stdcall { unwind } => Abi::Stdcall { unwind },
|
||||||
|
abi::Abi::Fastcall { unwind } => Abi::Fastcall { unwind },
|
||||||
|
abi::Abi::Vectorcall { unwind } => Abi::Vectorcall { unwind },
|
||||||
|
abi::Abi::Thiscall { unwind } => Abi::Thiscall { unwind },
|
||||||
|
abi::Abi::Aapcs { unwind } => Abi::Aapcs { unwind },
|
||||||
|
abi::Abi::Win64 { unwind } => Abi::Win64 { unwind },
|
||||||
|
abi::Abi::SysV64 { unwind } => Abi::SysV64 { unwind },
|
||||||
|
abi::Abi::PtxKernel => Abi::PtxKernel,
|
||||||
|
abi::Abi::Msp430Interrupt => Abi::Msp430Interrupt,
|
||||||
|
abi::Abi::X86Interrupt => Abi::X86Interrupt,
|
||||||
|
abi::Abi::AmdGpuKernel => Abi::AmdGpuKernel,
|
||||||
|
abi::Abi::EfiApi => Abi::EfiApi,
|
||||||
|
abi::Abi::AvrInterrupt => Abi::AvrInterrupt,
|
||||||
|
abi::Abi::AvrNonBlockingInterrupt => Abi::AvrNonBlockingInterrupt,
|
||||||
|
abi::Abi::CCmseNonSecureCall => Abi::CCmseNonSecureCall,
|
||||||
|
abi::Abi::Wasm => Abi::Wasm,
|
||||||
|
abi::Abi::System { unwind } => Abi::System { unwind },
|
||||||
|
abi::Abi::RustIntrinsic => Abi::RustIntrinsic,
|
||||||
|
abi::Abi::RustCall => Abi::RustCall,
|
||||||
|
abi::Abi::PlatformIntrinsic => Abi::PlatformIntrinsic,
|
||||||
|
abi::Abi::Unadjusted => Abi::Unadjusted,
|
||||||
|
abi::Abi::RustCold => Abi::RustCold,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> Stable<'tcx> for ty::BoundVariableKind {
|
||||||
|
type T = stable_mir::ty::BoundVariableKind;
|
||||||
|
fn stable(&self, _: &mut Tables<'tcx>) -> Self::T {
|
||||||
|
use stable_mir::ty::{BoundRegionKind, BoundTyKind, BoundVariableKind};
|
||||||
|
|
||||||
|
match self {
|
||||||
|
ty::BoundVariableKind::Ty(bound_ty_kind) => {
|
||||||
|
BoundVariableKind::Ty(match bound_ty_kind {
|
||||||
|
ty::BoundTyKind::Anon => BoundTyKind::Anon,
|
||||||
|
ty::BoundTyKind::Param(def_id, symbol) => {
|
||||||
|
BoundTyKind::Param(rustc_internal::param_def(*def_id), symbol.to_string())
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
ty::BoundVariableKind::Region(bound_region_kind) => {
|
||||||
|
BoundVariableKind::Region(match bound_region_kind {
|
||||||
|
ty::BoundRegionKind::BrAnon(option_span) => {
|
||||||
|
BoundRegionKind::BrAnon(option_span.map(|span| opaque(&span)))
|
||||||
|
}
|
||||||
|
ty::BoundRegionKind::BrNamed(def_id, symbol) => BoundRegionKind::BrNamed(
|
||||||
|
rustc_internal::br_named_def(*def_id),
|
||||||
|
symbol.to_string(),
|
||||||
|
),
|
||||||
|
ty::BoundRegionKind::BrEnv => BoundRegionKind::BrEnv,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
ty::BoundVariableKind::Const => BoundVariableKind::Const,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -12,6 +12,7 @@ pub fn kind(&self) -> TyKind {
|
|||||||
|
|
||||||
type Const = Opaque;
|
type Const = Opaque;
|
||||||
pub(crate) type Region = Opaque;
|
pub(crate) type Region = Opaque;
|
||||||
|
type Span = Opaque;
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub enum TyKind {
|
pub enum TyKind {
|
||||||
@ -33,6 +34,7 @@ pub enum RigidTy {
|
|||||||
RawPtr(Ty, Mutability),
|
RawPtr(Ty, Mutability),
|
||||||
Ref(Region, Ty, Mutability),
|
Ref(Region, Ty, Mutability),
|
||||||
FnDef(FnDef, GenericArgs),
|
FnDef(FnDef, GenericArgs),
|
||||||
|
FnPtr(PolyFnSig),
|
||||||
Closure(ClosureDef, GenericArgs),
|
Closure(ClosureDef, GenericArgs),
|
||||||
Generator(GeneratorDef, GenericArgs, Movability),
|
Generator(GeneratorDef, GenericArgs, Movability),
|
||||||
Never,
|
Never,
|
||||||
@ -83,6 +85,12 @@ pub enum Movability {
|
|||||||
#[derive(Clone, PartialEq, Eq, Debug)]
|
#[derive(Clone, PartialEq, Eq, Debug)]
|
||||||
pub struct GeneratorDef(pub(crate) DefId);
|
pub struct GeneratorDef(pub(crate) DefId);
|
||||||
|
|
||||||
|
#[derive(Clone, PartialEq, Eq, Debug)]
|
||||||
|
pub struct ParamDef(pub(crate) DefId);
|
||||||
|
|
||||||
|
#[derive(Clone, PartialEq, Eq, Debug)]
|
||||||
|
pub struct BrNamedDef(pub(crate) DefId);
|
||||||
|
|
||||||
#[derive(Clone, PartialEq, Eq, Debug)]
|
#[derive(Clone, PartialEq, Eq, Debug)]
|
||||||
pub struct AdtDef(pub(crate) DefId);
|
pub struct AdtDef(pub(crate) DefId);
|
||||||
|
|
||||||
@ -95,3 +103,74 @@ pub enum GenericArgKind {
|
|||||||
Type(Ty),
|
Type(Ty),
|
||||||
Const(Const),
|
Const(Const),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub type PolyFnSig = Binder<FnSig>;
|
||||||
|
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
pub struct FnSig {
|
||||||
|
pub inputs_and_output: Vec<Ty>,
|
||||||
|
pub c_variadic: bool,
|
||||||
|
pub unsafety: Unsafety,
|
||||||
|
pub abi: Abi,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, PartialEq, Eq, Debug)]
|
||||||
|
pub enum Unsafety {
|
||||||
|
Unsafe,
|
||||||
|
Normal,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, PartialEq, Eq, Debug)]
|
||||||
|
pub enum Abi {
|
||||||
|
Rust,
|
||||||
|
C { unwind: bool },
|
||||||
|
Cdecl { unwind: bool },
|
||||||
|
Stdcall { unwind: bool },
|
||||||
|
Fastcall { unwind: bool },
|
||||||
|
Vectorcall { unwind: bool },
|
||||||
|
Thiscall { unwind: bool },
|
||||||
|
Aapcs { unwind: bool },
|
||||||
|
Win64 { unwind: bool },
|
||||||
|
SysV64 { unwind: bool },
|
||||||
|
PtxKernel,
|
||||||
|
Msp430Interrupt,
|
||||||
|
X86Interrupt,
|
||||||
|
AmdGpuKernel,
|
||||||
|
EfiApi,
|
||||||
|
AvrInterrupt,
|
||||||
|
AvrNonBlockingInterrupt,
|
||||||
|
CCmseNonSecureCall,
|
||||||
|
Wasm,
|
||||||
|
System { unwind: bool },
|
||||||
|
RustIntrinsic,
|
||||||
|
RustCall,
|
||||||
|
PlatformIntrinsic,
|
||||||
|
Unadjusted,
|
||||||
|
RustCold,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
pub struct Binder<T> {
|
||||||
|
pub value: T,
|
||||||
|
pub bound_vars: Vec<BoundVariableKind>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
pub enum BoundVariableKind {
|
||||||
|
Ty(BoundTyKind),
|
||||||
|
Region(BoundRegionKind),
|
||||||
|
Const,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, PartialEq, Eq, Debug)]
|
||||||
|
pub enum BoundTyKind {
|
||||||
|
Anon,
|
||||||
|
Param(ParamDef, String),
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
pub enum BoundRegionKind {
|
||||||
|
BrAnon(Option<Span>),
|
||||||
|
BrNamed(BrNamedDef, String),
|
||||||
|
BrEnv,
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user