rapx/preprocess/
ssa_preprocess.rs

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