1#![feature(debug_closure_helpers)]
2#![feature(iter_array_chunks)]
3#![deny(warnings)]
4
5extern crate alloc;
6
7mod artifact;
8mod data_segments;
9mod emit;
10mod emitter;
11mod events;
12pub mod intrinsics;
13mod legalization;
14mod linker;
15mod lower;
16mod opt;
17mod stack;
18
19pub mod masm {
20 pub use miden_assembly_syntax::{
21 Path as LibraryPathRef, PathBuf as LibraryPath, PathComponent as LibraryPathComponent,
22 ast::*,
23 debuginfo::{SourceSpan, Span, Spanned},
24 parser::{IntValue, PushValue},
25 };
26}
27
28use midenc_dialect_arith as arith;
29use midenc_dialect_cf as cf;
30use midenc_dialect_hir as hir;
31use midenc_dialect_scf as scf;
32use midenc_dialect_ub as ub;
33use midenc_dialect_wasm as wasm;
34use midenc_hir::{
35 dialects::{builtin, debuginfo},
36 inventory,
37};
38
39pub(crate) use self::lower::HirLowering;
40pub use self::{
41 artifact::{MasmComponent, Rodata},
42 events::{Event, FRAME_END_EVENT, FRAME_START_EVENT, PRINT_LN_EVENT},
43 legalization::{LegalizeForMasm, masm_legalization_target, populate_masm_legalization_target},
44 lower::{NativePtr, ToMasmComponent},
45 stack::{Constraint, Operand, OperandStack},
46};
47
48inventory::submit!(::midenc_hir::DialectRegistrationHookInfo::new::<builtin::BuiltinDialect>(
49 lower_builtin_ops
50));
51inventory::submit!(::midenc_hir::DialectRegistrationHookInfo::new::<arith::ArithDialect>(
52 lower_arith_ops
53));
54inventory::submit!(::midenc_hir::DialectRegistrationHookInfo::new::<cf::ControlFlowDialect>(
55 lower_cf_ops
56));
57inventory::submit!(::midenc_hir::DialectRegistrationHookInfo::new::<scf::ScfDialect>(
58 lower_scf_ops
59));
60inventory::submit!(::midenc_hir::DialectRegistrationHookInfo::new::<ub::UndefinedBehaviorDialect>(
61 lower_ub_ops
62));
63inventory::submit!(::midenc_hir::DialectRegistrationHookInfo::new::<hir::HirDialect>(
64 lower_hir_ops
65));
66inventory::submit!(::midenc_hir::DialectRegistrationHookInfo::new::<wasm::WasmDialect>(
67 lower_wasm_ops
68));
69inventory::submit!(::midenc_hir::DialectRegistrationHookInfo::new::<debuginfo::DebugInfoDialect>(
70 lower_debuginfo_ops
71));
72
73fn lower_builtin_ops(info: &mut midenc_hir::DialectInfo) {
74 info.register_operation_trait::<builtin::Ret, dyn HirLowering>();
75 info.register_operation_trait::<builtin::RetImm, dyn HirLowering>();
76 info.register_operation_trait::<builtin::GlobalSymbol, dyn HirLowering>();
77 info.register_operation_trait::<builtin::UnrealizedConversionCast, dyn HirLowering>();
78}
79
80fn lower_arith_ops(info: &mut midenc_hir::DialectInfo) {
81 info.register_operation_trait::<arith::Constant, dyn HirLowering>();
82 info.register_operation_trait::<arith::Add, dyn HirLowering>();
83 info.register_operation_trait::<arith::AddOverflowing, dyn HirLowering>();
84 info.register_operation_trait::<arith::Sub, dyn HirLowering>();
85 info.register_operation_trait::<arith::SubOverflowing, dyn HirLowering>();
86 info.register_operation_trait::<arith::Mul, dyn HirLowering>();
87 info.register_operation_trait::<arith::MulOverflowing, dyn HirLowering>();
88 info.register_operation_trait::<arith::Exp, dyn HirLowering>();
89 info.register_operation_trait::<arith::Div, dyn HirLowering>();
90 info.register_operation_trait::<arith::Ext2Add, dyn HirLowering>();
91 info.register_operation_trait::<arith::Ext2Sub, dyn HirLowering>();
92 info.register_operation_trait::<arith::Ext2Mul, dyn HirLowering>();
93 info.register_operation_trait::<arith::Ext2Div, dyn HirLowering>();
94 info.register_operation_trait::<arith::Sdiv, dyn HirLowering>();
95 info.register_operation_trait::<arith::Mod, dyn HirLowering>();
96 info.register_operation_trait::<arith::Smod, dyn HirLowering>();
97 info.register_operation_trait::<arith::Divmod, dyn HirLowering>();
98 info.register_operation_trait::<arith::Sdivmod, dyn HirLowering>();
99 info.register_operation_trait::<arith::And, dyn HirLowering>();
100 info.register_operation_trait::<arith::Or, dyn HirLowering>();
101 info.register_operation_trait::<arith::Xor, dyn HirLowering>();
102 info.register_operation_trait::<arith::Band, dyn HirLowering>();
103 info.register_operation_trait::<arith::Bor, dyn HirLowering>();
104 info.register_operation_trait::<arith::Bxor, dyn HirLowering>();
105 info.register_operation_trait::<arith::Shl, dyn HirLowering>();
106 info.register_operation_trait::<arith::Shr, dyn HirLowering>();
107 info.register_operation_trait::<arith::Ashr, dyn HirLowering>();
108 info.register_operation_trait::<arith::Rotl, dyn HirLowering>();
109 info.register_operation_trait::<arith::Rotr, dyn HirLowering>();
110 info.register_operation_trait::<arith::Eq, dyn HirLowering>();
111 info.register_operation_trait::<arith::Neq, dyn HirLowering>();
112 info.register_operation_trait::<arith::Gt, dyn HirLowering>();
113 info.register_operation_trait::<arith::Gte, dyn HirLowering>();
114 info.register_operation_trait::<arith::Lt, dyn HirLowering>();
115 info.register_operation_trait::<arith::Lte, dyn HirLowering>();
116 info.register_operation_trait::<arith::Min, dyn HirLowering>();
117 info.register_operation_trait::<arith::Max, dyn HirLowering>();
118 info.register_operation_trait::<arith::Trunc, dyn HirLowering>();
119 info.register_operation_trait::<arith::Zext, dyn HirLowering>();
120 info.register_operation_trait::<arith::Sext, dyn HirLowering>();
121 info.register_operation_trait::<arith::Incr, dyn HirLowering>();
122 info.register_operation_trait::<arith::Neg, dyn HirLowering>();
123 info.register_operation_trait::<arith::Inv, dyn HirLowering>();
124 info.register_operation_trait::<arith::Ext2Neg, dyn HirLowering>();
125 info.register_operation_trait::<arith::Ext2Inv, dyn HirLowering>();
126 info.register_operation_trait::<arith::Ilog2, dyn HirLowering>();
127 info.register_operation_trait::<arith::Pow2, dyn HirLowering>();
128 info.register_operation_trait::<arith::Not, dyn HirLowering>();
129 info.register_operation_trait::<arith::Bnot, dyn HirLowering>();
130 info.register_operation_trait::<arith::IsOdd, dyn HirLowering>();
131 info.register_operation_trait::<arith::Popcnt, dyn HirLowering>();
132 info.register_operation_trait::<arith::Clz, dyn HirLowering>();
133 info.register_operation_trait::<arith::Ctz, dyn HirLowering>();
134 info.register_operation_trait::<arith::Clo, dyn HirLowering>();
135 info.register_operation_trait::<arith::Cto, dyn HirLowering>();
136 info.register_operation_trait::<arith::Join, dyn HirLowering>();
137 info.register_operation_trait::<arith::Split, dyn HirLowering>();
138}
139
140fn lower_cf_ops(info: &mut midenc_hir::DialectInfo) {
141 info.register_operation_trait::<cf::Select, dyn HirLowering>();
142 info.register_operation_trait::<cf::CondBr, dyn HirLowering>();
143}
144
145fn lower_scf_ops(info: &mut midenc_hir::DialectInfo) {
146 info.register_operation_trait::<scf::If, dyn HirLowering>();
147 info.register_operation_trait::<scf::While, dyn HirLowering>();
148 info.register_operation_trait::<scf::IndexSwitch, dyn HirLowering>();
149 info.register_operation_trait::<scf::Condition, dyn HirLowering>();
150 info.register_operation_trait::<scf::Yield, dyn HirLowering>();
151}
152
153fn lower_ub_ops(info: &mut midenc_hir::DialectInfo) {
154 info.register_operation_trait::<ub::Unreachable, dyn HirLowering>();
155 info.register_operation_trait::<ub::Poison, dyn HirLowering>();
156}
157
158fn lower_hir_ops(info: &mut midenc_hir::DialectInfo) {
159 info.register_operation_trait::<hir::Assert, dyn HirLowering>();
160 info.register_operation_trait::<hir::Assertz, dyn HirLowering>();
161 info.register_operation_trait::<hir::AssertEq, dyn HirLowering>();
162 info.register_operation_trait::<hir::AssertU32, dyn HirLowering>();
163 info.register_operation_trait::<hir::PtrToInt, dyn HirLowering>();
164 info.register_operation_trait::<hir::IntToPtr, dyn HirLowering>();
165 info.register_operation_trait::<hir::Cast, dyn HirLowering>();
166 info.register_operation_trait::<hir::Bitcast, dyn HirLowering>();
167 info.register_operation_trait::<hir::ConstantPointer, dyn HirLowering>();
169 info.register_operation_trait::<hir::Exec, dyn HirLowering>();
170 info.register_operation_trait::<hir::ExecIndirect, dyn HirLowering>();
171 info.register_operation_trait::<hir::ProcedureRoot, dyn HirLowering>();
172 info.register_operation_trait::<hir::ExecFpi, dyn HirLowering>();
173 info.register_operation_trait::<hir::Call, dyn HirLowering>();
174 info.register_operation_trait::<hir::Syscall, dyn HirLowering>();
175 info.register_operation_trait::<hir::Store, dyn HirLowering>();
176 info.register_operation_trait::<hir::StoreLocal, dyn HirLowering>();
177 info.register_operation_trait::<hir::Load, dyn HirLowering>();
178 info.register_operation_trait::<hir::LoadLocal, dyn HirLowering>();
179 info.register_operation_trait::<hir::LocalAddress, dyn HirLowering>();
180 info.register_operation_trait::<hir::Caller, dyn HirLowering>();
181 info.register_operation_trait::<hir::Clk, dyn HirLowering>();
182 info.register_operation_trait::<hir::AdvicePop, dyn HirLowering>();
183 info.register_operation_trait::<hir::AdviceLoadWord, dyn HirLowering>();
184 info.register_operation_trait::<hir::AdvicePipe, dyn HirLowering>();
185 info.register_operation_trait::<hir::EmitEvent, dyn HirLowering>();
186 info.register_operation_trait::<hir::EmitEventImm, dyn HirLowering>();
187 info.register_operation_trait::<hir::SystemEvent, dyn HirLowering>();
188 info.register_operation_trait::<hir::Hash, dyn HirLowering>();
189 info.register_operation_trait::<hir::HMerge, dyn HirLowering>();
190 info.register_operation_trait::<hir::HPerm, dyn HirLowering>();
191 info.register_operation_trait::<hir::MTreeGet, dyn HirLowering>();
192 info.register_operation_trait::<hir::MTreeSet, dyn HirLowering>();
193 info.register_operation_trait::<hir::MTreeMerge, dyn HirLowering>();
194 info.register_operation_trait::<hir::MTreeVerify, dyn HirLowering>();
195 info.register_operation_trait::<hir::CryptoStream, dyn HirLowering>();
196 info.register_operation_trait::<hir::FriExt2Fold4, dyn HirLowering>();
197 info.register_operation_trait::<hir::HornerBase, dyn HirLowering>();
198 info.register_operation_trait::<hir::HornerExt, dyn HirLowering>();
199 info.register_operation_trait::<hir::EvalCircuit, dyn HirLowering>();
200 info.register_operation_trait::<hir::LogDeferred, dyn HirLowering>();
201 info.register_operation_trait::<hir::MemStream, dyn HirLowering>();
202 info.register_operation_trait::<hir::MemGrow, dyn HirLowering>();
203 info.register_operation_trait::<hir::MemSize, dyn HirLowering>();
204 info.register_operation_trait::<hir::MemSet, dyn HirLowering>();
205 info.register_operation_trait::<hir::MemCpy, dyn HirLowering>();
206 info.register_operation_trait::<hir::PrintLn, dyn HirLowering>();
207}
208
209fn lower_wasm_ops(info: &mut midenc_hir::DialectInfo) {
210 info.register_operation_trait::<wasm::SignExtend, dyn HirLowering>();
211 info.register_operation_trait::<wasm::I32Load8S, dyn HirLowering>();
212 info.register_operation_trait::<wasm::I32Load16S, dyn HirLowering>();
213 info.register_operation_trait::<wasm::I64Load8S, dyn HirLowering>();
214 info.register_operation_trait::<wasm::I64Load16S, dyn HirLowering>();
215 info.register_operation_trait::<wasm::I64Load32S, dyn HirLowering>();
216 info.register_operation_trait::<wasm::I32RemS, dyn HirLowering>();
217}
218
219fn lower_debuginfo_ops(info: &mut midenc_hir::DialectInfo) {
220 info.register_operation_trait::<debuginfo::DebugDeclare, dyn HirLowering>();
221 info.register_operation_trait::<debuginfo::DebugValue, dyn HirLowering>();
222 info.register_operation_trait::<debuginfo::DebugKill, dyn HirLowering>();
223}