lib/choir/src/backends/wasm/emission/module/section/import.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, .import, plan.sections.import);
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.importCount());
29 try wasm.binary.writeUleb(out, plan.importCount());
30 var symbols = try emission.symbols.Iterator.init(module, .{});
31 while (try symbols.next()) |symbol| {
32 if (symbol.role != .required) continue;
33 try common.writeName(out, "env");
34 try common.writeName(out, symbol.name);
35 try out.writeByte(@backingInt(wasm.binary.ExternalKind.function));
36 _ = try common.requireU32(symbol.function_ordinal);
37 try wasm.binary.writeUleb(out, symbol.function_ordinal);
38 }
39 }