| ... | ... | @@ -1886,6 +1886,23 @@ fn lowerParentPtr(self: *Self, ptr_val: Value, ptr_child_ty: Type) InnerError!WV |
| 1886 | 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 | 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 | 1965 | else => unreachable, |
| 1949 | 1966 | }, |
| 1950 | 1967 | .Pointer => switch (val.tag()) { |
| 1951 | | .field_ptr, .elem_ptr => { |
| 1968 | .field_ptr, .elem_ptr, .opt_payload_ptr => { |
| 1952 | 1969 | return self.lowerParentPtr(val, ty.childType()); |
| 1953 | 1970 | }, |
| 1954 | 1971 | .int_u64, .one => return WValue{ .imm32 = @intCast(u32, val.toUnsignedInt(target)) }, |