tiny.choir.backends.wasm.emission.inspection
Defined in backends.wasm.emission.
API (1)
Actions
Public operations.
Source
Source: lib/choir/src/backends/wasm/emission/inspection.zig
zig
const std = @import("std");const ir = @import("../../../core/root.zig");const dialects = @import("../../../dialects/root.zig");const emission = @import("root.zig");const BuiltinDialect = dialects.BuiltinDialect;const FuncDialect = dialects.FuncDialect;const MemrefDialect = dialects.MemrefDialect;const types = emission.types;pub fn inspect(module: *ir.Operation, options: emission.Options) emission.Error!emission.Facts { if (!std.mem.eql(u8, module.name.name, BuiltinDialect.ModuleOp.operation_name)) { return error.CodeGenFailed; } var facts = emission.Facts{ .function_count = 0, .import_count = 0, .definition_count = 0, .value_count = 0, .local_count = 0, .nesting_depth = 0, .needs_memory = false, }; const module_op = BuiltinDialect.ModuleOp{ .op = module }; var ops = module_op.getBodyBlock().getOperations(); while (ops.next()) |operation| { if (!std.mem.eql(u8, operation.name.name, FuncDialect.FuncOp.operation_name)) { return error.CodeGenFailed; } const func = FuncDialect.FuncOp{ .op = operation }; _ = func.getName() orelse return error.CodeGenFailed; facts.function_count = try addCount(facts.function_count, 1); const inputs = func.getInputTypes() orelse &.{}; try inspectTypes(inputs, &facts.needs_memory); try inspectTypes(func.getResultTypes(), &facts.needs_memory); if (func.isDeclaration()) { facts.import_count = try addCount(facts.import_count, 1); continue; } facts.definition_count = try addCount(facts.definition_count, 1); const args = func.getArguments(); facts.value_count = try addCount(facts.value_count, args.len); for (args) |argument| _ = try types.wasmTypeForType(argument.type); try inspectBlock(func.getEntryBlock(), true, 0, &facts); } try requireU32(facts.function_count); try requireU32(facts.import_count); try requireU32(facts.definition_count); try requireU32(facts.value_count); try requireU32(facts.local_count); if (options.entry != null) { var symbols = try emission.symbols.Iterator.init(module, options); var found = false; while (try symbols.next()) |symbol| { if (symbol.role == .provided) { found = true; break; } } if (!found) return error.FunctionNotFound; } return facts;}fn inspectBlock( block: *ir.Block, skip_arguments: bool, depth: usize, facts: *emission.Facts,) emission.Error!void { if (depth > emission.max_nesting_depth) return error.NestingLimitExceeded; facts.nesting_depth = @max(facts.nesting_depth, depth); if (!skip_arguments) { facts.value_count = try addCount(facts.value_count, block.arguments.items.len); facts.local_count = try addCount(facts.local_count, block.arguments.items.len); for (block.arguments.items) |argument| _ = try types.wasmTypeForType(argument.type); } var ops = block.getOperations(); while (ops.next()) |operation| { facts.value_count = try addCount(facts.value_count, operation.results.items.len); facts.local_count = try addCount(facts.local_count, operation.results.items.len); for (operation.results.items) |result| _ = try types.wasmTypeForType(result.type); if (std.mem.eql(u8, operation.name.name, MemrefDialect.LoadOp.operation_name) or std.mem.eql(u8, operation.name.name, MemrefDialect.StoreOp.operation_name)) { facts.needs_memory = true; } for (operation.regions.items) |*region| { if (region.blocks.size != 1) return error.CodeGenFailed; const entry = region.getEntryBlock() orelse return error.CodeGenFailed; try inspectBlock(entry, false, depth + 1, facts); } }}fn inspectTypes(value_types: []const ir.Type, needs_memory: *bool) emission.Error!void { try requireU32(value_types.len); for (value_types) |typ| { _ = try types.wasmTypeForType(typ); if (types.typeIsMemref(typ)) needs_memory.* = true; }}fn addCount(lhs: usize, rhs: usize) emission.Error!usize { return std.math.add(usize, lhs, rhs) catch error.CapacityOverflow;}fn requireU32(value: usize) emission.Error!void { if (value > std.math.maxInt(u32)) return error.CapacityOverflow;}Source: lib/choir/src/backends/wasm/emission/root.zig:8
zig
pub const inspection = inspection_module;Complete call list for backends.wasm.emission.inspection.inspect
7 direct calls.
lib.choir.src.backends.wasm.emission.inspection.addCount[function] — private source atlib/choir/src/backends/wasm/emission/inspection.zig:109in nearest public ownertiny.choir.backends.wasm.emission.inspectionlib.choir.src.backends.wasm.emission.inspection.inspectBlock[function] — private source atlib/choir/src/backends/wasm/emission/inspection.zig:69in nearest public ownertiny.choir.backends.wasm.emission.inspectionlib.choir.src.backends.wasm.emission.inspection.inspectTypes[function] — private source atlib/choir/src/backends/wasm/emission/inspection.zig:101in nearest public ownertiny.choir.backends.wasm.emission.inspectionlib.choir.src.backends.wasm.emission.inspection.requireU32[function] — private source atlib/choir/src/backends/wasm/emission/inspection.zig:113in nearest public ownertiny.choir.backends.wasm.emission.inspectiontiny.choir.backends.wasm.emission.symbols.Iterator.init[function] atlib/choir/src/backends/wasm/emission/symbols.zig:25tiny.choir.backends.wasm.emission.symbols.Iterator.next[method] atlib/choir/src/backends/wasm/emission/symbols.zig:36tiny.choir.backends.wasm.emission.types.wasmTypeForType[function] atlib/choir/src/backends/wasm/emission/types.zig:15
Audit
| Definitions | 2 |
|---|---|
| Public names | 2 |
| Members | 0 |
| Version | 26.7.0 |
| Revision | daab053ee433 |