sonatina_ir/builder/
mod.rs1mod 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}