aboutsummaryrefslogtreecommitdiff
path: root/src/Sema.zig
diff options
context:
space:
mode:
authorLuuk de Gram <luuk@degram.dev>2022-03-02 22:18:45 +0100
committerAndrew Kelley <andrew@ziglang.org>2022-03-03 16:33:46 -0700
commitec4c30ae483e6700a1fd1d5edaadbb042790c52e (patch)
tree72a0cc5ffcf656a1654cd3adbf7fd3d6f06aa525 /src/Sema.zig
parent0ea51f7f494cd84a48fd997b60196d6c4254ccac (diff)
downloadzig-ec4c30ae483e6700a1fd1d5edaadbb042790c52e.tar.gz
zig-ec4c30ae483e6700a1fd1d5edaadbb042790c52e.zip
wasm: Implement `@wasmMemorySize()` builtin
This implements the `wasmMemorySize` builtin, in Sema and the Wasm backend. The Stage2 implementation differs from stage1 in the way that `index` must be a comptime value. The stage1 variant is incorrect, as the index is part of the instruction encoding, and therefore, cannot be a runtime value.
Diffstat (limited to 'src/Sema.zig')
-rw-r--r--src/Sema.zig12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index fa25e1e403..3dbbdaeb27 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -14034,7 +14034,17 @@ fn zirWasmMemorySize(
) CompileError!Air.Inst.Ref {
const extra = sema.code.extraData(Zir.Inst.UnNode, extended.operand).data;
const src: LazySrcLoc = .{ .node_offset = extra.node };
- return sema.fail(block, src, "TODO: implement Sema.zirWasmMemorySize", .{});
+
+ const operand = try sema.resolveInt(block, src, extra.operand, Type.u32);
+ const index = @intCast(u32, operand);
+ try sema.requireRuntimeBlock(block, src);
+ return block.addInst(.{
+ .tag = .wasm_memory_size,
+ .data = .{ .ty_pl = .{
+ .ty = try sema.addType(Type.u32),
+ .payload = try sema.addExtra(Air.WasmMemoryIndex{ .index = index }),
+ } },
+ });
}
fn zirWasmMemoryGrow(