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::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}