aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLuuk de Gram <luuk@degram.dev>2022-03-23 18:33:48 +0100
committerLuuk de Gram <luuk@degram.dev>2022-03-23 21:40:33 +0100
commit685f05b562b1e5d001ae2da23485c03b704d19f6 (patch)
treefbf6e9697e10d6405807e7813150c5228e168250 /src
parenta9a629f89a1d72130103bd59800e1257af84c97c (diff)
downloadzig-685f05b562b1e5d001ae2da23485c03b704d19f6.tar.gz
zig-685f05b562b1e5d001ae2da23485c03b704d19f6.zip
wasm: Implement opt_payload_ptr
Implements lowering constants for pointers of value 'opt_payload_ptr'. The offset is calculated by determining the abi size of the full type and then substracting the payload size.
Diffstat (limited to 'src')
-rw-r--r--src/arch/wasm/CodeGen.zig19
1 files changed, 18 insertions, 1 deletions
diff --git a/src/arch/wasm/CodeGen.zig b/src/arch/wasm/CodeGen.zig
index 0300c0b612..0415d8c90a 100644
--- a/src/arch/wasm/CodeGen.zig
+++ b/src/arch/wasm/CodeGen.zig
@@ -1886,6 +1886,23 @@ fn lowerParentPtr(self: *Self, ptr_val: Value, ptr_child_ty: Type) InnerError!WV
.offset = @intCast(u32, offset),
} };
},
+ .opt_payload_ptr => {
+ const payload_ptr = ptr_val.castTag(.opt_payload_ptr).?.data;
+ const parent_ptr = try self.lowerParentPtr(payload_ptr.container_ptr, payload_ptr.container_ty);
+ var buf: Type.Payload.ElemType = undefined;
+ const payload_ty = payload_ptr.container_ty.optionalChild(&buf);
+ if (!payload_ty.hasRuntimeBitsIgnoreComptime() or payload_ty.isPtrLikeOptional()) {
+ return parent_ptr;
+ }
+
+ const abi_size = payload_ptr.container_ty.abiSize(self.target);
+ const offset = abi_size - payload_ty.abiSize(self.target);
+
+ return WValue{ .memory_offset = .{
+ .pointer = parent_ptr.memory,
+ .offset = @intCast(u32, offset),
+ } };
+ },
else => |tag| return self.fail("TODO: Implement lowerParentPtr for tag: {}", .{tag}),
}
}
@@ -1948,7 +1965,7 @@ fn lowerConstant(self: *Self, val: Value, ty: Type) InnerError!WValue {
else => unreachable,
},
.Pointer => switch (val.tag()) {
- .field_ptr, .elem_ptr => {
+ .field_ptr, .elem_ptr, .opt_payload_ptr => {
return self.lowerParentPtr(val, ty.childType());
},
.int_u64, .one => return WValue{ .imm32 = @intCast(u32, val.toUnsignedInt(target)) },