Skip to main content

sonatina_ir/builder/
mod.rs

1mod func_builder;
2mod module_builder;
3mod ssa;
4
5pub use func_builder::FunctionBuilder;
6pub use module_builder::ModuleBuilder;
7
8pub use ssa::Variable;
9
10pub mod test_util {
11    use super::*;
12
13    use sonatina_triple::TargetTriple;
14
15    use crate::{
16        ir_writer::FuncWriter,
17        isa::{IsaBuilder, TargetIsa},
18        module::{FuncRef, Module, ModuleCtx},
19        Function, Linkage, Signature, Type,
20    };
21
22    pub fn build_test_isa() -> TargetIsa {
23        let triple = TargetTriple::parse("evm-ethereum-london").unwrap();
24        IsaBuilder::new(triple).build()
25    }
26
27    pub struct TestModuleBuilder {
28        module_builder: ModuleBuilder,
29        func_ref: Option<FuncRef>,
30    }
31
32    impl TestModuleBuilder {
33        pub fn new() -> Self {
34            Self::default()
35        }
36
37        pub fn func_builder(&mut self, args: &[Type], ret_ty: Type) -> FunctionBuilder {
38            let sig = Signature::new("test_func", Linkage::Public, args, ret_ty);
39            let func_ref = self.module_builder.declare_function(sig);
40            self.func_ref = Some(func_ref);
41            self.module_builder.func_builder(func_ref)
42        }
43
44        pub fn build(self) -> Module {
45            self.module_builder.build()
46        }
47    }
48
49    pub fn dump_func(func: &Function) -> String {
50        let mut writer = FuncWriter::new(func);
51        writer.dump_string().unwrap()
52    }
53
54    impl Default for TestModuleBuilder {
55        fn default() -> Self {
56            let ctx = ModuleCtx::new(build_test_isa());
57            Self {
58                module_builder: ModuleBuilder::new(ctx),
59                func_ref: None,
60            }
61        }
62    }
63}