| ... | @@ -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)) }, |