rapx/preprocess/
ssa_preprocess.rs

1use super::set_attrs;
2use rustc_ast::*;
3use rustc_span::{
4    DUMMY_SP,
5    symbol::{Ident, Symbol},
6};
7use thin_vec::ThinVec;
8
9pub(crate) fn create_ssa_struct(_krate: &mut Crate, build_std: bool) {
10    rap_debug!("[CALLBACK] Injecting new structs into the AST...");
11
12    let ssa_struct = create_struct(
13        "SSAstmt",
14        vec![
15            ("para1", Symbol::intern("i128")),
16            ("para2", Symbol::intern("i128")),
17            ("para3", Symbol::intern("i128")),
18            ("para4", Symbol::intern("i128")),
19            ("para5", Symbol::intern("i128")),
20            ("para6", Symbol::intern("i128")),
21            ("para7", Symbol::intern("i128")),
22            ("para8", Symbol::intern("i128")),
23            ("para9", Symbol::intern("i128")),
24            ("para10", Symbol::intern("i128")),
25        ],
26        build_std,
27    );
28
29    let essa_struct = create_struct(
30        "ESSAstmt",
31        vec![
32            ("op1", Symbol::intern("i128")),
33            ("op2", Symbol::intern("i128")),
34            ("cmp", Symbol::intern("i128")),
35            ("switch_bb", Symbol::intern("i128")),
36        ],
37        build_std,
38    );
39
40    _krate.items.push(ssa_struct);
41    _krate.items.push(essa_struct);
42
43    // println!("[CALLBACK] Injection complete. Continuing compilation...");
44}
45pub(crate) fn create_struct(
46    name: &str,
47    fields_def: Vec<(&str, Symbol)>,
48    build_std: bool,
49) -> Box<Item> {
50    let fields: ThinVec<FieldDef> = fields_def
51        .into_iter()
52        .map(|(fname, fty)| FieldDef {
53            attrs: set_attrs(build_std),
54            vis: Visibility {
55                span: DUMMY_SP,
56                kind: VisibilityKind::Public,
57                tokens: None,
58            },
59            ident: Some(Ident::from_str(fname)),
60            ty: Box::new(Ty {
61                id: NodeId::from_u32(0),
62                kind: TyKind::Path(None, Path::from_ident(Ident::with_dummy_span(fty))),
63                span: DUMMY_SP,
64                tokens: None,
65            }),
66            id: NodeId::from_u32(0),
67            span: DUMMY_SP,
68            is_placeholder: false,
69            safety: Safety::Default,
70            default: None,
71        })
72        .collect();
73
74    let ident = Ident {
75        name: Symbol::intern(name),
76        span: DUMMY_SP,
77    };
78    let variant_data = VariantData::Struct {
79        fields,
80        recovered: Recovered::No,
81    };
82
83    let item_kind = ItemKind::Struct(ident, Generics::default(), variant_data);
84
85    Box::new(Item {
86        attrs: set_attrs(build_std),
87        id: NodeId::from_u32(0),
88        kind: item_kind,
89        vis: Visibility {
90            span: DUMMY_SP,
91            kind: VisibilityKind::Public,
92            tokens: None,
93        },
94        span: DUMMY_SP,
95        tokens: None,
96    })
97}