rapx/preprocess/
ssa_preprocess.rs1use 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 }
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}