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