| ... | ... | @@ -486,15 +486,19 @@ pub const Block = struct { |
| 486 | 486 | wad.* = undefined; |
| 487 | 487 | } |
| 488 | 488 | |
| 489 | | pub fn finish(wad: *WipAnonDecl, ty: Type, val: Value) !*Decl { |
| 489 | pub fn finish(wad: *WipAnonDecl, ty: Type, val: Value, alignment: u32) !*Decl { |
| 490 | 490 | const sema = wad.block.sema; |
| 491 | 491 | // Do this ahead of time because `createAnonymousDecl` depends on calling |
| 492 | 492 | // `type.hasRuntimeBits()`. |
| 493 | 493 | _ = try sema.typeHasRuntimeBits(wad.block, wad.src, ty); |
| 494 | const align_val = if (alignment != 0) blk: { |
| 495 | break :blk try Value.Tag.int_u64.create(wad.arena(), alignment); |
| 496 | } else Value.@"null"; |
| 494 | 497 | const new_decl = try sema.mod.createAnonymousDecl(wad.block, .{ |
| 495 | 498 | .ty = ty, |
| 496 | 499 | .val = val, |
| 497 | 500 | }); |
| 501 | new_decl.align_val = align_val; |
| 498 | 502 | errdefer sema.mod.abortAnonDecl(new_decl); |
| 499 | 503 | try new_decl.finalizeNewArena(&wad.new_decl_arena); |
| 500 | 504 | wad.finished = true; |
| ... | ... | @@ -1644,6 +1648,7 @@ fn zirCoerceResultPtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileE |
| 1644 | 1648 | iac.data.decl = try anon_decl.finish( |
| 1645 | 1649 | try pointee_ty.copy(anon_decl.arena()), |
| 1646 | 1650 | Value.undef, |
| 1651 | iac.data.alignment, |
| 1647 | 1652 | ); |
| 1648 | 1653 | if (iac.data.alignment != 0) { |
| 1649 | 1654 | try sema.resolveTypeLayout(block, src, pointee_ty); |
| ... | ... | @@ -2711,6 +2716,7 @@ fn zirResolveInferredAlloc(sema: *Sema, block: *Block, inst: Zir.Inst.Index) Com |
| 2711 | 2716 | const new_decl = try anon_decl.finish( |
| 2712 | 2717 | try final_elem_ty.copy(anon_decl.arena()), |
| 2713 | 2718 | try store_val.copy(anon_decl.arena()), |
| 2719 | inferred_alloc.data.alignment, |
| 2714 | 2720 | ); |
| 2715 | 2721 | break :d new_decl; |
| 2716 | 2722 | }; |
| ... | ... | @@ -3503,8 +3509,8 @@ fn storeToInferredAllocComptime( |
| 3503 | 3509 | iac.data.decl = try anon_decl.finish( |
| 3504 | 3510 | try operand_ty.copy(anon_decl.arena()), |
| 3505 | 3511 | try operand_val.copy(anon_decl.arena()), |
| 3512 | iac.data.alignment, |
| 3506 | 3513 | ); |
| 3507 | | // TODO set the alignment on the decl |
| 3508 | 3514 | return; |
| 3509 | 3515 | } else { |
| 3510 | 3516 | return sema.failWithNeededComptime(block, src); |
| ... | ... | @@ -3583,6 +3589,7 @@ fn addStrLit(sema: *Sema, block: *Block, zir_bytes: []const u8) CompileError!Air |
| 3583 | 3589 | const new_decl = try anon_decl.finish( |
| 3584 | 3590 | try Type.Tag.array_u8_sentinel_0.create(anon_decl.arena(), bytes.len), |
| 3585 | 3591 | try Value.Tag.bytes.create(anon_decl.arena(), bytes[0 .. bytes.len + 1]), |
| 3592 | 0, // default alignment |
| 3586 | 3593 | ); |
| 3587 | 3594 | |
| 3588 | 3595 | return sema.analyzeDeclRef(new_decl); |
| ... | ... | @@ -8147,6 +8154,7 @@ fn zirEmbedFile(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A |
| 8147 | 8154 | embed_file.owner_decl = try anon_decl.finish( |
| 8148 | 8155 | try Type.Tag.array_u8_sentinel_0.create(anon_decl.arena(), embed_file.bytes.len), |
| 8149 | 8156 | try Value.Tag.bytes.create(anon_decl.arena(), bytes_including_null), |
| 8157 | 0, // default alignment |
| 8150 | 8158 | ); |
| 8151 | 8159 | |
| 8152 | 8160 | return sema.analyzeDeclRef(embed_file.owner_decl); |
| ... | ... | @@ -8560,7 +8568,7 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 8560 | 8568 | .elem_type = try lhs_info.elem_type.copy(anon_decl.arena()), |
| 8561 | 8569 | }); |
| 8562 | 8570 | const val = try Value.Tag.aggregate.create(anon_decl.arena(), buf); |
| 8563 | | const decl = try anon_decl.finish(ty, val); |
| 8571 | const decl = try anon_decl.finish(ty, val, 0); |
| 8564 | 8572 | if (lhs_single_ptr or rhs_single_ptr) { |
| 8565 | 8573 | return sema.analyzeDeclRef(decl); |
| 8566 | 8574 | } else { |
| ... | ... | @@ -8733,7 +8741,7 @@ fn zirArrayMul(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 8733 | 8741 | } |
| 8734 | 8742 | break :blk try Value.Tag.aggregate.create(anon_decl.arena(), buf); |
| 8735 | 8743 | }; |
| 8736 | | const decl = try anon_decl.finish(final_ty, val); |
| 8744 | const decl = try anon_decl.finish(final_ty, val, 0); |
| 8737 | 8745 | if (is_single_ptr) { |
| 8738 | 8746 | return sema.analyzeDeclRef(decl); |
| 8739 | 8747 | } else { |
| ... | ... | @@ -10384,6 +10392,7 @@ fn zirBuiltinSrc( |
| 10384 | 10392 | const new_decl = try anon_decl.finish( |
| 10385 | 10393 | try Type.Tag.array_u8_sentinel_0.create(anon_decl.arena(), bytes.len - 1), |
| 10386 | 10394 | try Value.Tag.bytes.create(anon_decl.arena(), bytes), |
| 10395 | 0, // default alignment |
| 10387 | 10396 | ); |
| 10388 | 10397 | break :blk try Value.Tag.decl_ref.create(sema.arena, new_decl); |
| 10389 | 10398 | }; |
| ... | ... | @@ -10395,6 +10404,7 @@ fn zirBuiltinSrc( |
| 10395 | 10404 | const new_decl = try anon_decl.finish( |
| 10396 | 10405 | try Type.Tag.array_u8_sentinel_0.create(anon_decl.arena(), name.len), |
| 10397 | 10406 | try Value.Tag.bytes.create(anon_decl.arena(), name[0 .. name.len + 1]), |
| 10407 | 0, // default alignment |
| 10398 | 10408 | ); |
| 10399 | 10409 | break :blk try Value.Tag.decl_ref.create(sema.arena, new_decl); |
| 10400 | 10410 | }; |
| ... | ... | @@ -10547,6 +10557,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 10547 | 10557 | params_anon_decl.arena(), |
| 10548 | 10558 | param_vals, |
| 10549 | 10559 | ), |
| 10560 | 0, // default alignment |
| 10550 | 10561 | ); |
| 10551 | 10562 | break :v try Value.Tag.slice.create(sema.arena, .{ |
| 10552 | 10563 | .ptr = try Value.Tag.decl_ref.create(sema.arena, new_decl), |
| ... | ... | @@ -10736,6 +10747,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 10736 | 10747 | const new_decl = try anon_decl.finish( |
| 10737 | 10748 | try Type.Tag.array_u8_sentinel_0.create(anon_decl.arena(), bytes.len), |
| 10738 | 10749 | try Value.Tag.bytes.create(anon_decl.arena(), bytes[0 .. bytes.len + 1]), |
| 10750 | 0, // default alignment |
| 10739 | 10751 | ); |
| 10740 | 10752 | break :v try Value.Tag.decl_ref.create(fields_anon_decl.arena(), new_decl); |
| 10741 | 10753 | }; |
| ... | ... | @@ -10766,6 +10778,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 10766 | 10778 | fields_anon_decl.arena(), |
| 10767 | 10779 | vals, |
| 10768 | 10780 | ), |
| 10781 | 0, // default alignment |
| 10769 | 10782 | ); |
| 10770 | 10783 | |
| 10771 | 10784 | const new_decl_val = try Value.Tag.decl_ref.create(sema.arena, new_decl); |
| ... | ... | @@ -10844,6 +10857,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 10844 | 10857 | const new_decl = try anon_decl.finish( |
| 10845 | 10858 | try Type.Tag.array_u8_sentinel_0.create(anon_decl.arena(), bytes.len), |
| 10846 | 10859 | try Value.Tag.bytes.create(anon_decl.arena(), bytes[0 .. bytes.len + 1]), |
| 10860 | 0, // default alignment |
| 10847 | 10861 | ); |
| 10848 | 10862 | break :v try Value.Tag.decl_ref.create(fields_anon_decl.arena(), new_decl); |
| 10849 | 10863 | }; |
| ... | ... | @@ -10868,6 +10882,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 10868 | 10882 | fields_anon_decl.arena(), |
| 10869 | 10883 | enum_field_vals, |
| 10870 | 10884 | ), |
| 10885 | 0, // default alignment |
| 10871 | 10886 | ); |
| 10872 | 10887 | break :v try Value.Tag.decl_ref.create(sema.arena, new_decl); |
| 10873 | 10888 | }; |
| ... | ... | @@ -10936,6 +10951,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 10936 | 10951 | const new_decl = try anon_decl.finish( |
| 10937 | 10952 | try Type.Tag.array_u8_sentinel_0.create(anon_decl.arena(), bytes.len), |
| 10938 | 10953 | try Value.Tag.bytes.create(anon_decl.arena(), bytes[0 .. bytes.len + 1]), |
| 10954 | 0, // default alignment |
| 10939 | 10955 | ); |
| 10940 | 10956 | break :v try Value.Tag.decl_ref.create(fields_anon_decl.arena(), new_decl); |
| 10941 | 10957 | }; |
| ... | ... | @@ -10967,6 +10983,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 10967 | 10983 | fields_anon_decl.arena(), |
| 10968 | 10984 | try fields_anon_decl.arena().dupe(Value, union_field_vals), |
| 10969 | 10985 | ), |
| 10986 | 0, // default alignment |
| 10970 | 10987 | ); |
| 10971 | 10988 | break :v try Value.Tag.slice.create(sema.arena, .{ |
| 10972 | 10989 | .ptr = try Value.Tag.decl_ref.create(sema.arena, new_decl), |
| ... | ... | @@ -11044,6 +11061,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 11044 | 11061 | const new_decl = try anon_decl.finish( |
| 11045 | 11062 | try Type.Tag.array_u8_sentinel_0.create(anon_decl.arena(), bytes.len), |
| 11046 | 11063 | try Value.Tag.bytes.create(anon_decl.arena(), bytes[0 .. bytes.len + 1]), |
| 11064 | 0, // default alignment |
| 11047 | 11065 | ); |
| 11048 | 11066 | break :v try Value.Tag.slice.create(fields_anon_decl.arena(), .{ |
| 11049 | 11067 | .ptr = try Value.Tag.decl_ref.create(fields_anon_decl.arena(), new_decl), |
| ... | ... | @@ -11087,6 +11105,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 11087 | 11105 | const new_decl = try anon_decl.finish( |
| 11088 | 11106 | try Type.Tag.array_u8_sentinel_0.create(anon_decl.arena(), bytes.len), |
| 11089 | 11107 | try Value.Tag.bytes.create(anon_decl.arena(), bytes[0 .. bytes.len + 1]), |
| 11108 | 0, // default alignment |
| 11090 | 11109 | ); |
| 11091 | 11110 | break :v try Value.Tag.slice.create(fields_anon_decl.arena(), .{ |
| 11092 | 11111 | .ptr = try Value.Tag.decl_ref.create(fields_anon_decl.arena(), new_decl), |
| ... | ... | @@ -11132,6 +11151,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 11132 | 11151 | fields_anon_decl.arena(), |
| 11133 | 11152 | try fields_anon_decl.arena().dupe(Value, struct_field_vals), |
| 11134 | 11153 | ), |
| 11154 | 0, // default alignment |
| 11135 | 11155 | ); |
| 11136 | 11156 | break :v try Value.Tag.slice.create(sema.arena, .{ |
| 11137 | 11157 | .ptr = try Value.Tag.decl_ref.create(sema.arena, new_decl), |
| ... | ... | @@ -11225,6 +11245,7 @@ fn typeInfoDecls( |
| 11225 | 11245 | const new_decl = try anon_decl.finish( |
| 11226 | 11246 | try Type.Tag.array_u8_sentinel_0.create(anon_decl.arena(), bytes.len), |
| 11227 | 11247 | try Value.Tag.bytes.create(anon_decl.arena(), bytes[0 .. bytes.len + 1]), |
| 11248 | 0, // default alignment |
| 11228 | 11249 | ); |
| 11229 | 11250 | break :v try Value.Tag.slice.create(decls_anon_decl.arena(), .{ |
| 11230 | 11251 | .ptr = try Value.Tag.decl_ref.create(decls_anon_decl.arena(), new_decl), |
| ... | ... | @@ -11251,6 +11272,7 @@ fn typeInfoDecls( |
| 11251 | 11272 | decls_anon_decl.arena(), |
| 11252 | 11273 | try decls_anon_decl.arena().dupe(Value, decls_vals), |
| 11253 | 11274 | ), |
| 11275 | 0, // default alignment |
| 11254 | 11276 | ); |
| 11255 | 11277 | return try Value.Tag.slice.create(sema.arena, .{ |
| 11256 | 11278 | .ptr = try Value.Tag.decl_ref.create(sema.arena, new_decl), |
| ... | ... | @@ -12350,6 +12372,7 @@ fn addConstantMaybeRef( |
| 12350 | 12372 | const decl = try anon_decl.finish( |
| 12351 | 12373 | try ty.copy(anon_decl.arena()), |
| 12352 | 12374 | try val.copy(anon_decl.arena()), |
| 12375 | 0, // default alignment |
| 12353 | 12376 | ); |
| 12354 | 12377 | return sema.analyzeDeclRef(decl); |
| 12355 | 12378 | } |
| ... | ... | @@ -13227,6 +13250,7 @@ fn zirTypeName(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 13227 | 13250 | const new_decl = try anon_decl.finish( |
| 13228 | 13251 | try Type.Tag.array_u8_sentinel_0.create(anon_decl.arena(), bytes.len), |
| 13229 | 13252 | try Value.Tag.bytes.create(anon_decl.arena(), bytes[0 .. bytes.len + 1]), |
| 13253 | 0, // default alignment |
| 13230 | 13254 | ); |
| 13231 | 13255 | |
| 13232 | 13256 | return sema.analyzeDeclRef(new_decl); |
| ... | ... | @@ -15851,6 +15875,7 @@ fn safetyPanic( |
| 15851 | 15875 | break :msg_inst try sema.analyzeDeclRef(try anon_decl.finish( |
| 15852 | 15876 | try Type.Tag.array_u8.create(anon_decl.arena(), msg.len), |
| 15853 | 15877 | try Value.Tag.bytes.create(anon_decl.arena(), msg), |
| 15878 | 0, // default alignment |
| 15854 | 15879 | )); |
| 15855 | 15880 | }; |
| 15856 | 15881 | |
| ... | ... | @@ -16080,6 +16105,7 @@ fn fieldPtr( |
| 16080 | 16105 | return sema.analyzeDeclRef(try anon_decl.finish( |
| 16081 | 16106 | Type.usize, |
| 16082 | 16107 | try Value.Tag.int_u64.create(anon_decl.arena(), inner_ty.arrayLen()), |
| 16108 | 0, // default alignment |
| 16083 | 16109 | )); |
| 16084 | 16110 | } else { |
| 16085 | 16111 | return sema.fail( |
| ... | ... | @@ -16107,6 +16133,7 @@ fn fieldPtr( |
| 16107 | 16133 | return sema.analyzeDeclRef(try anon_decl.finish( |
| 16108 | 16134 | try slice_ptr_ty.copy(anon_decl.arena()), |
| 16109 | 16135 | try val.slicePtr().copy(anon_decl.arena()), |
| 16136 | 0, // default alignment |
| 16110 | 16137 | )); |
| 16111 | 16138 | } |
| 16112 | 16139 | try sema.requireRuntimeBlock(block, src); |
| ... | ... | @@ -16126,6 +16153,7 @@ fn fieldPtr( |
| 16126 | 16153 | return sema.analyzeDeclRef(try anon_decl.finish( |
| 16127 | 16154 | Type.usize, |
| 16128 | 16155 | try Value.Tag.int_u64.create(anon_decl.arena(), val.sliceLen()), |
| 16156 | 0, // default alignment |
| 16129 | 16157 | )); |
| 16130 | 16158 | } |
| 16131 | 16159 | try sema.requireRuntimeBlock(block, src); |
| ... | ... | @@ -16175,6 +16203,7 @@ fn fieldPtr( |
| 16175 | 16203 | return sema.analyzeDeclRef(try anon_decl.finish( |
| 16176 | 16204 | try child_type.copy(anon_decl.arena()), |
| 16177 | 16205 | try Value.Tag.@"error".create(anon_decl.arena(), .{ .name = name }), |
| 16206 | 0, // default alignment |
| 16178 | 16207 | )); |
| 16179 | 16208 | }, |
| 16180 | 16209 | .Union => { |
| ... | ... | @@ -16191,6 +16220,7 @@ fn fieldPtr( |
| 16191 | 16220 | return sema.analyzeDeclRef(try anon_decl.finish( |
| 16192 | 16221 | try enum_ty.copy(anon_decl.arena()), |
| 16193 | 16222 | try Value.Tag.enum_field_index.create(anon_decl.arena(), field_index_u32), |
| 16223 | 0, // default alignment |
| 16194 | 16224 | )); |
| 16195 | 16225 | } |
| 16196 | 16226 | } |
| ... | ... | @@ -16211,6 +16241,7 @@ fn fieldPtr( |
| 16211 | 16241 | return sema.analyzeDeclRef(try anon_decl.finish( |
| 16212 | 16242 | try child_type.copy(anon_decl.arena()), |
| 16213 | 16243 | try Value.Tag.enum_field_index.create(anon_decl.arena(), field_index_u32), |
| 16244 | 0, // default alignment |
| 16214 | 16245 | )); |
| 16215 | 16246 | }, |
| 16216 | 16247 | .Struct, .Opaque => { |
| ... | ... | @@ -16522,10 +16553,8 @@ fn structFieldPtrByIndex( |
| 16522 | 16553 | const decl = try anon_decl.finish( |
| 16523 | 16554 | try field.ty.copy(anon_decl.arena()), |
| 16524 | 16555 | try field.default_val.copy(anon_decl.arena()), |
| 16556 | ptr_ty_data.@"align", |
| 16525 | 16557 | ); |
| 16526 | | if (ptr_ty_data.@"align" != 0) { |
| 16527 | | decl.align_val = field.abi_align; |
| 16528 | | } |
| 16529 | 16558 | return sema.analyzeDeclRef(decl); |
| 16530 | 16559 | } |
| 16531 | 16560 | |
| ... | ... | @@ -19114,6 +19143,7 @@ fn refValue(sema: *Sema, block: *Block, src: LazySrcLoc, ty: Type, val: Value) ! |
| 19114 | 19143 | const decl = try anon_decl.finish( |
| 19115 | 19144 | try ty.copy(anon_decl.arena()), |
| 19116 | 19145 | try val.copy(anon_decl.arena()), |
| 19146 | 0, // default alignment |
| 19117 | 19147 | ); |
| 19118 | 19148 | try sema.mod.declareDeclDependency(sema.owner_decl, decl); |
| 19119 | 19149 | return try Value.Tag.decl_ref.create(sema.arena, decl); |
| ... | ... | @@ -19170,6 +19200,7 @@ fn analyzeRef( |
| 19170 | 19200 | return sema.analyzeDeclRef(try anon_decl.finish( |
| 19171 | 19201 | try operand_ty.copy(anon_decl.arena()), |
| 19172 | 19202 | try val.copy(anon_decl.arena()), |
| 19203 | 0, // default alignment |
| 19173 | 19204 | )); |
| 19174 | 19205 | } |
| 19175 | 19206 | |
| ... | ... | @@ -21614,6 +21645,7 @@ fn analyzeComptimeAlloc( |
| 21614 | 21645 | // sub-fields. So we need to initialize with undef to allow the mechanism to expand |
| 21615 | 21646 | // into fields/elements and have those overridden with stored values. |
| 21616 | 21647 | Value.undef, |
| 21648 | alignment, |
| 21617 | 21649 | ); |
| 21618 | 21650 | decl.align_val = align_val; |
| 21619 | 21651 | |