rustc_smir/
bridge.rs

1//! Defines a set of traits that is used for abstracting
2//! stable_mir's components that are needed in rustc_smir.
3//!
4//! These traits are really useful when programming
5//! in stable_mir-agnostic settings.
6
7use std::fmt::Debug;
8
9use super::context::SmirCtxt;
10use super::{Bridge, Tables};
11
12pub trait SmirError {
13    fn new(msg: String) -> Self;
14    fn from_internal<T: Debug>(err: T) -> Self;
15}
16
17pub trait Prov<B: Bridge> {
18    fn new(aid: B::AllocId) -> Self;
19}
20
21pub trait Allocation<B: Bridge> {
22    fn new<'tcx>(
23        bytes: Vec<Option<u8>>,
24        ptrs: Vec<(usize, rustc_middle::mir::interpret::AllocId)>,
25        align: u64,
26        mutability: rustc_middle::mir::Mutability,
27        tables: &mut Tables<'tcx, B>,
28        cx: &SmirCtxt<'tcx, B>,
29    ) -> Self;
30}
31
32macro_rules! make_bridge_trait {
33    ($name:ident) => {
34        pub trait $name<B: Bridge> {
35            fn new(did: B::DefId) -> Self;
36        }
37    };
38}
39
40make_bridge_trait!(CrateItem);
41make_bridge_trait!(AdtDef);
42make_bridge_trait!(ForeignModuleDef);
43make_bridge_trait!(ForeignDef);
44make_bridge_trait!(FnDef);
45make_bridge_trait!(ClosureDef);
46make_bridge_trait!(CoroutineDef);
47make_bridge_trait!(CoroutineClosureDef);
48make_bridge_trait!(AliasDef);
49make_bridge_trait!(ParamDef);
50make_bridge_trait!(BrNamedDef);
51make_bridge_trait!(TraitDef);
52make_bridge_trait!(GenericDef);
53make_bridge_trait!(ConstDef);
54make_bridge_trait!(ImplDef);
55make_bridge_trait!(RegionDef);
56make_bridge_trait!(CoroutineWitnessDef);
57make_bridge_trait!(AssocDef);
58make_bridge_trait!(OpaqueDef);
59make_bridge_trait!(StaticDef);