midenc_codegen_masm/
lib.rs

1#![feature(debug_closure_helpers)]
2#![feature(assert_matches)]
3#![feature(iter_array_chunks)]
4#![feature(iterator_try_collect)]
5#![deny(warnings)]
6
7extern crate alloc;
8
9mod artifact;
10mod data_segments;
11mod emit;
12mod emitter;
13mod events;
14pub mod intrinsics;
15mod linker;
16mod lower;
17mod opt;
18mod stack;
19
20pub mod masm {
21    pub use miden_assembly_syntax::{
22        KernelLibrary, Library, LibraryNamespace, LibraryPath,
23        ast::*,
24        debuginfo::{SourceSpan, Span, Spanned},
25        parser::{IntValue, PushValue},
26    };
27}
28
29pub(crate) use self::lower::HirLowering;
30pub use self::{
31    artifact::{MasmComponent, Rodata},
32    events::{TRACE_FRAME_END, TRACE_FRAME_START, TraceEvent},
33    lower::{NativePtr, ToMasmComponent},
34    stack::{Constraint, Operand, OperandStack},
35};
36
37pub fn register_dialect_hooks(context: &midenc_hir::Context) {
38    use midenc_dialect_arith as arith;
39    use midenc_dialect_cf as cf;
40    use midenc_dialect_hir as hir;
41    use midenc_dialect_scf as scf;
42    use midenc_dialect_ub as ub;
43    use midenc_hir::dialects::builtin;
44
45    context.register_dialect_hook::<builtin::BuiltinDialect, _>(|info, _context| {
46        info.register_operation_trait::<builtin::Ret, dyn HirLowering>();
47        info.register_operation_trait::<builtin::RetImm, dyn HirLowering>();
48        info.register_operation_trait::<builtin::GlobalSymbol, dyn HirLowering>();
49    });
50    context.register_dialect_hook::<arith::ArithDialect, _>(|info, _context| {
51        info.register_operation_trait::<arith::Constant, dyn HirLowering>();
52        info.register_operation_trait::<arith::Add, dyn HirLowering>();
53        info.register_operation_trait::<arith::AddOverflowing, dyn HirLowering>();
54        info.register_operation_trait::<arith::Sub, dyn HirLowering>();
55        info.register_operation_trait::<arith::SubOverflowing, dyn HirLowering>();
56        info.register_operation_trait::<arith::Mul, dyn HirLowering>();
57        info.register_operation_trait::<arith::MulOverflowing, dyn HirLowering>();
58        info.register_operation_trait::<arith::Exp, dyn HirLowering>();
59        info.register_operation_trait::<arith::Div, dyn HirLowering>();
60        info.register_operation_trait::<arith::Sdiv, dyn HirLowering>();
61        info.register_operation_trait::<arith::Mod, dyn HirLowering>();
62        info.register_operation_trait::<arith::Smod, dyn HirLowering>();
63        info.register_operation_trait::<arith::Divmod, dyn HirLowering>();
64        info.register_operation_trait::<arith::Sdivmod, dyn HirLowering>();
65        info.register_operation_trait::<arith::And, dyn HirLowering>();
66        info.register_operation_trait::<arith::Or, dyn HirLowering>();
67        info.register_operation_trait::<arith::Xor, dyn HirLowering>();
68        info.register_operation_trait::<arith::Band, dyn HirLowering>();
69        info.register_operation_trait::<arith::Bor, dyn HirLowering>();
70        info.register_operation_trait::<arith::Bxor, dyn HirLowering>();
71        info.register_operation_trait::<arith::Shl, dyn HirLowering>();
72        info.register_operation_trait::<arith::Shr, dyn HirLowering>();
73        info.register_operation_trait::<arith::Ashr, dyn HirLowering>();
74        info.register_operation_trait::<arith::Rotl, dyn HirLowering>();
75        info.register_operation_trait::<arith::Rotr, dyn HirLowering>();
76        info.register_operation_trait::<arith::Eq, dyn HirLowering>();
77        info.register_operation_trait::<arith::Neq, dyn HirLowering>();
78        info.register_operation_trait::<arith::Gt, dyn HirLowering>();
79        info.register_operation_trait::<arith::Gte, dyn HirLowering>();
80        info.register_operation_trait::<arith::Lt, dyn HirLowering>();
81        info.register_operation_trait::<arith::Lte, dyn HirLowering>();
82        info.register_operation_trait::<arith::Min, dyn HirLowering>();
83        info.register_operation_trait::<arith::Max, dyn HirLowering>();
84        info.register_operation_trait::<arith::Trunc, dyn HirLowering>();
85        info.register_operation_trait::<arith::Zext, dyn HirLowering>();
86        info.register_operation_trait::<arith::Sext, dyn HirLowering>();
87        info.register_operation_trait::<arith::Incr, dyn HirLowering>();
88        info.register_operation_trait::<arith::Neg, dyn HirLowering>();
89        info.register_operation_trait::<arith::Inv, dyn HirLowering>();
90        info.register_operation_trait::<arith::Ilog2, dyn HirLowering>();
91        info.register_operation_trait::<arith::Pow2, dyn HirLowering>();
92        info.register_operation_trait::<arith::Not, dyn HirLowering>();
93        info.register_operation_trait::<arith::Bnot, dyn HirLowering>();
94        info.register_operation_trait::<arith::IsOdd, dyn HirLowering>();
95        info.register_operation_trait::<arith::Popcnt, dyn HirLowering>();
96        info.register_operation_trait::<arith::Clz, dyn HirLowering>();
97        info.register_operation_trait::<arith::Ctz, dyn HirLowering>();
98        info.register_operation_trait::<arith::Clo, dyn HirLowering>();
99        info.register_operation_trait::<arith::Cto, dyn HirLowering>();
100        info.register_operation_trait::<arith::Join, dyn HirLowering>();
101        info.register_operation_trait::<arith::Split, dyn HirLowering>();
102    });
103    context.register_dialect_hook::<cf::ControlFlowDialect, _>(|info, _context| {
104        info.register_operation_trait::<cf::Select, dyn HirLowering>();
105        info.register_operation_trait::<cf::CondBr, dyn HirLowering>();
106    });
107    context.register_dialect_hook::<scf::ScfDialect, _>(|info, _context| {
108        info.register_operation_trait::<scf::If, dyn HirLowering>();
109        info.register_operation_trait::<scf::While, dyn HirLowering>();
110        info.register_operation_trait::<scf::IndexSwitch, dyn HirLowering>();
111        info.register_operation_trait::<scf::Condition, dyn HirLowering>();
112        info.register_operation_trait::<scf::Yield, dyn HirLowering>();
113    });
114    context.register_dialect_hook::<ub::UndefinedBehaviorDialect, _>(|info, _context| {
115        info.register_operation_trait::<ub::Unreachable, dyn HirLowering>();
116        info.register_operation_trait::<ub::Poison, dyn HirLowering>();
117    });
118    context.register_dialect_hook::<hir::HirDialect, _>(|info, _context| {
119        info.register_operation_trait::<hir::Assert, dyn HirLowering>();
120        info.register_operation_trait::<hir::Assertz, dyn HirLowering>();
121        info.register_operation_trait::<hir::AssertEq, dyn HirLowering>();
122        info.register_operation_trait::<hir::PtrToInt, dyn HirLowering>();
123        info.register_operation_trait::<hir::IntToPtr, dyn HirLowering>();
124        info.register_operation_trait::<hir::Cast, dyn HirLowering>();
125        info.register_operation_trait::<hir::Bitcast, dyn HirLowering>();
126        //info.register_operation_trait::<hir::ConstantBytes, dyn HirLowering>();
127        info.register_operation_trait::<hir::Exec, dyn HirLowering>();
128        info.register_operation_trait::<hir::Call, dyn HirLowering>();
129        info.register_operation_trait::<hir::Store, dyn HirLowering>();
130        info.register_operation_trait::<hir::StoreLocal, dyn HirLowering>();
131        info.register_operation_trait::<hir::Load, dyn HirLowering>();
132        info.register_operation_trait::<hir::LoadLocal, dyn HirLowering>();
133        info.register_operation_trait::<hir::MemGrow, dyn HirLowering>();
134        info.register_operation_trait::<hir::MemSize, dyn HirLowering>();
135        info.register_operation_trait::<hir::MemSet, dyn HirLowering>();
136        info.register_operation_trait::<hir::MemCpy, dyn HirLowering>();
137        info.register_operation_trait::<hir::Breakpoint, dyn HirLowering>();
138    });
139}