about summary refs log tree commit diff
path: root/compiler/rustc_public_bridge/src/bridge.rs
blob: 379a8da5df9d284f4071a497556a64f29b1f3633 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
//! Defines a set of traits that is used for abstracting
//! rustc_public's components that are needed in rustc_public_bridge.
//!
//! These traits are really useful when programming
//! in rustc_public-agnostic settings.

use std::fmt::Debug;

use super::context::SmirCtxt;
use super::{Bridge, Tables};

pub trait SmirError {
    fn new(msg: String) -> Self;
    fn from_internal<T: Debug>(err: T) -> Self;
}

pub trait Prov<B: Bridge> {
    fn new(aid: B::AllocId) -> Self;
}

pub trait Allocation<B: Bridge> {
    fn new<'tcx>(
        bytes: Vec<Option<u8>>,
        ptrs: Vec<(usize, rustc_middle::mir::interpret::AllocId)>,
        align: u64,
        mutability: rustc_middle::mir::Mutability,
        tables: &mut Tables<'tcx, B>,
        cx: &SmirCtxt<'tcx, B>,
    ) -> Self;
}

macro_rules! make_bridge_trait {
    ($name:ident) => {
        pub trait $name<B: Bridge> {
            fn new(did: B::DefId) -> Self;
        }
    };
}

make_bridge_trait!(CrateItem);
make_bridge_trait!(AdtDef);
make_bridge_trait!(ForeignModuleDef);
make_bridge_trait!(ForeignDef);
make_bridge_trait!(FnDef);
make_bridge_trait!(ClosureDef);
make_bridge_trait!(CoroutineDef);
make_bridge_trait!(CoroutineClosureDef);
make_bridge_trait!(AliasDef);
make_bridge_trait!(ParamDef);
make_bridge_trait!(BrNamedDef);
make_bridge_trait!(TraitDef);
make_bridge_trait!(GenericDef);
make_bridge_trait!(ConstDef);
make_bridge_trait!(ImplDef);
make_bridge_trait!(RegionDef);
make_bridge_trait!(CoroutineWitnessDef);
make_bridge_trait!(AssocDef);
make_bridge_trait!(OpaqueDef);
make_bridge_trait!(StaticDef);