authorgravatar for luuk@degram.devLuuk de Gram <luuk@degram.dev> 2022-03-23 18:33:48+01:00
committergravatar for luuk@degram.devLuuk de Gram <luuk@degram.dev> 2022-03-23 21:40:33+01:00
log685f05b562b1e5d001ae2da23485c03b704d19f6
treefbf6e9697e10d6405807e7813150c5228e168250
parenta9a629f89a1d72130103bd59800e1257af84c97c
signaturelock-open Commit is signed but in an unrecognized format.

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.

1 files changed, 18 insertions(+), 1 deletions(-)

src/arch/wasm/CodeGen.zig+18-1
...@@ -1886,6 +1886,23 @@ fn lowerParentPtr(self: *Self, ptr_val: Value, ptr_child_ty: Type) InnerError!WV...@@ -1886,6 +1886,23 @@ fn lowerParentPtr(self: *Self, ptr_val: Value, ptr_child_ty: Type) InnerError!WV
1886 .offset = @intCast(u32, offset),1886 .offset = @intCast(u32, offset),
1887 } };1887 } };
1888 },1888 },
1889 .opt_payload_ptr => {
1890 const payload_ptr = ptr_val.castTag(.opt_payload_ptr).?.data;
1891 const parent_ptr = try self.lowerParentPtr(payload_ptr.container_ptr, payload_ptr.container_ty);
1892 var buf: Type.Payload.ElemType = undefined;
1893 const payload_ty = payload_ptr.container_ty.optionalChild(&buf);
1894 if (!payload_ty.hasRuntimeBitsIgnoreComptime() or payload_ty.isPtrLikeOptional()) {
1895 return parent_ptr;
1896 }
1897
1898 const abi_size = payload_ptr.container_ty.abiSize(self.target);
1899 const offset = abi_size - payload_ty.abiSize(self.target);
1900
1901 return WValue{ .memory_offset = .{
1902 .pointer = parent_ptr.memory,
1903 .offset = @intCast(u32, offset),
1904 } };
1905 },
1889 else => |tag| return self.fail("TODO: Implement lowerParentPtr for tag: {}", .{tag}),1906 else => |tag| return self.fail("TODO: Implement lowerParentPtr for tag: {}", .{tag}),
1890 }1907 }
1891}1908}
...@@ -1948,7 +1965,7 @@ fn lowerConstant(self: *Self, val: Value, ty: Type) InnerError!WValue {...@@ -1948,7 +1965,7 @@ fn lowerConstant(self: *Self, val: Value, ty: Type) InnerError!WValue {
1948 else => unreachable,1965 else => unreachable,
1949 },1966 },
1950 .Pointer => switch (val.tag()) {1967 .Pointer => switch (val.tag()) {
1951 .field_ptr, .elem_ptr => {1968 .field_ptr, .elem_ptr, .opt_payload_ptr => {
1952 return self.lowerParentPtr(val, ty.childType());1969 return self.lowerParentPtr(val, ty.childType());
1953 },1970 },
1954 .int_u64, .one => return WValue{ .imm32 = @intCast(u32, val.toUnsignedInt(target)) },1971 .int_u64, .one => return WValue{ .imm32 = @intCast(u32, val.toUnsignedInt(target)) },