Skip to documentation
SLOP

tiny.choir.backends.wasm.emission.inspection

Reference tiny.choir backends wasm emission inspection

Defined in backends.wasm.emission.

API (1)

Actions

Public operations.

No direct callersNo direct callsbackends.wasm.emissioninspection
Static calls · unresolved targets: unknown · external targets: unknown.

Source

Called byCallsbackends.wasm.emission.Limitsinspectprivate sourcelib.choir.src.backends.wasm.emission.inspectionaddCountprivate sourcelib.choir.src.backends.wasm.emission.inspectioninspectBlockprivate sourcelib.choir.src.backends.wasm.emission.inspectioninspectTypesprivate sourcelib.choir.src.backends.wasm.emission.inspectionrequireU32backends.wasm.emission.symbols.Iteratorinit+2 morebackends.wasm.emission.inspectioninspect
Static calls · unresolved targets: 0 · external targets: 8.

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.

Audit

Definitions2
Public names2
Members0
Version26.7.0
Revisiondaab053ee433