lib/choir/src/backends/wasm/emission/module/section/function.zig
daab053ee43316e1809a84551d573ddd1e5bf3d2
1 const wasm = @import("../../../root.zig");
2 const emission = @import("../../root.zig");
3 const common = @import("../root.zig").common;
4
5 pub fn write(
6 out: anytype,
7 plan: *const emission.Plan,
8 module: *common.ir.Operation,
9 ) emission.Error!void {
10 try common.writeSectionHeader(out, .function, plan.sections.function);
11 try writeBody(out, plan, module);
12 }
13
14 pub fn countBody(
15 plan: *const emission.Plan,
16 module: *common.ir.Operation,
17 ) emission.Error!usize {
18 var count = wasm.binary.Count{};
19 try writeBody(&count, plan, module);
20 return common.requireU32(count.len);
21 }
22
23 fn writeBody(
24 out: anytype,
25 plan: *const emission.Plan,
26 module: *common.ir.Operation,
27 ) emission.Error!void {
28 _ = try common.requireU32(plan.definitionCount());
29 try wasm.binary.writeUleb(out, plan.definitionCount());
30 const module_op = try common.moduleOperation(module);
31 var ordinal: usize = 0;
32 var operations = module_op.getBodyBlock().getOperations();
33 while (operations.next()) |operation| : (ordinal += 1) {
34 const function = try common.functionOperation(operation);
35 if (function.isDeclaration()) continue;
36 _ = try common.requireU32(ordinal);
37 try wasm.binary.writeUleb(out, ordinal);
38 }
39 }