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 }