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 }