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