lib/choir/src/backends/wasm/emission/module/common.zig
daab053ee43316e1809a84551d573ddd1e5bf3d2
1 const std = @import("std");
2 const wasm = @import("../../root.zig");
3 pub const ir = @import("../../../../core/root.zig");
4 const dialects = @import("../../../../dialects/root.zig");
5 const emission = @import("../root.zig");
6
7 pub const BuiltinDialect = dialects.BuiltinDialect;
8 pub const FuncDialect = dialects.FuncDialect;
9
10 pub fn moduleOperation(module: *ir.Operation) emission.Error!BuiltinDialect.ModuleOp {
11 if (!std.mem.eql(u8, module.name.name, BuiltinDialect.ModuleOp.operation_name)) {
12 return error.CodeGenFailed;
13 }
14 return .{ .op = module };
15 }
16
17 pub fn functionOperation(operation: *ir.Operation) emission.Error!FuncDialect.FuncOp {
18 if (!std.mem.eql(u8, operation.name.name, FuncDialect.FuncOp.operation_name)) {
19 return error.CodeGenFailed;
20 }
21 return .{ .op = operation };
22 }
23
24 pub fn writeTypeVector(out: anytype, types: []const ir.Type) emission.Error!void {
25 _ = try requireU32(types.len);
26 try wasm.binary.writeUleb(out, types.len);
27 for (types) |typ| {
28 try wasm.binary.writeValueType(out, try emission.types.wasmTypeForType(typ));
29 }
30 }
31
32 pub fn writeSectionHeader(
33 out: anytype,
34 section: wasm.binary.Section,
35 body_bytes: usize,
36 ) emission.Error!void {
37 _ = try requireU32(body_bytes);
38 try wasm.binary.writeSectionHeader(out, section, body_bytes);
39 }
40
41 pub fn writeName(out: anytype, name: []const u8) emission.Error!void {
42 _ = try requireU32(name.len);
43 try wasm.binary.writeName(out, name);
44 }
45
46 pub fn requireU32(value: usize) emission.Error!usize {
47 if (value > std.math.maxInt(u32)) return error.CapacityOverflow;
48 return value;
49 }