authorgravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2024-06-22 00:29:38+01:00
committergravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2024-06-26 05:28:03+01:00
log5b523d04690d8a01cb5d97e4f5a35443cb0cbde8
treea7c8c3d8266f103e64b1876a0dca90a5a82b663f
parent3e9ab6aa7b2d90c25cb906d425a148abf9da3dcb
signaturelock-open Commit is signed but in an unrecognized format.

Zir: make `src_line` absolute for `declaration` instructions

We need special logic for updating line numbers anyway, so it's fine to just use absolute numbers here. This eliminates a field from `Decl`.

10 files changed, 93 insertions(+), 70 deletions(-)

lib/std/zig/AstGen.zig+7-7
...@@ -4368,7 +4368,7 @@ fn fnDecl(...@@ -4368,7 +4368,7 @@ fn fnDecl(
4368 decl_inst,4368 decl_inst,
4369 std.zig.hashSrc(tree.getNodeSource(decl_node)),4369 std.zig.hashSrc(tree.getNodeSource(decl_node)),
4370 .{ .named = fn_name_token },4370 .{ .named = fn_name_token },
4371 decl_gz.decl_line - gz.decl_line,4371 decl_gz.decl_line,
4372 is_pub,4372 is_pub,
4373 is_export,4373 is_export,
4374 doc_comment_index,4374 doc_comment_index,
...@@ -4529,7 +4529,7 @@ fn globalVarDecl(...@@ -4529,7 +4529,7 @@ fn globalVarDecl(
4529 decl_inst,4529 decl_inst,
4530 std.zig.hashSrc(tree.getNodeSource(node)),4530 std.zig.hashSrc(tree.getNodeSource(node)),
4531 .{ .named = name_token },4531 .{ .named = name_token },
4532 block_scope.decl_line - gz.decl_line,4532 block_scope.decl_line,
4533 is_pub,4533 is_pub,
4534 is_export,4534 is_export,
4535 doc_comment_index,4535 doc_comment_index,
...@@ -4579,7 +4579,7 @@ fn comptimeDecl(...@@ -4579,7 +4579,7 @@ fn comptimeDecl(
4579 decl_inst,4579 decl_inst,
4580 std.zig.hashSrc(tree.getNodeSource(node)),4580 std.zig.hashSrc(tree.getNodeSource(node)),
4581 .@"comptime",4581 .@"comptime",
4582 decl_block.decl_line - gz.decl_line,4582 decl_block.decl_line,
4583 false,4583 false,
4584 false,4584 false,
4585 .empty,4585 .empty,
...@@ -4629,7 +4629,7 @@ fn usingnamespaceDecl(...@@ -4629,7 +4629,7 @@ fn usingnamespaceDecl(
4629 decl_inst,4629 decl_inst,
4630 std.zig.hashSrc(tree.getNodeSource(node)),4630 std.zig.hashSrc(tree.getNodeSource(node)),
4631 .@"usingnamespace",4631 .@"usingnamespace",
4632 decl_block.decl_line - gz.decl_line,4632 decl_block.decl_line,
4633 is_pub,4633 is_pub,
4634 false,4634 false,
4635 .empty,4635 .empty,
...@@ -4818,7 +4818,7 @@ fn testDecl(...@@ -4818,7 +4818,7 @@ fn testDecl(
4818 decl_inst,4818 decl_inst,
4819 std.zig.hashSrc(tree.getNodeSource(node)),4819 std.zig.hashSrc(tree.getNodeSource(node)),
4820 test_name,4820 test_name,
4821 decl_block.decl_line - gz.decl_line,4821 decl_block.decl_line,
4822 false,4822 false,
4823 false,4823 false,
4824 .empty,4824 .empty,
...@@ -13861,7 +13861,7 @@ fn setDeclaration(...@@ -13861,7 +13861,7 @@ fn setDeclaration(
13861 decl_inst: Zir.Inst.Index,13861 decl_inst: Zir.Inst.Index,
13862 src_hash: std.zig.SrcHash,13862 src_hash: std.zig.SrcHash,
13863 name: DeclarationName,13863 name: DeclarationName,
13864 line_offset: u32,13864 src_line: u32,
13865 is_pub: bool,13865 is_pub: bool,
13866 is_export: bool,13866 is_export: bool,
13867 doc_comment: Zir.NullTerminatedString,13867 doc_comment: Zir.NullTerminatedString,
...@@ -13913,7 +13913,7 @@ fn setDeclaration(...@@ -13913,7 +13913,7 @@ fn setDeclaration(
13913 .@"comptime" => .@"comptime",13913 .@"comptime" => .@"comptime",
13914 .@"usingnamespace" => .@"usingnamespace",13914 .@"usingnamespace" => .@"usingnamespace",
13915 },13915 },
13916 .line_offset = line_offset,13916 .src_line = src_line,
13917 .flags = .{13917 .flags = .{
13918 .value_body_len = @intCast(value_len),13918 .value_body_len = @intCast(value_len),
13919 .is_pub = is_pub,13919 .is_pub = is_pub,
lib/std/zig/Zir.zig+1-3
...@@ -2598,9 +2598,7 @@ pub const Inst = struct {...@@ -2598,9 +2598,7 @@ pub const Inst = struct {
2598 src_hash_3: u32,2598 src_hash_3: u32,
2599 /// The name of this `Decl`. Also indicates whether it is a test, comptime block, etc.2599 /// The name of this `Decl`. Also indicates whether it is a test, comptime block, etc.
2600 name: Name,2600 name: Name,
2601 /// This Decl's line number relative to that of its parent.2601 src_line: u32,
2602 /// TODO: column must be encoded similarly to respect non-formatted code!
2603 line_offset: u32,
2604 flags: Flags,2602 flags: Flags,
26052603
2606 pub const Flags = packed struct(u32) {2604 pub const Flags = packed struct(u32) {
src/InternPool.zig-1
...@@ -6958,7 +6958,6 @@ fn finishFuncInstance(...@@ -6958,7 +6958,6 @@ fn finishFuncInstance(
6958 const decl_index = try ip.createDecl(gpa, .{6958 const decl_index = try ip.createDecl(gpa, .{
6959 .name = undefined,6959 .name = undefined,
6960 .src_namespace = fn_owner_decl.src_namespace,6960 .src_namespace = fn_owner_decl.src_namespace,
6961 .src_line = fn_owner_decl.src_line,
6962 .has_tv = true,6961 .has_tv = true,
6963 .owns_tv = true,6962 .owns_tv = true,
6964 .val = @import("Value.zig").fromInterned(func_index),6963 .val = @import("Value.zig").fromInterned(func_index),
src/Sema.zig+10-27
...@@ -2827,7 +2827,6 @@ fn zirStructDecl(...@@ -2827,7 +2827,6 @@ fn zirStructDecl(
2827 small.name_strategy,2827 small.name_strategy,
2828 "struct",2828 "struct",
2829 inst,2829 inst,
2830 extra.data.src_line,
2831 );2830 );
2832 mod.declPtr(new_decl_index).owns_tv = true;2831 mod.declPtr(new_decl_index).owns_tv = true;
2833 errdefer mod.abortAnonDecl(new_decl_index);2832 errdefer mod.abortAnonDecl(new_decl_index);
...@@ -2864,7 +2863,6 @@ fn createAnonymousDeclTypeNamed(...@@ -2864,7 +2863,6 @@ fn createAnonymousDeclTypeNamed(
2864 name_strategy: Zir.Inst.NameStrategy,2863 name_strategy: Zir.Inst.NameStrategy,
2865 anon_prefix: []const u8,2864 anon_prefix: []const u8,
2866 inst: ?Zir.Inst.Index,2865 inst: ?Zir.Inst.Index,
2867 src_line: u32,
2868) !InternPool.DeclIndex {2866) !InternPool.DeclIndex {
2869 const zcu = sema.mod;2867 const zcu = sema.mod;
2870 const ip = &zcu.intern_pool;2868 const ip = &zcu.intern_pool;
...@@ -2876,7 +2874,7 @@ fn createAnonymousDeclTypeNamed(...@@ -2876,7 +2874,7 @@ fn createAnonymousDeclTypeNamed(
2876 switch (name_strategy) {2874 switch (name_strategy) {
2877 .anon => {}, // handled after switch2875 .anon => {}, // handled after switch
2878 .parent => {2876 .parent => {
2879 try zcu.initNewAnonDecl(new_decl_index, src_line, val, block.type_name_ctx);2877 try zcu.initNewAnonDecl(new_decl_index, val, block.type_name_ctx);
2880 return new_decl_index;2878 return new_decl_index;
2881 },2879 },
2882 .func => func_strat: {2880 .func => func_strat: {
...@@ -2921,7 +2919,7 @@ fn createAnonymousDeclTypeNamed(...@@ -2921,7 +2919,7 @@ fn createAnonymousDeclTypeNamed(
29212919
2922 try writer.writeByte(')');2920 try writer.writeByte(')');
2923 const name = try ip.getOrPutString(gpa, buf.items, .no_embedded_nulls);2921 const name = try ip.getOrPutString(gpa, buf.items, .no_embedded_nulls);
2924 try zcu.initNewAnonDecl(new_decl_index, src_line, val, name);2922 try zcu.initNewAnonDecl(new_decl_index, val, name);
2925 return new_decl_index;2923 return new_decl_index;
2926 },2924 },
2927 .dbg_var => {2925 .dbg_var => {
...@@ -2935,7 +2933,7 @@ fn createAnonymousDeclTypeNamed(...@@ -2935,7 +2933,7 @@ fn createAnonymousDeclTypeNamed(
2935 const name = try ip.getOrPutStringFmt(gpa, "{}.{s}", .{2933 const name = try ip.getOrPutStringFmt(gpa, "{}.{s}", .{
2936 block.type_name_ctx.fmt(ip), zir_data[i].str_op.getStr(sema.code),2934 block.type_name_ctx.fmt(ip), zir_data[i].str_op.getStr(sema.code),
2937 }, .no_embedded_nulls);2935 }, .no_embedded_nulls);
2938 try zcu.initNewAnonDecl(new_decl_index, src_line, val, name);2936 try zcu.initNewAnonDecl(new_decl_index, val, name);
2939 return new_decl_index;2937 return new_decl_index;
2940 },2938 },
2941 else => {},2939 else => {},
...@@ -2956,7 +2954,7 @@ fn createAnonymousDeclTypeNamed(...@@ -2956,7 +2954,7 @@ fn createAnonymousDeclTypeNamed(
2956 const name = ip.getOrPutStringFmt(gpa, "{}__{s}_{d}", .{2954 const name = ip.getOrPutStringFmt(gpa, "{}__{s}_{d}", .{
2957 block.type_name_ctx.fmt(ip), anon_prefix, @intFromEnum(new_decl_index),2955 block.type_name_ctx.fmt(ip), anon_prefix, @intFromEnum(new_decl_index),
2958 }, .no_embedded_nulls) catch unreachable;2956 }, .no_embedded_nulls) catch unreachable;
2959 try zcu.initNewAnonDecl(new_decl_index, src_line, val, name);2957 try zcu.initNewAnonDecl(new_decl_index, val, name);
2960 return new_decl_index;2958 return new_decl_index;
2961}2959}
29622960
...@@ -3062,7 +3060,6 @@ fn zirEnumDecl(...@@ -3062,7 +3060,6 @@ fn zirEnumDecl(
3062 small.name_strategy,3060 small.name_strategy,
3063 "enum",3061 "enum",
3064 inst,3062 inst,
3065 extra.data.src_line,
3066 );3063 );
3067 const new_decl = mod.declPtr(new_decl_index);3064 const new_decl = mod.declPtr(new_decl_index);
3068 new_decl.owns_tv = true;3065 new_decl.owns_tv = true;
...@@ -3330,7 +3327,6 @@ fn zirUnionDecl(...@@ -3330,7 +3327,6 @@ fn zirUnionDecl(
3330 small.name_strategy,3327 small.name_strategy,
3331 "union",3328 "union",
3332 inst,3329 inst,
3333 extra.data.src_line,
3334 );3330 );
3335 mod.declPtr(new_decl_index).owns_tv = true;3331 mod.declPtr(new_decl_index).owns_tv = true;
3336 errdefer mod.abortAnonDecl(new_decl_index);3332 errdefer mod.abortAnonDecl(new_decl_index);
...@@ -3419,7 +3415,6 @@ fn zirOpaqueDecl(...@@ -3419,7 +3415,6 @@ fn zirOpaqueDecl(
3419 small.name_strategy,3415 small.name_strategy,
3420 "opaque",3416 "opaque",
3421 inst,3417 inst,
3422 extra.data.src_line,
3423 );3418 );
3424 mod.declPtr(new_decl_index).owns_tv = true;3419 mod.declPtr(new_decl_index).owns_tv = true;
3425 errdefer mod.abortAnonDecl(new_decl_index);3420 errdefer mod.abortAnonDecl(new_decl_index);
...@@ -21546,7 +21541,7 @@ fn zirReify(...@@ -21546,7 +21541,7 @@ fn zirReify(
21546 .needed_comptime_reason = "struct fields must be comptime-known",21541 .needed_comptime_reason = "struct fields must be comptime-known",
21547 });21542 });
2154821543
21549 return try sema.reifyStruct(block, inst, src, layout, backing_integer_val, fields_arr, name_strategy, is_tuple_val.toBool(), extra.src_line);21544 return try sema.reifyStruct(block, inst, src, layout, backing_integer_val, fields_arr, name_strategy, is_tuple_val.toBool());
21550 },21545 },
21551 .Enum => {21546 .Enum => {
21552 const struct_type = ip.loadStructType(ip.typeOf(union_val.val));21547 const struct_type = ip.loadStructType(ip.typeOf(union_val.val));
...@@ -21575,7 +21570,7 @@ fn zirReify(...@@ -21575,7 +21570,7 @@ fn zirReify(
21575 .needed_comptime_reason = "enum fields must be comptime-known",21570 .needed_comptime_reason = "enum fields must be comptime-known",
21576 });21571 });
2157721572
21578 return sema.reifyEnum(block, inst, src, tag_type_val.toType(), is_exhaustive_val.toBool(), fields_arr, name_strategy, extra.src_line);21573 return sema.reifyEnum(block, inst, src, tag_type_val.toType(), is_exhaustive_val.toBool(), fields_arr, name_strategy);
21579 },21574 },
21580 .Opaque => {21575 .Opaque => {
21581 const struct_type = ip.loadStructType(ip.typeOf(union_val.val));21576 const struct_type = ip.loadStructType(ip.typeOf(union_val.val));
...@@ -21606,7 +21601,6 @@ fn zirReify(...@@ -21606,7 +21601,6 @@ fn zirReify(
21606 name_strategy,21601 name_strategy,
21607 "opaque",21602 "opaque",
21608 inst,21603 inst,
21609 extra.src_line,
21610 );21604 );
21611 mod.declPtr(new_decl_index).owns_tv = true;21605 mod.declPtr(new_decl_index).owns_tv = true;
21612 errdefer mod.abortAnonDecl(new_decl_index);21606 errdefer mod.abortAnonDecl(new_decl_index);
...@@ -21643,7 +21637,7 @@ fn zirReify(...@@ -21643,7 +21637,7 @@ fn zirReify(
21643 .needed_comptime_reason = "union fields must be comptime-known",21637 .needed_comptime_reason = "union fields must be comptime-known",
21644 });21638 });
2164521639
21646 return sema.reifyUnion(block, inst, src, layout, tag_type_val, fields_arr, name_strategy, extra.src_line);21640 return sema.reifyUnion(block, inst, src, layout, tag_type_val, fields_arr, name_strategy);
21647 },21641 },
21648 .Fn => {21642 .Fn => {
21649 const struct_type = ip.loadStructType(ip.typeOf(union_val.val));21643 const struct_type = ip.loadStructType(ip.typeOf(union_val.val));
...@@ -21745,7 +21739,6 @@ fn reifyEnum(...@@ -21745,7 +21739,6 @@ fn reifyEnum(
21745 is_exhaustive: bool,21739 is_exhaustive: bool,
21746 fields_val: Value,21740 fields_val: Value,
21747 name_strategy: Zir.Inst.NameStrategy,21741 name_strategy: Zir.Inst.NameStrategy,
21748 src_line: u32,
21749) CompileError!Air.Inst.Ref {21742) CompileError!Air.Inst.Ref {
21750 const mod = sema.mod;21743 const mod = sema.mod;
21751 const gpa = sema.gpa;21744 const gpa = sema.gpa;
...@@ -21807,7 +21800,6 @@ fn reifyEnum(...@@ -21807,7 +21800,6 @@ fn reifyEnum(
21807 name_strategy,21800 name_strategy,
21808 "enum",21801 "enum",
21809 inst,21802 inst,
21810 src_line,
21811 );21803 );
21812 mod.declPtr(new_decl_index).owns_tv = true;21804 mod.declPtr(new_decl_index).owns_tv = true;
21813 errdefer mod.abortAnonDecl(new_decl_index);21805 errdefer mod.abortAnonDecl(new_decl_index);
...@@ -21871,7 +21863,6 @@ fn reifyUnion(...@@ -21871,7 +21863,6 @@ fn reifyUnion(
21871 opt_tag_type_val: Value,21863 opt_tag_type_val: Value,
21872 fields_val: Value,21864 fields_val: Value,
21873 name_strategy: Zir.Inst.NameStrategy,21865 name_strategy: Zir.Inst.NameStrategy,
21874 src_line: u32,
21875) CompileError!Air.Inst.Ref {21866) CompileError!Air.Inst.Ref {
21876 const mod = sema.mod;21867 const mod = sema.mod;
21877 const gpa = sema.gpa;21868 const gpa = sema.gpa;
...@@ -21955,7 +21946,6 @@ fn reifyUnion(...@@ -21955,7 +21946,6 @@ fn reifyUnion(
21955 name_strategy,21946 name_strategy,
21956 "union",21947 "union",
21957 inst,21948 inst,
21958 src_line,
21959 );21949 );
21960 mod.declPtr(new_decl_index).owns_tv = true;21950 mod.declPtr(new_decl_index).owns_tv = true;
21961 errdefer mod.abortAnonDecl(new_decl_index);21951 errdefer mod.abortAnonDecl(new_decl_index);
...@@ -22051,7 +22041,7 @@ fn reifyUnion(...@@ -22051,7 +22041,7 @@ fn reifyUnion(
22051 }22041 }
22052 }22042 }
2205322043
22054 const enum_tag_ty = try sema.generateUnionTagTypeSimple(block, field_names.keys(), mod.declPtr(new_decl_index), src_line);22044 const enum_tag_ty = try sema.generateUnionTagTypeSimple(block, field_names.keys(), mod.declPtr(new_decl_index));
22055 break :tag_ty .{ enum_tag_ty, false };22045 break :tag_ty .{ enum_tag_ty, false };
22056 };22046 };
22057 errdefer if (!has_explicit_tag) ip.remove(enum_tag_ty); // remove generated tag type on error22047 errdefer if (!has_explicit_tag) ip.remove(enum_tag_ty); // remove generated tag type on error
...@@ -22112,7 +22102,6 @@ fn reifyStruct(...@@ -22112,7 +22102,6 @@ fn reifyStruct(
22112 fields_val: Value,22102 fields_val: Value,
22113 name_strategy: Zir.Inst.NameStrategy,22103 name_strategy: Zir.Inst.NameStrategy,
22114 is_tuple: bool,22104 is_tuple: bool,
22115 src_line: u32,
22116) CompileError!Air.Inst.Ref {22105) CompileError!Air.Inst.Ref {
22117 const mod = sema.mod;22106 const mod = sema.mod;
22118 const gpa = sema.gpa;22107 const gpa = sema.gpa;
...@@ -22213,7 +22202,6 @@ fn reifyStruct(...@@ -22213,7 +22202,6 @@ fn reifyStruct(
22213 name_strategy,22202 name_strategy,
22214 "struct",22203 "struct",
22215 inst,22204 inst,
22216 src_line,
22217 );22205 );
22218 mod.declPtr(new_decl_index).owns_tv = true;22206 mod.declPtr(new_decl_index).owns_tv = true;
22219 errdefer mod.abortAnonDecl(new_decl_index);22207 errdefer mod.abortAnonDecl(new_decl_index);
...@@ -26347,7 +26335,6 @@ fn zirBuiltinExtern(...@@ -26347,7 +26335,6 @@ fn zirBuiltinExtern(
26347 const new_decl = mod.declPtr(new_decl_index);26335 const new_decl = mod.declPtr(new_decl_index);
26348 try mod.initNewAnonDecl(26336 try mod.initNewAnonDecl(
26349 new_decl_index,26337 new_decl_index,
26350 sema.owner_decl.src_line,
26351 Value.fromInterned(26338 Value.fromInterned(
26352 if (Type.fromInterned(ptr_info.child).zigTypeTag(mod) == .Fn)26339 if (Type.fromInterned(ptr_info.child).zigTypeTag(mod) == .Fn)
26353 try ip.getExternFunc(sema.gpa, .{26340 try ip.getExternFunc(sema.gpa, .{
...@@ -36745,10 +36732,10 @@ fn semaUnionFields(mod: *Module, arena: Allocator, union_type: InternPool.Loaded...@@ -36745,10 +36732,10 @@ fn semaUnionFields(mod: *Module, arena: Allocator, union_type: InternPool.Loaded
36745 return sema.failWithOwnedErrorMsg(&block_scope, msg);36732 return sema.failWithOwnedErrorMsg(&block_scope, msg);
36746 }36733 }
36747 } else if (enum_field_vals.count() > 0) {36734 } else if (enum_field_vals.count() > 0) {
36748 const enum_ty = try sema.generateUnionTagTypeNumbered(&block_scope, enum_field_names, enum_field_vals.keys(), mod.declPtr(union_type.decl), extra.data.src_line);36735 const enum_ty = try sema.generateUnionTagTypeNumbered(&block_scope, enum_field_names, enum_field_vals.keys(), mod.declPtr(union_type.decl));
36749 union_type.tagTypePtr(ip).* = enum_ty;36736 union_type.tagTypePtr(ip).* = enum_ty;
36750 } else {36737 } else {
36751 const enum_ty = try sema.generateUnionTagTypeSimple(&block_scope, enum_field_names, mod.declPtr(union_type.decl), extra.data.src_line);36738 const enum_ty = try sema.generateUnionTagTypeSimple(&block_scope, enum_field_names, mod.declPtr(union_type.decl));
36752 union_type.tagTypePtr(ip).* = enum_ty;36739 union_type.tagTypePtr(ip).* = enum_ty;
36753 }36740 }
36754}36741}
...@@ -36766,7 +36753,6 @@ fn generateUnionTagTypeNumbered(...@@ -36766,7 +36753,6 @@ fn generateUnionTagTypeNumbered(
36766 enum_field_names: []const InternPool.NullTerminatedString,36753 enum_field_names: []const InternPool.NullTerminatedString,
36767 enum_field_vals: []const InternPool.Index,36754 enum_field_vals: []const InternPool.Index,
36768 union_owner_decl: *Module.Decl,36755 union_owner_decl: *Module.Decl,
36769 src_line: u32,
36770) !InternPool.Index {36756) !InternPool.Index {
36771 const mod = sema.mod;36757 const mod = sema.mod;
36772 const gpa = sema.gpa;36758 const gpa = sema.gpa;
...@@ -36783,7 +36769,6 @@ fn generateUnionTagTypeNumbered(...@@ -36783,7 +36769,6 @@ fn generateUnionTagTypeNumbered(
36783 );36769 );
36784 try mod.initNewAnonDecl(36770 try mod.initNewAnonDecl(
36785 new_decl_index,36771 new_decl_index,
36786 src_line,
36787 Value.@"unreachable",36772 Value.@"unreachable",
36788 name,36773 name,
36789 );36774 );
...@@ -36816,7 +36801,6 @@ fn generateUnionTagTypeSimple(...@@ -36816,7 +36801,6 @@ fn generateUnionTagTypeSimple(
36816 block: *Block,36801 block: *Block,
36817 enum_field_names: []const InternPool.NullTerminatedString,36802 enum_field_names: []const InternPool.NullTerminatedString,
36818 union_owner_decl: *Module.Decl,36803 union_owner_decl: *Module.Decl,
36819 src_line: u32,
36820) !InternPool.Index {36804) !InternPool.Index {
36821 const mod = sema.mod;36805 const mod = sema.mod;
36822 const ip = &mod.intern_pool;36806 const ip = &mod.intern_pool;
...@@ -36834,7 +36818,6 @@ fn generateUnionTagTypeSimple(...@@ -36834,7 +36818,6 @@ fn generateUnionTagTypeSimple(
36834 );36818 );
36835 try mod.initNewAnonDecl(36819 try mod.initNewAnonDecl(
36836 new_decl_index,36820 new_decl_index,
36837 src_line,
36838 Value.@"unreachable",36821 Value.@"unreachable",
36839 name,36822 name,
36840 );36823 );
src/Zcu.zig+27-12
...@@ -347,10 +347,6 @@ pub const Decl = struct {...@@ -347,10 +347,6 @@ pub const Decl = struct {
347 /// there is no parent.347 /// there is no parent.
348 src_namespace: Namespace.Index,348 src_namespace: Namespace.Index,
349349
350 /// Line number corresponding to `src_node`. Stored separately so that source files
351 /// do not need to be loaded into memory in order to compute debug line numbers.
352 /// This value is absolute.
353 src_line: u32,
354 /// Index of the ZIR `declaration` instruction from which this `Decl` was created.350 /// Index of the ZIR `declaration` instruction from which this `Decl` was created.
355 /// For the root `Decl` of a `File` and legacy anonymous decls, this is `.none`.351 /// For the root `Decl` of a `File` and legacy anonymous decls, this is `.none`.
356 zir_decl_index: InternPool.TrackedInst.Index.Optional,352 zir_decl_index: InternPool.TrackedInst.Index.Optional,
...@@ -564,6 +560,33 @@ pub const Decl = struct {...@@ -564,6 +560,33 @@ pub const Decl = struct {
564 .offset = LazySrcLoc.Offset.nodeOffset(0),560 .offset = LazySrcLoc.Offset.nodeOffset(0),
565 };561 };
566 }562 }
563
564 pub fn navSrcLine(decl: Decl, zcu: *Zcu) u32 {
565 const tracked = decl.zir_decl_index.unwrap() orelse inst: {
566 // generic instantiation
567 assert(decl.has_tv);
568 assert(decl.owns_tv);
569 const generic_owner_func = switch (zcu.intern_pool.indexToKey(decl.val.toIntern())) {
570 .func => |func| func.generic_owner,
571 else => return 0, // TODO: this is probably a `variable` or something; figure this out when we finish sorting out `Decl`.
572 };
573 const generic_owner_decl = zcu.declPtr(zcu.funcInfo(generic_owner_func).owner_decl);
574 break :inst generic_owner_decl.zir_decl_index.unwrap().?;
575 };
576 const info = tracked.resolveFull(&zcu.intern_pool);
577 const file = zcu.import_table.values()[zcu.path_digest_map.getIndex(info.path_digest).?];
578 assert(file.zir_loaded);
579 const zir = file.zir;
580 const inst = zir.instructions.get(@intFromEnum(info.inst));
581 assert(inst.tag == .declaration);
582 return zir.extraData(Zir.Inst.Declaration, inst.data.declaration.payload_index).data.src_line;
583 }
584
585 pub fn typeSrcLine(decl: Decl, zcu: *Zcu) u32 {
586 assert(decl.has_tv);
587 assert(decl.owns_tv);
588 return decl.val.toType().typeDeclSrcLine(zcu).?;
589 }
567};590};
568591
569/// This state is attached to every Decl when Module emit_h is non-null.592/// This state is attached to every Decl when Module emit_h is non-null.
...@@ -3944,7 +3967,6 @@ fn semaFile(mod: *Module, file: *File) SemaError!void {...@@ -3944,7 +3967,6 @@ fn semaFile(mod: *Module, file: *File) SemaError!void {
39443967
3945 new_decl.name = try file.fullyQualifiedName(mod);3968 new_decl.name = try file.fullyQualifiedName(mod);
3946 new_decl.name_fully_qualified = true;3969 new_decl.name_fully_qualified = true;
3947 new_decl.src_line = 0;
3948 new_decl.is_pub = true;3970 new_decl.is_pub = true;
3949 new_decl.is_exported = false;3971 new_decl.is_exported = false;
3950 new_decl.alignment = .none;3972 new_decl.alignment = .none;
...@@ -4762,8 +4784,6 @@ fn scanDecl(iter: *ScanDeclIter, decl_inst: Zir.Inst.Index) Allocator.Error!void...@@ -4762,8 +4784,6 @@ fn scanDecl(iter: *ScanDeclIter, decl_inst: Zir.Inst.Index) Allocator.Error!void
4762 const extra = zir.extraData(Zir.Inst.Declaration, inst_data.payload_index);4784 const extra = zir.extraData(Zir.Inst.Declaration, inst_data.payload_index);
4763 const declaration = extra.data;4785 const declaration = extra.data;
47644786
4765 const line = iter.parent_decl.src_line + declaration.line_offset;
4766
4767 // Every Decl needs a name.4787 // Every Decl needs a name.
4768 const decl_name: InternPool.NullTerminatedString, const kind: Decl.Kind, const is_named_test: bool = switch (declaration.name) {4788 const decl_name: InternPool.NullTerminatedString, const kind: Decl.Kind, const is_named_test: bool = switch (declaration.name) {
4769 .@"comptime" => info: {4789 .@"comptime" => info: {
...@@ -4850,7 +4870,6 @@ fn scanDecl(iter: *ScanDeclIter, decl_inst: Zir.Inst.Index) Allocator.Error!void...@@ -4850,7 +4870,6 @@ fn scanDecl(iter: *ScanDeclIter, decl_inst: Zir.Inst.Index) Allocator.Error!void
4850 const was_exported = decl.is_exported;4870 const was_exported = decl.is_exported;
4851 assert(decl.kind == kind); // ZIR tracking should preserve this4871 assert(decl.kind == kind); // ZIR tracking should preserve this
4852 decl.name = decl_name;4872 decl.name = decl_name;
4853 decl.src_line = line;
4854 decl.is_pub = declaration.flags.is_pub;4873 decl.is_pub = declaration.flags.is_pub;
4855 decl.is_exported = declaration.flags.is_export;4874 decl.is_exported = declaration.flags.is_export;
4856 break :decl_index .{ was_exported, decl_index };4875 break :decl_index .{ was_exported, decl_index };
...@@ -4860,7 +4879,6 @@ fn scanDecl(iter: *ScanDeclIter, decl_inst: Zir.Inst.Index) Allocator.Error!void...@@ -4860,7 +4879,6 @@ fn scanDecl(iter: *ScanDeclIter, decl_inst: Zir.Inst.Index) Allocator.Error!void
4860 const new_decl = zcu.declPtr(new_decl_index);4879 const new_decl = zcu.declPtr(new_decl_index);
4861 new_decl.kind = kind;4880 new_decl.kind = kind;
4862 new_decl.name = decl_name;4881 new_decl.name = decl_name;
4863 new_decl.src_line = line;
4864 new_decl.is_pub = declaration.flags.is_pub;4882 new_decl.is_pub = declaration.flags.is_pub;
4865 new_decl.is_exported = declaration.flags.is_export;4883 new_decl.is_exported = declaration.flags.is_export;
4866 new_decl.zir_decl_index = tracked_inst.toOptional();4884 new_decl.zir_decl_index = tracked_inst.toOptional();
...@@ -5263,7 +5281,6 @@ pub fn allocateNewDecl(zcu: *Zcu, namespace: Namespace.Index) !Decl.Index {...@@ -5263,7 +5281,6 @@ pub fn allocateNewDecl(zcu: *Zcu, namespace: Namespace.Index) !Decl.Index {
5263 const decl_index = try zcu.intern_pool.createDecl(gpa, .{5281 const decl_index = try zcu.intern_pool.createDecl(gpa, .{
5264 .name = undefined,5282 .name = undefined,
5265 .src_namespace = namespace,5283 .src_namespace = namespace,
5266 .src_line = undefined,
5267 .has_tv = false,5284 .has_tv = false,
5268 .owns_tv = false,5285 .owns_tv = false,
5269 .val = undefined,5286 .val = undefined,
...@@ -5311,14 +5328,12 @@ pub fn errorSetBits(mod: *Module) u16 {...@@ -5311,14 +5328,12 @@ pub fn errorSetBits(mod: *Module) u16 {
5311pub fn initNewAnonDecl(5328pub fn initNewAnonDecl(
5312 mod: *Module,5329 mod: *Module,
5313 new_decl_index: Decl.Index,5330 new_decl_index: Decl.Index,
5314 src_line: u32,
5315 val: Value,5331 val: Value,
5316 name: InternPool.NullTerminatedString,5332 name: InternPool.NullTerminatedString,
5317) Allocator.Error!void {5333) Allocator.Error!void {
5318 const new_decl = mod.declPtr(new_decl_index);5334 const new_decl = mod.declPtr(new_decl_index);
53195335
5320 new_decl.name = name;5336 new_decl.name = name;
5321 new_decl.src_line = src_line;
5322 new_decl.val = val;5337 new_decl.val = val;
5323 new_decl.alignment = .none;5338 new_decl.alignment = .none;
5324 new_decl.@"linksection" = .none;5339 new_decl.@"linksection" = .none;
src/codegen/llvm.zig+9-9
...@@ -1697,7 +1697,7 @@ pub const Object = struct {...@@ -1697,7 +1697,7 @@ pub const Object = struct {
1697 const file, const subprogram = if (!wip.strip) debug_info: {1697 const file, const subprogram = if (!wip.strip) debug_info: {
1698 const file = try o.getDebugFile(namespace.file_scope);1698 const file = try o.getDebugFile(namespace.file_scope);
16991699
1700 const line_number = decl.src_line + 1;1700 const line_number = decl.navSrcLine(zcu) + 1;
1701 const is_internal_linkage = decl.val.getExternFunc(zcu) == null and1701 const is_internal_linkage = decl.val.getExternFunc(zcu) == null and
1702 !zcu.decl_exports.contains(decl_index);1702 !zcu.decl_exports.contains(decl_index);
1703 const debug_decl_type = try o.lowerDebugType(decl.typeOf(zcu));1703 const debug_decl_type = try o.lowerDebugType(decl.typeOf(zcu));
...@@ -1741,7 +1741,7 @@ pub const Object = struct {...@@ -1741,7 +1741,7 @@ pub const Object = struct {
1741 .sync_scope = if (owner_mod.single_threaded) .singlethread else .system,1741 .sync_scope = if (owner_mod.single_threaded) .singlethread else .system,
1742 .file = file,1742 .file = file,
1743 .scope = subprogram,1743 .scope = subprogram,
1744 .base_line = dg.decl.src_line,1744 .base_line = dg.decl.navSrcLine(zcu),
1745 .prev_dbg_line = 0,1745 .prev_dbg_line = 0,
1746 .prev_dbg_column = 0,1746 .prev_dbg_column = 0,
1747 .err_ret_trace = err_ret_trace,1747 .err_ret_trace = err_ret_trace,
...@@ -2067,7 +2067,7 @@ pub const Object = struct {...@@ -2067,7 +2067,7 @@ pub const Object = struct {
2067 try o.builder.metadataString(name),2067 try o.builder.metadataString(name),
2068 file,2068 file,
2069 scope,2069 scope,
2070 owner_decl.src_line + 1, // Line2070 owner_decl.typeSrcLine(mod) + 1, // Line
2071 try o.lowerDebugType(int_ty),2071 try o.lowerDebugType(int_ty),
2072 ty.abiSize(mod) * 8,2072 ty.abiSize(mod) * 8,
2073 (ty.abiAlignment(mod).toByteUnits() orelse 0) * 8,2073 (ty.abiAlignment(mod).toByteUnits() orelse 0) * 8,
...@@ -2237,7 +2237,7 @@ pub const Object = struct {...@@ -2237,7 +2237,7 @@ pub const Object = struct {
2237 try o.builder.metadataString(name),2237 try o.builder.metadataString(name),
2238 try o.getDebugFile(mod.namespacePtr(owner_decl.src_namespace).file_scope),2238 try o.getDebugFile(mod.namespacePtr(owner_decl.src_namespace).file_scope),
2239 try o.namespaceToDebugScope(owner_decl.src_namespace),2239 try o.namespaceToDebugScope(owner_decl.src_namespace),
2240 owner_decl.src_line + 1, // Line2240 owner_decl.typeSrcLine(mod) + 1, // Line
2241 .none, // Underlying type2241 .none, // Underlying type
2242 0, // Size2242 0, // Size
2243 0, // Align2243 0, // Align
...@@ -2867,7 +2867,7 @@ pub const Object = struct {...@@ -2867,7 +2867,7 @@ pub const Object = struct {
2867 try o.builder.metadataString(decl.name.toSlice(&mod.intern_pool)), // TODO use fully qualified name2867 try o.builder.metadataString(decl.name.toSlice(&mod.intern_pool)), // TODO use fully qualified name
2868 try o.getDebugFile(mod.namespacePtr(decl.src_namespace).file_scope),2868 try o.getDebugFile(mod.namespacePtr(decl.src_namespace).file_scope),
2869 try o.namespaceToDebugScope(decl.src_namespace),2869 try o.namespaceToDebugScope(decl.src_namespace),
2870 decl.src_line + 1,2870 decl.typeSrcLine(mod) + 1,
2871 .none,2871 .none,
2872 0,2872 0,
2873 0,2873 0,
...@@ -4762,7 +4762,7 @@ pub const DeclGen = struct {...@@ -4762,7 +4762,7 @@ pub const DeclGen = struct {
4762 else => try o.lowerValue(init_val),4762 else => try o.lowerValue(init_val),
4763 }, &o.builder);4763 }, &o.builder);
47644764
4765 const line_number = decl.src_line + 1;4765 const line_number = decl.navSrcLine(zcu) + 1;
4766 const is_internal_linkage = !o.module.decl_exports.contains(decl_index);4766 const is_internal_linkage = !o.module.decl_exports.contains(decl_index);
47674767
4768 const namespace = zcu.namespacePtr(decl.src_namespace);4768 const namespace = zcu.namespacePtr(decl.src_namespace);
...@@ -5188,7 +5188,7 @@ pub const FuncGen = struct {...@@ -5188,7 +5188,7 @@ pub const FuncGen = struct {
51885188
5189 self.file = try o.getDebugFile(namespace.file_scope);5189 self.file = try o.getDebugFile(namespace.file_scope);
51905190
5191 const line_number = decl.src_line + 1;5191 const line_number = decl.navSrcLine(zcu) + 1;
5192 self.inlined = self.wip.debug_location;5192 self.inlined = self.wip.debug_location;
51935193
5194 const fqn = try decl.fullyQualifiedName(zcu);5194 const fqn = try decl.fullyQualifiedName(zcu);
...@@ -5217,7 +5217,7 @@ pub const FuncGen = struct {...@@ -5217,7 +5217,7 @@ pub const FuncGen = struct {
5217 o.debug_compile_unit,5217 o.debug_compile_unit,
5218 );5218 );
52195219
5220 self.base_line = decl.src_line;5220 self.base_line = decl.navSrcLine(zcu);
5221 const inlined_at_location = try self.wip.debug_location.toMetadata(&o.builder);5221 const inlined_at_location = try self.wip.debug_location.toMetadata(&o.builder);
5222 self.wip.debug_location = .{5222 self.wip.debug_location = .{
5223 .location = .{5223 .location = .{
...@@ -8857,7 +8857,7 @@ pub const FuncGen = struct {...@@ -8857,7 +8857,7 @@ pub const FuncGen = struct {
8857 const src_index = self.air.instructions.items(.data)[@intFromEnum(inst)].arg.src_index;8857 const src_index = self.air.instructions.items(.data)[@intFromEnum(inst)].arg.src_index;
8858 const func_index = self.dg.decl.getOwnedFunctionIndex();8858 const func_index = self.dg.decl.getOwnedFunctionIndex();
8859 const func = mod.funcInfo(func_index);8859 const func = mod.funcInfo(func_index);
8860 const lbrace_line = mod.declPtr(func.owner_decl).src_line + func.lbrace_line + 1;8860 const lbrace_line = mod.declPtr(func.owner_decl).navSrcLine(mod) + func.lbrace_line + 1;
8861 const lbrace_col = func.lbrace_column + 1;8861 const lbrace_col = func.lbrace_column + 1;
88628862
8863 const debug_parameter = try o.builder.debugParameter(8863 const debug_parameter = try o.builder.debugParameter(
src/codegen/spirv.zig+2-2
...@@ -212,7 +212,7 @@ pub const Object = struct {...@@ -212,7 +212,7 @@ pub const Object = struct {
212 false => .{ .unstructured = .{} },212 false => .{ .unstructured = .{} },
213 },213 },
214 .current_block_label = undefined,214 .current_block_label = undefined,
215 .base_line = decl.src_line,215 .base_line = decl.navSrcLine(mod),
216 };216 };
217 defer decl_gen.deinit();217 defer decl_gen.deinit();
218218
...@@ -6345,7 +6345,7 @@ const DeclGen = struct {...@@ -6345,7 +6345,7 @@ const DeclGen = struct {
6345 const decl = mod.funcOwnerDeclPtr(extra.data.func);6345 const decl = mod.funcOwnerDeclPtr(extra.data.func);
6346 const old_base_line = self.base_line;6346 const old_base_line = self.base_line;
6347 defer self.base_line = old_base_line;6347 defer self.base_line = old_base_line;
6348 self.base_line = decl.src_line;6348 self.base_line = decl.navSrcLine(mod);
6349 return self.lowerBlock(inst, @ptrCast(self.air.extra[extra.end..][0..extra.data.body_len]));6349 return self.lowerBlock(inst, @ptrCast(self.air.extra[extra.end..][0..extra.data.body_len]));
6350 }6350 }
63516351
src/link/Dwarf.zig+6-6
...@@ -948,8 +948,8 @@ pub const DeclState = struct {...@@ -948,8 +948,8 @@ pub const DeclState = struct {
948 leb128.writeUnsignedFixed(4, self.dbg_line.addManyAsArrayAssumeCapacity(4), new_file);948 leb128.writeUnsignedFixed(4, self.dbg_line.addManyAsArrayAssumeCapacity(4), new_file);
949 }949 }
950950
951 const old_src_line: i33 = self.mod.declPtr(old_func_info.owner_decl).src_line;951 const old_src_line: i33 = self.mod.declPtr(old_func_info.owner_decl).navSrcLine(self.mod);
952 const new_src_line: i33 = self.mod.declPtr(new_func_info.owner_decl).src_line;952 const new_src_line: i33 = self.mod.declPtr(new_func_info.owner_decl).navSrcLine(self.mod);
953 if (new_src_line != old_src_line) {953 if (new_src_line != old_src_line) {
954 self.dbg_line.appendAssumeCapacity(DW.LNS.advance_line);954 self.dbg_line.appendAssumeCapacity(DW.LNS.advance_line);
955 leb128.writeSignedFixed(5, self.dbg_line.addManyAsArrayAssumeCapacity(5), new_src_line - old_src_line);955 leb128.writeSignedFixed(5, self.dbg_line.addManyAsArrayAssumeCapacity(5), new_src_line - old_src_line);
...@@ -1116,11 +1116,11 @@ pub fn initDeclState(self: *Dwarf, mod: *Module, decl_index: InternPool.DeclInde...@@ -1116,11 +1116,11 @@ pub fn initDeclState(self: *Dwarf, mod: *Module, decl_index: InternPool.DeclInde
1116 decl_state.dbg_line_func = decl.val.toIntern();1116 decl_state.dbg_line_func = decl.val.toIntern();
1117 const func = decl.val.getFunction(mod).?;1117 const func = decl.val.getFunction(mod).?;
1118 log.debug("decl.src_line={d}, func.lbrace_line={d}, func.rbrace_line={d}", .{1118 log.debug("decl.src_line={d}, func.lbrace_line={d}, func.rbrace_line={d}", .{
1119 decl.src_line,1119 decl.navSrcLine(mod),
1120 func.lbrace_line,1120 func.lbrace_line,
1121 func.rbrace_line,1121 func.rbrace_line,
1122 });1122 });
1123 const line: u28 = @intCast(decl.src_line + func.lbrace_line);1123 const line: u28 = @intCast(decl.navSrcLine(mod) + func.lbrace_line);
11241124
1125 dbg_line_buffer.appendSliceAssumeCapacity(&.{1125 dbg_line_buffer.appendSliceAssumeCapacity(&.{
1126 DW.LNS.extended_op,1126 DW.LNS.extended_op,
...@@ -1702,11 +1702,11 @@ pub fn updateDeclLineNumber(self: *Dwarf, mod: *Module, decl_index: InternPool.D...@@ -1702,11 +1702,11 @@ pub fn updateDeclLineNumber(self: *Dwarf, mod: *Module, decl_index: InternPool.D
1702 const decl = mod.declPtr(decl_index);1702 const decl = mod.declPtr(decl_index);
1703 const func = decl.val.getFunction(mod).?;1703 const func = decl.val.getFunction(mod).?;
1704 log.debug("decl.src_line={d}, func.lbrace_line={d}, func.rbrace_line={d}", .{1704 log.debug("decl.src_line={d}, func.lbrace_line={d}, func.rbrace_line={d}", .{
1705 decl.src_line,1705 decl.navSrcLine(mod),
1706 func.lbrace_line,1706 func.lbrace_line,
1707 func.rbrace_line,1707 func.rbrace_line,
1708 });1708 });
1709 const line: u28 = @intCast(decl.src_line + func.lbrace_line);1709 const line: u28 = @intCast(decl.navSrcLine(mod) + func.lbrace_line);
1710 var data: [4]u8 = undefined;1710 var data: [4]u8 = undefined;
1711 leb128.writeUnsignedFixed(4, &data, line);1711 leb128.writeUnsignedFixed(4, &data, line);
17121712
src/print_zir.zig+2-2
...@@ -583,7 +583,7 @@ const Writer = struct {...@@ -583,7 +583,7 @@ const Writer = struct {
583583
584 .reify => {584 .reify => {
585 const inst_data = self.code.extraData(Zir.Inst.Reify, extended.operand).data;585 const inst_data = self.code.extraData(Zir.Inst.Reify, extended.operand).data;
586 try stream.print("{d}, ", .{inst_data.src_line});586 try stream.print("line({d}), ", .{inst_data.src_line});
587 try self.writeInstRef(stream, inst_data.operand);587 try self.writeInstRef(stream, inst_data.operand);
588 try stream.writeAll(")) ");588 try stream.writeAll(")) ");
589 const prev_parent_decl_node = self.parent_decl_node;589 const prev_parent_decl_node = self.parent_decl_node;
...@@ -2749,7 +2749,7 @@ const Writer = struct {...@@ -2749,7 +2749,7 @@ const Writer = struct {
2749 extra.data.src_hash_3,2749 extra.data.src_hash_3,
2750 };2750 };
2751 const src_hash_bytes: [16]u8 = @bitCast(src_hash_arr);2751 const src_hash_bytes: [16]u8 = @bitCast(src_hash_arr);
2752 try stream.print(" line(+{d}) hash({})", .{ extra.data.line_offset, std.fmt.fmtSliceHexLower(&src_hash_bytes) });2752 try stream.print(" line({d}) hash({})", .{ extra.data.src_line, std.fmt.fmtSliceHexLower(&src_hash_bytes) });
27532753
2754 {2754 {
2755 const bodies = extra.data.getBodies(@intCast(extra.end), self.code);2755 const bodies = extra.data.getBodies(@intCast(extra.end), self.code);
src/type.zig+29-1
...@@ -11,6 +11,7 @@ const target_util = @import("target.zig");...@@ -11,6 +11,7 @@ const target_util = @import("target.zig");
11const Sema = @import("Sema.zig");11const Sema = @import("Sema.zig");
12const InternPool = @import("InternPool.zig");12const InternPool = @import("InternPool.zig");
13const Alignment = InternPool.Alignment;13const Alignment = InternPool.Alignment;
14const Zir = std.zig.Zir;
1415
15/// Both types and values are canonically represented by a single 32-bit integer16/// Both types and values are canonically represented by a single 32-bit integer
16/// which is an index into an `InternPool` data structure.17/// which is an index into an `InternPool` data structure.
...@@ -3340,7 +3341,7 @@ pub const Type = struct {...@@ -3340,7 +3341,7 @@ pub const Type = struct {
3340 .struct_type, .union_type, .opaque_type, .enum_type => |info| switch (info) {3341 .struct_type, .union_type, .opaque_type, .enum_type => |info| switch (info) {
3341 .declared => |d| d.zir_index,3342 .declared => |d| d.zir_index,
3342 .reified => |r| r.zir_index,3343 .reified => |r| r.zir_index,
3343 .generated_tag => |gt| ip.loadUnionType(gt.union_type).zir_index, // must be declared since we can't generate tags when reifying3344 .generated_tag => |gt| ip.loadUnionType(gt.union_type).zir_index,
3344 .empty_struct => return null,3345 .empty_struct => return null,
3345 },3346 },
3346 else => return null,3347 else => return null,
...@@ -3440,6 +3441,33 @@ pub const Type = struct {...@@ -3440,6 +3441,33 @@ pub const Type = struct {
3440 };3441 };
3441 }3442 }
34423443
3444 pub fn typeDeclSrcLine(ty: Type, zcu: *const Zcu) ?u32 {
3445 const ip = &zcu.intern_pool;
3446 const tracked = switch (ip.indexToKey(ty.toIntern())) {
3447 .struct_type, .union_type, .opaque_type, .enum_type => |info| switch (info) {
3448 .declared => |d| d.zir_index,
3449 .reified => |r| r.zir_index,
3450 .generated_tag => |gt| ip.loadUnionType(gt.union_type).zir_index,
3451 .empty_struct => return null,
3452 },
3453 else => return null,
3454 };
3455 const info = tracked.resolveFull(&zcu.intern_pool);
3456 const file = zcu.import_table.values()[zcu.path_digest_map.getIndex(info.path_digest).?];
3457 assert(file.zir_loaded);
3458 const zir = file.zir;
3459 const inst = zir.instructions.get(@intFromEnum(info.inst));
3460 assert(inst.tag == .extended);
3461 return switch (inst.data.extended.opcode) {
3462 .struct_decl => zir.extraData(Zir.Inst.StructDecl, inst.data.extended.operand).data.src_line,
3463 .union_decl => zir.extraData(Zir.Inst.UnionDecl, inst.data.extended.operand).data.src_line,
3464 .enum_decl => zir.extraData(Zir.Inst.EnumDecl, inst.data.extended.operand).data.src_line,
3465 .opaque_decl => zir.extraData(Zir.Inst.OpaqueDecl, inst.data.extended.operand).data.src_line,
3466 .reify => zir.extraData(Zir.Inst.Reify, inst.data.extended.operand).data.src_line,
3467 else => unreachable,
3468 };
3469 }
3470
3443 /// Given a namespace type, returns its list of caotured values.3471 /// Given a namespace type, returns its list of caotured values.
3444 pub fn getCaptures(ty: Type, zcu: *const Zcu) InternPool.CaptureValue.Slice {3472 pub fn getCaptures(ty: Type, zcu: *const Zcu) InternPool.CaptureValue.Slice {
3445 const ip = &zcu.intern_pool;3473 const ip = &zcu.intern_pool;