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 }