Skip to content

Commit 71466ca

Browse files
authored
Rollup merge of #120982 - momvart:smir-61-foreign_kind, r=oli-obk
Add APIs for fetching foreign items Closes rust-lang/project-stable-mir#61
2 parents 0977600 + 2e691a5 commit 71466ca

File tree

9 files changed

+251
-38
lines changed

9 files changed

+251
-38
lines changed

Diff for: Cargo.lock

+1
Original file line numberDiff line numberDiff line change
@@ -4588,6 +4588,7 @@ dependencies = [
45884588
"rustc_data_structures",
45894589
"rustc_hir",
45904590
"rustc_middle",
4591+
"rustc_session",
45914592
"rustc_span",
45924593
"rustc_target",
45934594
"scoped-tls",

Diff for: compiler/rustc_smir/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ rustc_abi = { path = "../rustc_abi" }
99
rustc_data_structures = { path = "../rustc_data_structures" }
1010
rustc_hir = { path = "../rustc_hir" }
1111
rustc_middle = { path = "../rustc_middle" }
12+
rustc_session = { path = "../rustc_session" }
1213
rustc_span = { path = "../rustc_span" }
1314
rustc_target = { path = "../rustc_target" }
1415
scoped-tls = "1.0"

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

+4
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,10 @@ impl<'tcx> Tables<'tcx> {
8585
stable_mir::ty::AdtDef(self.create_def_id(did))
8686
}
8787

88+
pub fn foreign_module_def(&mut self, did: DefId) -> stable_mir::ty::ForeignModuleDef {
89+
stable_mir::ty::ForeignModuleDef(self.create_def_id(did))
90+
}
91+
8892
pub fn foreign_def(&mut self, did: DefId) -> stable_mir::ty::ForeignDef {
8993
stable_mir::ty::ForeignDef(self.create_def_id(did))
9094
}

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

+51-3
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@ use stable_mir::mir::mono::{InstanceDef, StaticDef};
2222
use stable_mir::mir::Body;
2323
use stable_mir::target::{MachineInfo, MachineSize};
2424
use stable_mir::ty::{
25-
AdtDef, AdtKind, Allocation, ClosureDef, ClosureKind, Const, FieldDef, FnDef, GenericArgs,
26-
LineInfo, PolyFnSig, RigidTy, Span, Ty, TyKind, VariantDef,
25+
AdtDef, AdtKind, Allocation, ClosureDef, ClosureKind, Const, FieldDef, FnDef, ForeignDef,
26+
ForeignItemKind, GenericArgs, LineInfo, PolyFnSig, RigidTy, Span, Ty, TyKind, VariantDef,
2727
};
28-
use stable_mir::{Crate, CrateItem, CrateNum, DefId, Error, Filename, ItemKind, Symbol};
28+
use stable_mir::{Crate, CrateDef, CrateItem, CrateNum, DefId, Error, Filename, ItemKind, Symbol};
2929
use std::cell::RefCell;
3030
use std::iter;
3131

@@ -67,6 +67,39 @@ impl<'tcx> Context for TablesWrapper<'tcx> {
6767
tables.tcx.is_mir_available(def_id)
6868
}
6969

70+
fn foreign_modules(&self, crate_num: CrateNum) -> Vec<stable_mir::ty::ForeignModuleDef> {
71+
let mut tables = self.0.borrow_mut();
72+
let tcx = tables.tcx;
73+
tcx.foreign_modules(crate_num.internal(&mut *tables, tcx))
74+
.keys()
75+
.map(|mod_def_id| tables.foreign_module_def(*mod_def_id))
76+
.collect()
77+
}
78+
79+
fn foreign_module(
80+
&self,
81+
mod_def: stable_mir::ty::ForeignModuleDef,
82+
) -> stable_mir::ty::ForeignModule {
83+
let mut tables = self.0.borrow_mut();
84+
let def_id = tables[mod_def.def_id()];
85+
let mod_def = tables.tcx.foreign_modules(def_id.krate).get(&def_id).unwrap();
86+
mod_def.stable(&mut *tables)
87+
}
88+
89+
fn foreign_items(&self, mod_def: stable_mir::ty::ForeignModuleDef) -> Vec<ForeignDef> {
90+
let mut tables = self.0.borrow_mut();
91+
let def_id = tables[mod_def.def_id()];
92+
tables
93+
.tcx
94+
.foreign_modules(def_id.krate)
95+
.get(&def_id)
96+
.unwrap()
97+
.foreign_items
98+
.iter()
99+
.map(|item_def| tables.foreign_def(*item_def))
100+
.collect()
101+
}
102+
70103
fn all_trait_decls(&self) -> stable_mir::TraitDecls {
71104
let mut tables = self.0.borrow_mut();
72105
tables.tcx.all_traits().map(|trait_def_id| tables.trait_def(trait_def_id)).collect()
@@ -225,6 +258,21 @@ impl<'tcx> Context for TablesWrapper<'tcx> {
225258
tables.tcx.is_foreign_item(tables[item])
226259
}
227260

261+
fn foreign_item_kind(&self, def: ForeignDef) -> ForeignItemKind {
262+
let mut tables = self.0.borrow_mut();
263+
let def_id = tables[def.def_id()];
264+
let tcx = tables.tcx;
265+
use rustc_hir::def::DefKind;
266+
match tcx.def_kind(def_id) {
267+
DefKind::Fn => ForeignItemKind::Fn(tables.fn_def(def_id)),
268+
DefKind::Static(..) => ForeignItemKind::Static(tables.static_def(def_id)),
269+
DefKind::ForeignTy => ForeignItemKind::Type(
270+
tables.intern_ty(rustc_middle::ty::Ty::new_foreign(tcx, def_id)),
271+
),
272+
def_kind => unreachable!("Unexpected kind for a foreign item: {:?}", def_kind),
273+
}
274+
}
275+
228276
fn adt_kind(&self, def: AdtDef) -> AdtKind {
229277
let mut tables = self.0.borrow_mut();
230278
let tcx = tables.tcx;

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

+50-30
Original file line numberDiff line numberDiff line change
@@ -202,41 +202,13 @@ where
202202
impl<'tcx> Stable<'tcx> for ty::FnSig<'tcx> {
203203
type T = stable_mir::ty::FnSig;
204204
fn stable(&self, tables: &mut Tables<'_>) -> Self::T {
205-
use rustc_target::spec::abi;
206-
use stable_mir::ty::{Abi, FnSig};
205+
use stable_mir::ty::FnSig;
207206

208207
FnSig {
209208
inputs_and_output: self.inputs_and_output.iter().map(|ty| ty.stable(tables)).collect(),
210209
c_variadic: self.c_variadic,
211210
unsafety: self.unsafety.stable(tables),
212-
abi: match self.abi {
213-
abi::Abi::Rust => Abi::Rust,
214-
abi::Abi::C { unwind } => Abi::C { unwind },
215-
abi::Abi::Cdecl { unwind } => Abi::Cdecl { unwind },
216-
abi::Abi::Stdcall { unwind } => Abi::Stdcall { unwind },
217-
abi::Abi::Fastcall { unwind } => Abi::Fastcall { unwind },
218-
abi::Abi::Vectorcall { unwind } => Abi::Vectorcall { unwind },
219-
abi::Abi::Thiscall { unwind } => Abi::Thiscall { unwind },
220-
abi::Abi::Aapcs { unwind } => Abi::Aapcs { unwind },
221-
abi::Abi::Win64 { unwind } => Abi::Win64 { unwind },
222-
abi::Abi::SysV64 { unwind } => Abi::SysV64 { unwind },
223-
abi::Abi::PtxKernel => Abi::PtxKernel,
224-
abi::Abi::Msp430Interrupt => Abi::Msp430Interrupt,
225-
abi::Abi::X86Interrupt => Abi::X86Interrupt,
226-
abi::Abi::EfiApi => Abi::EfiApi,
227-
abi::Abi::AvrInterrupt => Abi::AvrInterrupt,
228-
abi::Abi::AvrNonBlockingInterrupt => Abi::AvrNonBlockingInterrupt,
229-
abi::Abi::CCmseNonSecureCall => Abi::CCmseNonSecureCall,
230-
abi::Abi::Wasm => Abi::Wasm,
231-
abi::Abi::System { unwind } => Abi::System { unwind },
232-
abi::Abi::RustIntrinsic => Abi::RustIntrinsic,
233-
abi::Abi::RustCall => Abi::RustCall,
234-
abi::Abi::PlatformIntrinsic => Abi::PlatformIntrinsic,
235-
abi::Abi::Unadjusted => Abi::Unadjusted,
236-
abi::Abi::RustCold => Abi::RustCold,
237-
abi::Abi::RiscvInterruptM => Abi::RiscvInterruptM,
238-
abi::Abi::RiscvInterruptS => Abi::RiscvInterruptS,
239-
},
211+
abi: self.abi.stable(tables),
240212
}
241213
}
242214
}
@@ -832,3 +804,51 @@ impl<'tcx> Stable<'tcx> for ty::Movability {
832804
}
833805
}
834806
}
807+
808+
impl<'tcx> Stable<'tcx> for rustc_target::spec::abi::Abi {
809+
type T = stable_mir::ty::Abi;
810+
811+
fn stable(&self, _: &mut Tables<'_>) -> Self::T {
812+
use rustc_target::spec::abi;
813+
use stable_mir::ty::Abi;
814+
match *self {
815+
abi::Abi::Rust => Abi::Rust,
816+
abi::Abi::C { unwind } => Abi::C { unwind },
817+
abi::Abi::Cdecl { unwind } => Abi::Cdecl { unwind },
818+
abi::Abi::Stdcall { unwind } => Abi::Stdcall { unwind },
819+
abi::Abi::Fastcall { unwind } => Abi::Fastcall { unwind },
820+
abi::Abi::Vectorcall { unwind } => Abi::Vectorcall { unwind },
821+
abi::Abi::Thiscall { unwind } => Abi::Thiscall { unwind },
822+
abi::Abi::Aapcs { unwind } => Abi::Aapcs { unwind },
823+
abi::Abi::Win64 { unwind } => Abi::Win64 { unwind },
824+
abi::Abi::SysV64 { unwind } => Abi::SysV64 { unwind },
825+
abi::Abi::PtxKernel => Abi::PtxKernel,
826+
abi::Abi::Msp430Interrupt => Abi::Msp430Interrupt,
827+
abi::Abi::X86Interrupt => Abi::X86Interrupt,
828+
abi::Abi::EfiApi => Abi::EfiApi,
829+
abi::Abi::AvrInterrupt => Abi::AvrInterrupt,
830+
abi::Abi::AvrNonBlockingInterrupt => Abi::AvrNonBlockingInterrupt,
831+
abi::Abi::CCmseNonSecureCall => Abi::CCmseNonSecureCall,
832+
abi::Abi::Wasm => Abi::Wasm,
833+
abi::Abi::System { unwind } => Abi::System { unwind },
834+
abi::Abi::RustIntrinsic => Abi::RustIntrinsic,
835+
abi::Abi::RustCall => Abi::RustCall,
836+
abi::Abi::PlatformIntrinsic => Abi::PlatformIntrinsic,
837+
abi::Abi::Unadjusted => Abi::Unadjusted,
838+
abi::Abi::RustCold => Abi::RustCold,
839+
abi::Abi::RiscvInterruptM => Abi::RiscvInterruptM,
840+
abi::Abi::RiscvInterruptS => Abi::RiscvInterruptS,
841+
}
842+
}
843+
}
844+
845+
impl<'tcx> Stable<'tcx> for rustc_session::cstore::ForeignModule {
846+
type T = stable_mir::ty::ForeignModule;
847+
848+
fn stable(&self, tables: &mut Tables<'_>) -> Self::T {
849+
stable_mir::ty::ForeignModule {
850+
def_id: tables.foreign_module_def(self.def_id),
851+
abi: self.abi.stable(tables),
852+
}
853+
}
854+
}

Diff for: compiler/stable_mir/src/compiler_interface.rs

+10-3
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,10 @@ use crate::mir::mono::{Instance, InstanceDef, StaticDef};
1111
use crate::mir::Body;
1212
use crate::target::MachineInfo;
1313
use crate::ty::{
14-
AdtDef, AdtKind, Allocation, ClosureDef, ClosureKind, Const, FieldDef, FnDef, GenericArgs,
15-
GenericPredicates, Generics, ImplDef, ImplTrait, LineInfo, PolyFnSig, RigidTy, Span, TraitDecl,
16-
TraitDef, Ty, TyKind, VariantDef,
14+
AdtDef, AdtKind, Allocation, ClosureDef, ClosureKind, Const, FieldDef, FnDef, ForeignDef,
15+
ForeignItemKind, ForeignModule, ForeignModuleDef, GenericArgs, GenericPredicates, Generics,
16+
ImplDef, ImplTrait, LineInfo, PolyFnSig, RigidTy, Span, TraitDecl, TraitDef, Ty, TyKind,
17+
VariantDef,
1718
};
1819
use crate::{
1920
mir, Crate, CrateItem, CrateItems, CrateNum, DefId, Error, Filename, ImplTraitDecls, ItemKind,
@@ -31,6 +32,9 @@ pub trait Context {
3132
fn mir_body(&self, item: DefId) -> mir::Body;
3233
/// Check whether the body of a function is available.
3334
fn has_body(&self, item: DefId) -> bool;
35+
fn foreign_modules(&self, crate_num: CrateNum) -> Vec<ForeignModuleDef>;
36+
fn foreign_module(&self, mod_def: ForeignModuleDef) -> ForeignModule;
37+
fn foreign_items(&self, mod_def: ForeignModuleDef) -> Vec<ForeignDef>;
3438
fn all_trait_decls(&self) -> TraitDecls;
3539
fn trait_decls(&self, crate_num: CrateNum) -> TraitDecls;
3640
fn trait_decl(&self, trait_def: &TraitDef) -> TraitDecl;
@@ -66,6 +70,9 @@ pub trait Context {
6670
/// Returns whether this is a foreign item.
6771
fn is_foreign_item(&self, item: DefId) -> bool;
6872

73+
/// Returns the kind of a given foreign item.
74+
fn foreign_item_kind(&self, def: ForeignDef) -> ForeignItemKind;
75+
6976
/// Returns the kind of a given algebraic data type
7077
fn adt_kind(&self, def: AdtDef) -> AdtKind;
7178

Diff for: compiler/stable_mir/src/lib.rs

+6-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ pub use crate::error::*;
3030
use crate::mir::pretty::function_name;
3131
use crate::mir::Body;
3232
use crate::mir::Mutability;
33-
use crate::ty::{ImplDef, IndexedVal, Span, TraitDef, Ty};
33+
use crate::ty::{ForeignModuleDef, ImplDef, IndexedVal, Span, TraitDef, Ty};
3434

3535
pub mod abi;
3636
#[macro_use]
@@ -86,6 +86,11 @@ pub struct Crate {
8686
}
8787

8888
impl Crate {
89+
/// The list of foreign modules in this crate.
90+
pub fn foreign_modules(&self) -> Vec<ForeignModuleDef> {
91+
with(|cx| cx.foreign_modules(self.id))
92+
}
93+
8994
/// The list of traits declared in this crate.
9095
pub fn trait_decls(&self) -> TraitDecls {
9196
with(|cx| cx.trait_decls(self.id))

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

+35-1
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ use super::{
44
with, DefId, Error, Symbol,
55
};
66
use crate::abi::Layout;
7-
use crate::crate_def::CrateDef;
87
use crate::mir::alloc::{read_target_int, read_target_uint, AllocId};
98
use crate::target::MachineInfo;
9+
use crate::{crate_def::CrateDef, mir::mono::StaticDef};
1010
use crate::{Filename, Opaque};
1111
use std::fmt::{self, Debug, Display, Formatter};
1212
use std::ops::Range;
@@ -539,11 +539,45 @@ pub enum Movability {
539539
Movable,
540540
}
541541

542+
crate_def! {
543+
pub ForeignModuleDef;
544+
}
545+
546+
impl ForeignModuleDef {
547+
pub fn module(&self) -> ForeignModule {
548+
with(|cx| cx.foreign_module(*self))
549+
}
550+
}
551+
552+
pub struct ForeignModule {
553+
pub def_id: ForeignModuleDef,
554+
pub abi: Abi,
555+
}
556+
557+
impl ForeignModule {
558+
pub fn items(&self) -> Vec<ForeignDef> {
559+
with(|cx| cx.foreign_items(self.def_id))
560+
}
561+
}
562+
542563
crate_def! {
543564
/// Hold information about a ForeignItem in a crate.
544565
pub ForeignDef;
545566
}
546567

568+
impl ForeignDef {
569+
pub fn kind(&self) -> ForeignItemKind {
570+
with(|cx| cx.foreign_item_kind(*self))
571+
}
572+
}
573+
574+
#[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)]
575+
pub enum ForeignItemKind {
576+
Fn(FnDef),
577+
Static(StaticDef),
578+
Type(Ty),
579+
}
580+
547581
crate_def! {
548582
/// Hold information about a function definition in a crate.
549583
pub FnDef;

0 commit comments

Comments
 (0)