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