| ... | @@ -380,7 +380,7 @@ pub fn generateSymbol( | ... | @@ -380,7 +380,7 @@ pub fn generateSymbol( |
| 380 | | 380 | |
| 381 | return Result.ok; | 381 | return Result.ok; |
| 382 | }, | 382 | }, |
| 383 | .field_ptr, .elem_ptr => return lowerParentPtr( | 383 | .field_ptr, .elem_ptr, .opt_payload_ptr => return lowerParentPtr( |
| 384 | bin_file, | 384 | bin_file, |
| 385 | src_loc, | 385 | src_loc, |
| 386 | typed_value, | 386 | typed_value, |
| ... | @@ -812,7 +812,6 @@ fn lowerParentPtr( | ... | @@ -812,7 +812,6 @@ fn lowerParentPtr( |
| 812 | reloc_info: RelocInfo, | 812 | reloc_info: RelocInfo, |
| 813 | ) CodeGenError!Result { | 813 | ) CodeGenError!Result { |
| 814 | const target = bin_file.options.target; | 814 | const target = bin_file.options.target; |
| 815 | | | |
| 816 | switch (parent_ptr.tag()) { | 815 | switch (parent_ptr.tag()) { |
| 817 | .field_ptr => { | 816 | .field_ptr => { |
| 818 | const field_ptr = parent_ptr.castTag(.field_ptr).?.data; | 817 | const field_ptr = parent_ptr.castTag(.field_ptr).?.data; |
| ... | @@ -858,6 +857,31 @@ fn lowerParentPtr( | ... | @@ -858,6 +857,31 @@ fn lowerParentPtr( |
| 858 | reloc_info.offset(@intCast(u32, elem_ptr.index * elem_ptr.elem_ty.abiSize(target))), | 857 | reloc_info.offset(@intCast(u32, elem_ptr.index * elem_ptr.elem_ty.abiSize(target))), |
| 859 | ); | 858 | ); |
| 860 | }, | 859 | }, |
| | 860 | .opt_payload_ptr => { |
| | 861 | const opt_payload_ptr = parent_ptr.castTag(.opt_payload_ptr).?.data; |
| | 862 | return lowerParentPtr( |
| | 863 | bin_file, |
| | 864 | src_loc, |
| | 865 | typed_value, |
| | 866 | opt_payload_ptr.container_ptr, |
| | 867 | code, |
| | 868 | debug_output, |
| | 869 | reloc_info, |
| | 870 | ); |
| | 871 | }, |
| | 872 | .eu_payload_ptr => { |
| | 873 | const eu_payload_ptr = parent_ptr.castTag(.eu_payload_ptr).?.data; |
| | 874 | const pl_ty = eu_payload_ptr.container_ty.errorUnionPayload(); |
| | 875 | return lowerParentPtr( |
| | 876 | bin_file, |
| | 877 | src_loc, |
| | 878 | typed_value, |
| | 879 | eu_payload_ptr.container_ptr, |
| | 880 | code, |
| | 881 | debug_output, |
| | 882 | reloc_info.offset(@intCast(u32, errUnionPayloadOffset(pl_ty, target))), |
| | 883 | ); |
| | 884 | }, |
| 861 | .variable, .decl_ref, .decl_ref_mut => |tag| return lowerDeclRef( | 885 | .variable, .decl_ref, .decl_ref_mut => |tag| return lowerDeclRef( |
| 862 | bin_file, | 886 | bin_file, |
| 863 | src_loc, | 887 | src_loc, |
| ... | @@ -1262,9 +1286,10 @@ pub fn genTypedValue( | ... | @@ -1262,9 +1286,10 @@ pub fn genTypedValue( |
| 1262 | } | 1286 | } |
| 1263 | | 1287 | |
| 1264 | pub fn errUnionPayloadOffset(payload_ty: Type, target: std.Target) u64 { | 1288 | pub fn errUnionPayloadOffset(payload_ty: Type, target: std.Target) u64 { |
| | 1289 | if (!payload_ty.hasRuntimeBitsIgnoreComptime()) return 0; |
| 1265 | const payload_align = payload_ty.abiAlignment(target); | 1290 | const payload_align = payload_ty.abiAlignment(target); |
| 1266 | const error_align = Type.anyerror.abiAlignment(target); | 1291 | const error_align = Type.anyerror.abiAlignment(target); |
| 1267 | if (payload_align >= error_align) { | 1292 | if (payload_align >= error_align or !payload_ty.hasRuntimeBitsIgnoreComptime()) { |
| 1268 | return 0; | 1293 | return 0; |
| 1269 | } else { | 1294 | } else { |
| 1270 | return mem.alignForwardGeneric(u64, Type.anyerror.abiSize(target), payload_align); | 1295 | return mem.alignForwardGeneric(u64, Type.anyerror.abiSize(target), payload_align); |
| ... | @@ -1272,9 +1297,10 @@ pub fn errUnionPayloadOffset(payload_ty: Type, target: std.Target) u64 { | ... | @@ -1272,9 +1297,10 @@ pub fn errUnionPayloadOffset(payload_ty: Type, target: std.Target) u64 { |
| 1272 | } | 1297 | } |
| 1273 | | 1298 | |
| 1274 | pub fn errUnionErrorOffset(payload_ty: Type, target: std.Target) u64 { | 1299 | pub fn errUnionErrorOffset(payload_ty: Type, target: std.Target) u64 { |
| | 1300 | if (!payload_ty.hasRuntimeBitsIgnoreComptime()) return 0; |
| 1275 | const payload_align = payload_ty.abiAlignment(target); | 1301 | const payload_align = payload_ty.abiAlignment(target); |
| 1276 | const error_align = Type.anyerror.abiAlignment(target); | 1302 | const error_align = Type.anyerror.abiAlignment(target); |
| 1277 | if (payload_align >= error_align) { | 1303 | if (payload_align >= error_align and payload_ty.hasRuntimeBitsIgnoreComptime()) { |
| 1278 | return mem.alignForwardGeneric(u64, payload_ty.abiSize(target), error_align); | 1304 | return mem.alignForwardGeneric(u64, payload_ty.abiSize(target), error_align); |
| 1279 | } else { | 1305 | } else { |
| 1280 | return 0; | 1306 | return 0; |