authorgravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2024-06-27 00:14:03+01:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2024-06-27 00:14:03+01:00
loga016ca61706b300534a3a3a3c656b9b0ec24591c
tree87e9ae619d448ae4252931ba20393198f47dddc0
parent3e9ab6aa7b2d90c25cb906d425a148abf9da3dcb
parent4cb5318088b2eb66891f0d83b76a2740644b4156
signaturebadge-check Signed by PGP key B5690EEEBB952194

Merge pull request #20424 from mlugg/the-great-decl-split

Dismantle Decl a little bit more

11 files changed, 161 insertions(+), 138 deletions(-)

lib/std/zig/AstGen.zig+7-7
......@@ -4368,7 +4368,7 @@ fn fnDecl(
43684368 decl_inst,
43694369 std.zig.hashSrc(tree.getNodeSource(decl_node)),
43704370 .{ .named = fn_name_token },
4371 decl_gz.decl_line - gz.decl_line,
4371 decl_gz.decl_line,
43724372 is_pub,
43734373 is_export,
43744374 doc_comment_index,
......@@ -4529,7 +4529,7 @@ fn globalVarDecl(
45294529 decl_inst,
45304530 std.zig.hashSrc(tree.getNodeSource(node)),
45314531 .{ .named = name_token },
4532 block_scope.decl_line - gz.decl_line,
4532 block_scope.decl_line,
45334533 is_pub,
45344534 is_export,
45354535 doc_comment_index,
......@@ -4579,7 +4579,7 @@ fn comptimeDecl(
45794579 decl_inst,
45804580 std.zig.hashSrc(tree.getNodeSource(node)),
45814581 .@"comptime",
4582 decl_block.decl_line - gz.decl_line,
4582 decl_block.decl_line,
45834583 false,
45844584 false,
45854585 .empty,
......@@ -4629,7 +4629,7 @@ fn usingnamespaceDecl(
46294629 decl_inst,
46304630 std.zig.hashSrc(tree.getNodeSource(node)),
46314631 .@"usingnamespace",
4632 decl_block.decl_line - gz.decl_line,
4632 decl_block.decl_line,
46334633 is_pub,
46344634 false,
46354635 .empty,
......@@ -4818,7 +4818,7 @@ fn testDecl(
48184818 decl_inst,
48194819 std.zig.hashSrc(tree.getNodeSource(node)),
48204820 test_name,
4821 decl_block.decl_line - gz.decl_line,
4821 decl_block.decl_line,
48224822 false,
48234823 false,
48244824 .empty,
......@@ -13861,7 +13861,7 @@ fn setDeclaration(
1386113861 decl_inst: Zir.Inst.Index,
1386213862 src_hash: std.zig.SrcHash,
1386313863 name: DeclarationName,
13864 line_offset: u32,
13864 src_line: u32,
1386513865 is_pub: bool,
1386613866 is_export: bool,
1386713867 doc_comment: Zir.NullTerminatedString,
......@@ -13913,7 +13913,7 @@ fn setDeclaration(
1391313913 .@"comptime" => .@"comptime",
1391413914 .@"usingnamespace" => .@"usingnamespace",
1391513915 },
13916 .line_offset = line_offset,
13916 .src_line = src_line,
1391713917 .flags = .{
1391813918 .value_body_len = @intCast(value_len),
1391913919 .is_pub = is_pub,
lib/std/zig/Zir.zig+1-3
......@@ -2598,9 +2598,7 @@ pub const Inst = struct {
25982598 src_hash_3: u32,
25992599 /// The name of this `Decl`. Also indicates whether it is a test, comptime block, etc.
26002600 name: Name,
2601 /// This Decl's line number relative to that of its parent.
2602 /// TODO: column must be encoded similarly to respect non-formatted code!
2603 line_offset: u32,
2601 src_line: u32,
26042602 flags: Flags,
26052603
26062604 pub const Flags = packed struct(u32) {
src/Compilation.zig+1-1
......@@ -3494,7 +3494,7 @@ fn processOneJob(comp: *Compilation, job: Job, prog_node: std.Progress.Node) !vo
34943494 .{@errorName(err)},
34953495 ));
34963496 decl.analysis = .codegen_failure;
3497 try module.retryable_failures.append(gpa, InternPool.Depender.wrap(.{ .decl = decl_index }));
3497 try module.retryable_failures.append(gpa, InternPool.AnalSubject.wrap(.{ .decl = decl_index }));
34983498 };
34993499 },
35003500 .analyze_mod => |pkg| {
src/InternPool.zig+25-26
......@@ -81,7 +81,7 @@ namespace_name_deps: std.AutoArrayHashMapUnmanaged(NamespaceNameKey, DepEntry.In
8181/// Given a `Depender`, points to an entry in `dep_entries` whose `depender`
8282/// matches. The `next_dependee` field can be used to iterate all such entries
8383/// and remove them from the corresponding lists.
84first_dependency: std.AutoArrayHashMapUnmanaged(Depender, DepEntry.Index) = .{},
84first_dependency: std.AutoArrayHashMapUnmanaged(AnalSubject, DepEntry.Index) = .{},
8585
8686/// Stores dependency information. The hashmaps declared above are used to look
8787/// up entries in this list as required. This is not stored in `extra` so that
......@@ -132,39 +132,39 @@ pub fn trackZir(ip: *InternPool, gpa: Allocator, file: *Module.File, inst: Zir.I
132132 return @enumFromInt(gop.index);
133133}
134134
135/// Reperesents the "source" of a dependency edge, i.e. either a Decl or a
136/// runtime function (represented as an InternPool index).
137/// MSB is 0 for a Decl, 1 for a function.
138pub const Depender = enum(u32) {
139 _,
135/// Analysis Subject. Represents a single entity which undergoes semantic analysis.
136/// This is either a `Decl` (in future `Cau`) or a runtime function.
137/// The LSB is used as a tag bit.
138/// This is the "source" of an incremental dependency edge.
139pub const AnalSubject = packed struct(u32) {
140 kind: enum(u1) { decl, func },
141 index: u31,
140142 pub const Unwrapped = union(enum) {
141143 decl: DeclIndex,
142144 func: InternPool.Index,
143145 };
144 pub fn unwrap(dep: Depender) Unwrapped {
145 const tag: u1 = @truncate(@intFromEnum(dep) >> 31);
146 const val: u31 = @truncate(@intFromEnum(dep));
147 return switch (tag) {
148 0 => .{ .decl = @enumFromInt(val) },
149 1 => .{ .func = @enumFromInt(val) },
146 pub fn unwrap(as: AnalSubject) Unwrapped {
147 return switch (as.kind) {
148 .decl => .{ .decl = @enumFromInt(as.index) },
149 .func => .{ .func = @enumFromInt(as.index) },
150150 };
151151 }
152 pub fn wrap(raw: Unwrapped) Depender {
153 return @enumFromInt(switch (raw) {
154 .decl => |decl| @intFromEnum(decl),
155 .func => |func| (1 << 31) | @intFromEnum(func),
156 });
152 pub fn wrap(raw: Unwrapped) AnalSubject {
153 return switch (raw) {
154 .decl => |decl| .{ .kind = .decl, .index = @intCast(@intFromEnum(decl)) },
155 .func => |func| .{ .kind = .func, .index = @intCast(@intFromEnum(func)) },
156 };
157157 }
158 pub fn toOptional(dep: Depender) Optional {
159 return @enumFromInt(@intFromEnum(dep));
158 pub fn toOptional(as: AnalSubject) Optional {
159 return @enumFromInt(@as(u32, @bitCast(as)));
160160 }
161161 pub const Optional = enum(u32) {
162162 none = std.math.maxInt(u32),
163163 _,
164 pub fn unwrap(opt: Optional) ?Depender {
164 pub fn unwrap(opt: Optional) ?AnalSubject {
165165 return switch (opt) {
166166 .none => null,
167 _ => @enumFromInt(@intFromEnum(opt)),
167 _ => @bitCast(@intFromEnum(opt)),
168168 };
169169 }
170170 };
......@@ -178,7 +178,7 @@ pub const Dependee = union(enum) {
178178 namespace_name: NamespaceNameKey,
179179};
180180
181pub fn removeDependenciesForDepender(ip: *InternPool, gpa: Allocator, depender: Depender) void {
181pub fn removeDependenciesForDepender(ip: *InternPool, gpa: Allocator, depender: AnalSubject) void {
182182 var opt_idx = (ip.first_dependency.fetchSwapRemove(depender) orelse return).value.toOptional();
183183
184184 while (opt_idx.unwrap()) |idx| {
......@@ -207,7 +207,7 @@ pub fn removeDependenciesForDepender(ip: *InternPool, gpa: Allocator, depender:
207207pub const DependencyIterator = struct {
208208 ip: *const InternPool,
209209 next_entry: DepEntry.Index.Optional,
210 pub fn next(it: *DependencyIterator) ?Depender {
210 pub fn next(it: *DependencyIterator) ?AnalSubject {
211211 const idx = it.next_entry.unwrap() orelse return null;
212212 const entry = it.ip.dep_entries.items[@intFromEnum(idx)];
213213 it.next_entry = entry.next;
......@@ -236,7 +236,7 @@ pub fn dependencyIterator(ip: *const InternPool, dependee: Dependee) DependencyI
236236 };
237237}
238238
239pub fn addDependency(ip: *InternPool, gpa: Allocator, depender: Depender, dependee: Dependee) Allocator.Error!void {
239pub fn addDependency(ip: *InternPool, gpa: Allocator, depender: AnalSubject, dependee: Dependee) Allocator.Error!void {
240240 const first_depender_dep: DepEntry.Index.Optional = if (ip.first_dependency.get(depender)) |idx| dep: {
241241 // The entry already exists, so there is capacity to overwrite it later.
242242 break :dep idx.toOptional();
......@@ -300,7 +300,7 @@ pub const DepEntry = extern struct {
300300 /// the first and only entry in one of `intern_pool.*_deps`, and does not
301301 /// appear in any list by `first_dependency`, but is not in
302302 /// `free_dep_entries` since `*_deps` stores a reference to it.
303 depender: Depender.Optional,
303 depender: AnalSubject.Optional,
304304 /// Index into `dep_entries` forming a doubly linked list of all dependencies on this dependee.
305305 /// Used to iterate all dependers for a given dependee during an update.
306306 /// null if this is the end of the list.
......@@ -6958,7 +6958,6 @@ fn finishFuncInstance(
69586958 const decl_index = try ip.createDecl(gpa, .{
69596959 .name = undefined,
69606960 .src_namespace = fn_owner_decl.src_namespace,
6961 .src_line = fn_owner_decl.src_line,
69626961 .has_tv = true,
69636962 .owns_tv = true,
69646963 .val = @import("Value.zig").fromInterned(func_index),
src/Sema.zig+17-34
......@@ -2735,12 +2735,12 @@ fn maybeRemoveOutdatedType(sema: *Sema, ty: InternPool.Index) !bool {
27352735 if (!zcu.comp.debug_incremental) return false;
27362736
27372737 const decl_index = Type.fromInterned(ty).getOwnerDecl(zcu);
2738 const decl_as_depender = InternPool.Depender.wrap(.{ .decl = decl_index });
2738 const decl_as_depender = InternPool.AnalSubject.wrap(.{ .decl = decl_index });
27392739 const was_outdated = zcu.outdated.swapRemove(decl_as_depender) or
27402740 zcu.potentially_outdated.swapRemove(decl_as_depender);
27412741 if (!was_outdated) return false;
27422742 _ = zcu.outdated_ready.swapRemove(decl_as_depender);
2743 zcu.intern_pool.removeDependenciesForDepender(zcu.gpa, InternPool.Depender.wrap(.{ .decl = decl_index }));
2743 zcu.intern_pool.removeDependenciesForDepender(zcu.gpa, InternPool.AnalSubject.wrap(.{ .decl = decl_index }));
27442744 zcu.intern_pool.remove(ty);
27452745 zcu.declPtr(decl_index).analysis = .dependency_failure;
27462746 try zcu.markDependeeOutdated(.{ .decl_val = decl_index });
......@@ -2827,7 +2827,6 @@ fn zirStructDecl(
28272827 small.name_strategy,
28282828 "struct",
28292829 inst,
2830 extra.data.src_line,
28312830 );
28322831 mod.declPtr(new_decl_index).owns_tv = true;
28332832 errdefer mod.abortAnonDecl(new_decl_index);
......@@ -2835,7 +2834,7 @@ fn zirStructDecl(
28352834 if (sema.mod.comp.debug_incremental) {
28362835 try ip.addDependency(
28372836 sema.gpa,
2838 InternPool.Depender.wrap(.{ .decl = new_decl_index }),
2837 InternPool.AnalSubject.wrap(.{ .decl = new_decl_index }),
28392838 .{ .src_hash = try ip.trackZir(sema.gpa, block.getFileScope(mod), inst) },
28402839 );
28412840 }
......@@ -2864,7 +2863,6 @@ fn createAnonymousDeclTypeNamed(
28642863 name_strategy: Zir.Inst.NameStrategy,
28652864 anon_prefix: []const u8,
28662865 inst: ?Zir.Inst.Index,
2867 src_line: u32,
28682866) !InternPool.DeclIndex {
28692867 const zcu = sema.mod;
28702868 const ip = &zcu.intern_pool;
......@@ -2876,7 +2874,7 @@ fn createAnonymousDeclTypeNamed(
28762874 switch (name_strategy) {
28772875 .anon => {}, // handled after switch
28782876 .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);
28802878 return new_decl_index;
28812879 },
28822880 .func => func_strat: {
......@@ -2921,7 +2919,7 @@ fn createAnonymousDeclTypeNamed(
29212919
29222920 try writer.writeByte(')');
29232921 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);
29252923 return new_decl_index;
29262924 },
29272925 .dbg_var => {
......@@ -2935,7 +2933,7 @@ fn createAnonymousDeclTypeNamed(
29352933 const name = try ip.getOrPutStringFmt(gpa, "{}.{s}", .{
29362934 block.type_name_ctx.fmt(ip), zir_data[i].str_op.getStr(sema.code),
29372935 }, .no_embedded_nulls);
2938 try zcu.initNewAnonDecl(new_decl_index, src_line, val, name);
2936 try zcu.initNewAnonDecl(new_decl_index, val, name);
29392937 return new_decl_index;
29402938 },
29412939 else => {},
......@@ -2956,7 +2954,7 @@ fn createAnonymousDeclTypeNamed(
29562954 const name = ip.getOrPutStringFmt(gpa, "{}__{s}_{d}", .{
29572955 block.type_name_ctx.fmt(ip), anon_prefix, @intFromEnum(new_decl_index),
29582956 }, .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);
29602958 return new_decl_index;
29612959}
29622960
......@@ -3062,7 +3060,6 @@ fn zirEnumDecl(
30623060 small.name_strategy,
30633061 "enum",
30643062 inst,
3065 extra.data.src_line,
30663063 );
30673064 const new_decl = mod.declPtr(new_decl_index);
30683065 new_decl.owns_tv = true;
......@@ -3071,7 +3068,7 @@ fn zirEnumDecl(
30713068 if (sema.mod.comp.debug_incremental) {
30723069 try mod.intern_pool.addDependency(
30733070 sema.gpa,
3074 InternPool.Depender.wrap(.{ .decl = new_decl_index }),
3071 InternPool.AnalSubject.wrap(.{ .decl = new_decl_index }),
30753072 .{ .src_hash = try mod.intern_pool.trackZir(sema.gpa, block.getFileScope(mod), inst) },
30763073 );
30773074 }
......@@ -3330,7 +3327,6 @@ fn zirUnionDecl(
33303327 small.name_strategy,
33313328 "union",
33323329 inst,
3333 extra.data.src_line,
33343330 );
33353331 mod.declPtr(new_decl_index).owns_tv = true;
33363332 errdefer mod.abortAnonDecl(new_decl_index);
......@@ -3338,7 +3334,7 @@ fn zirUnionDecl(
33383334 if (sema.mod.comp.debug_incremental) {
33393335 try mod.intern_pool.addDependency(
33403336 sema.gpa,
3341 InternPool.Depender.wrap(.{ .decl = new_decl_index }),
3337 InternPool.AnalSubject.wrap(.{ .decl = new_decl_index }),
33423338 .{ .src_hash = try mod.intern_pool.trackZir(sema.gpa, block.getFileScope(mod), inst) },
33433339 );
33443340 }
......@@ -3419,7 +3415,6 @@ fn zirOpaqueDecl(
34193415 small.name_strategy,
34203416 "opaque",
34213417 inst,
3422 extra.data.src_line,
34233418 );
34243419 mod.declPtr(new_decl_index).owns_tv = true;
34253420 errdefer mod.abortAnonDecl(new_decl_index);
......@@ -3427,7 +3422,7 @@ fn zirOpaqueDecl(
34273422 if (sema.mod.comp.debug_incremental) {
34283423 try ip.addDependency(
34293424 gpa,
3430 InternPool.Depender.wrap(.{ .decl = new_decl_index }),
3425 InternPool.AnalSubject.wrap(.{ .decl = new_decl_index }),
34313426 .{ .src_hash = try ip.trackZir(gpa, block.getFileScope(mod), inst) },
34323427 );
34333428 }
......@@ -21546,7 +21541,7 @@ fn zirReify(
2154621541 .needed_comptime_reason = "struct fields must be comptime-known",
2154721542 });
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());
2155021545 },
2155121546 .Enum => {
2155221547 const struct_type = ip.loadStructType(ip.typeOf(union_val.val));
......@@ -21575,7 +21570,7 @@ fn zirReify(
2157521570 .needed_comptime_reason = "enum fields must be comptime-known",
2157621571 });
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);
2157921574 },
2158021575 .Opaque => {
2158121576 const struct_type = ip.loadStructType(ip.typeOf(union_val.val));
......@@ -21606,7 +21601,6 @@ fn zirReify(
2160621601 name_strategy,
2160721602 "opaque",
2160821603 inst,
21609 extra.src_line,
2161021604 );
2161121605 mod.declPtr(new_decl_index).owns_tv = true;
2161221606 errdefer mod.abortAnonDecl(new_decl_index);
......@@ -21643,7 +21637,7 @@ fn zirReify(
2164321637 .needed_comptime_reason = "union fields must be comptime-known",
2164421638 });
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);
2164721641 },
2164821642 .Fn => {
2164921643 const struct_type = ip.loadStructType(ip.typeOf(union_val.val));
......@@ -21745,7 +21739,6 @@ fn reifyEnum(
2174521739 is_exhaustive: bool,
2174621740 fields_val: Value,
2174721741 name_strategy: Zir.Inst.NameStrategy,
21748 src_line: u32,
2174921742) CompileError!Air.Inst.Ref {
2175021743 const mod = sema.mod;
2175121744 const gpa = sema.gpa;
......@@ -21807,7 +21800,6 @@ fn reifyEnum(
2180721800 name_strategy,
2180821801 "enum",
2180921802 inst,
21810 src_line,
2181121803 );
2181221804 mod.declPtr(new_decl_index).owns_tv = true;
2181321805 errdefer mod.abortAnonDecl(new_decl_index);
......@@ -21871,7 +21863,6 @@ fn reifyUnion(
2187121863 opt_tag_type_val: Value,
2187221864 fields_val: Value,
2187321865 name_strategy: Zir.Inst.NameStrategy,
21874 src_line: u32,
2187521866) CompileError!Air.Inst.Ref {
2187621867 const mod = sema.mod;
2187721868 const gpa = sema.gpa;
......@@ -21955,7 +21946,6 @@ fn reifyUnion(
2195521946 name_strategy,
2195621947 "union",
2195721948 inst,
21958 src_line,
2195921949 );
2196021950 mod.declPtr(new_decl_index).owns_tv = true;
2196121951 errdefer mod.abortAnonDecl(new_decl_index);
......@@ -22051,7 +22041,7 @@ fn reifyUnion(
2205122041 }
2205222042 }
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));
2205522045 break :tag_ty .{ enum_tag_ty, false };
2205622046 };
2205722047 errdefer if (!has_explicit_tag) ip.remove(enum_tag_ty); // remove generated tag type on error
......@@ -22112,7 +22102,6 @@ fn reifyStruct(
2211222102 fields_val: Value,
2211322103 name_strategy: Zir.Inst.NameStrategy,
2211422104 is_tuple: bool,
22115 src_line: u32,
2211622105) CompileError!Air.Inst.Ref {
2211722106 const mod = sema.mod;
2211822107 const gpa = sema.gpa;
......@@ -22213,7 +22202,6 @@ fn reifyStruct(
2221322202 name_strategy,
2221422203 "struct",
2221522204 inst,
22216 src_line,
2221722205 );
2221822206 mod.declPtr(new_decl_index).owns_tv = true;
2221922207 errdefer mod.abortAnonDecl(new_decl_index);
......@@ -26347,7 +26335,6 @@ fn zirBuiltinExtern(
2634726335 const new_decl = mod.declPtr(new_decl_index);
2634826336 try mod.initNewAnonDecl(
2634926337 new_decl_index,
26350 sema.owner_decl.src_line,
2635126338 Value.fromInterned(
2635226339 if (Type.fromInterned(ptr_info.child).zigTypeTag(mod) == .Fn)
2635326340 try ip.getExternFunc(sema.gpa, .{
......@@ -36745,10 +36732,10 @@ fn semaUnionFields(mod: *Module, arena: Allocator, union_type: InternPool.Loaded
3674536732 return sema.failWithOwnedErrorMsg(&block_scope, msg);
3674636733 }
3674736734 } 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));
3674936736 union_type.tagTypePtr(ip).* = enum_ty;
3675036737 } 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));
3675236739 union_type.tagTypePtr(ip).* = enum_ty;
3675336740 }
3675436741}
......@@ -36766,7 +36753,6 @@ fn generateUnionTagTypeNumbered(
3676636753 enum_field_names: []const InternPool.NullTerminatedString,
3676736754 enum_field_vals: []const InternPool.Index,
3676836755 union_owner_decl: *Module.Decl,
36769 src_line: u32,
3677036756) !InternPool.Index {
3677136757 const mod = sema.mod;
3677236758 const gpa = sema.gpa;
......@@ -36783,7 +36769,6 @@ fn generateUnionTagTypeNumbered(
3678336769 );
3678436770 try mod.initNewAnonDecl(
3678536771 new_decl_index,
36786 src_line,
3678736772 Value.@"unreachable",
3678836773 name,
3678936774 );
......@@ -36816,7 +36801,6 @@ fn generateUnionTagTypeSimple(
3681636801 block: *Block,
3681736802 enum_field_names: []const InternPool.NullTerminatedString,
3681836803 union_owner_decl: *Module.Decl,
36819 src_line: u32,
3682036804) !InternPool.Index {
3682136805 const mod = sema.mod;
3682236806 const ip = &mod.intern_pool;
......@@ -36834,7 +36818,6 @@ fn generateUnionTagTypeSimple(
3683436818 );
3683536819 try mod.initNewAnonDecl(
3683636820 new_decl_index,
36837 src_line,
3683836821 Value.@"unreachable",
3683936822 name,
3684036823 );
......@@ -38379,7 +38362,7 @@ pub fn declareDependency(sema: *Sema, dependee: InternPool.Dependee) !void {
3837938362 return;
3838038363 }
3838138364
38382 const depender = InternPool.Depender.wrap(
38365 const depender = InternPool.AnalSubject.wrap(
3838338366 if (sema.owner_func_index != .none)
3838438367 .{ .func = sema.owner_func_index }
3838538368 else
src/Zcu.zig+62-47
......@@ -139,26 +139,26 @@ global_error_set: GlobalErrorSet = .{},
139139/// Maximum amount of distinct error values, set by --error-limit
140140error_limit: ErrorInt,
141141
142/// Value is the number of PO or outdated Decls which this Depender depends on.
143potentially_outdated: std.AutoArrayHashMapUnmanaged(InternPool.Depender, u32) = .{},
144/// Value is the number of PO or outdated Decls which this Depender depends on.
145/// Once this value drops to 0, the Depender is a candidate for re-analysis.
146outdated: std.AutoArrayHashMapUnmanaged(InternPool.Depender, u32) = .{},
147/// This contains all `Depender`s in `outdated` whose PO dependency count is 0.
148/// Such `Depender`s are ready for immediate re-analysis.
142/// Value is the number of PO or outdated Decls which this AnalSubject depends on.
143potentially_outdated: std.AutoArrayHashMapUnmanaged(InternPool.AnalSubject, u32) = .{},
144/// Value is the number of PO or outdated Decls which this AnalSubject depends on.
145/// Once this value drops to 0, the AnalSubject is a candidate for re-analysis.
146outdated: std.AutoArrayHashMapUnmanaged(InternPool.AnalSubject, u32) = .{},
147/// This contains all `AnalSubject`s in `outdated` whose PO dependency count is 0.
148/// Such `AnalSubject`s are ready for immediate re-analysis.
149149/// See `findOutdatedToAnalyze` for details.
150outdated_ready: std.AutoArrayHashMapUnmanaged(InternPool.Depender, void) = .{},
150outdated_ready: std.AutoArrayHashMapUnmanaged(InternPool.AnalSubject, void) = .{},
151151/// This contains a set of Decls which may not be in `outdated`, but are the
152152/// root Decls of files which have updated source and thus must be re-analyzed.
153153/// If such a Decl is only in this set, the struct type index may be preserved
154154/// (only the namespace might change). If such a Decl is also `outdated`, the
155155/// struct type index must be recreated.
156156outdated_file_root: std.AutoArrayHashMapUnmanaged(Decl.Index, void) = .{},
157/// This contains a list of Dependers whose analysis or codegen failed, but the
157/// This contains a list of AnalSubject whose analysis or codegen failed, but the
158158/// failure was something like running out of disk space, and trying again may
159159/// succeed. On the next update, we will flush this list, marking all members of
160160/// it as outdated.
161retryable_failures: std.ArrayListUnmanaged(InternPool.Depender) = .{},
161retryable_failures: std.ArrayListUnmanaged(InternPool.AnalSubject) = .{},
162162
163163stage1_flags: packed struct {
164164 have_winmain: bool = false,
......@@ -347,10 +347,6 @@ pub const Decl = struct {
347347 /// there is no parent.
348348 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,
354350 /// Index of the ZIR `declaration` instruction from which this `Decl` was created.
355351 /// For the root `Decl` of a `File` and legacy anonymous decls, this is `.none`.
356352 zir_decl_index: InternPool.TrackedInst.Index.Optional,
......@@ -564,6 +560,33 @@ pub const Decl = struct {
564560 .offset = LazySrcLoc.Offset.nodeOffset(0),
565561 };
566562 }
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 }
567590};
568591
569592/// This state is attached to every Decl when Module emit_h is non-null.
......@@ -3114,9 +3137,9 @@ fn markPoDependeeUpToDate(zcu: *Zcu, dependee: InternPool.Dependee) !void {
31143137 }
31153138}
31163139
3117/// Given a Depender which is newly outdated or PO, mark all Dependers which may
3118/// in turn be PO, due to a dependency on the original Depender's tyval or IES.
3119fn markTransitiveDependersPotentiallyOutdated(zcu: *Zcu, maybe_outdated: InternPool.Depender) !void {
3140/// Given a AnalSubject which is newly outdated or PO, mark all AnalSubjects which may
3141/// in turn be PO, due to a dependency on the original AnalSubject's tyval or IES.
3142fn markTransitiveDependersPotentiallyOutdated(zcu: *Zcu, maybe_outdated: InternPool.AnalSubject) !void {
31203143 var it = zcu.intern_pool.dependencyIterator(switch (maybe_outdated.unwrap()) {
31213144 .decl => |decl_index| .{ .decl_val = decl_index }, // TODO: also `decl_ref` deps when introduced
31223145 .func => |func_index| .{ .func_ies = func_index },
......@@ -3138,12 +3161,12 @@ fn markTransitiveDependersPotentiallyOutdated(zcu: *Zcu, maybe_outdated: InternP
31383161 continue;
31393162 }
31403163 try zcu.potentially_outdated.putNoClobber(zcu.gpa, po, 1);
3141 // This Depender was not already PO, so we must recursively mark its dependers as also PO.
3164 // This AnalSubject was not already PO, so we must recursively mark its dependers as also PO.
31423165 try zcu.markTransitiveDependersPotentiallyOutdated(po);
31433166 }
31443167}
31453168
3146pub fn findOutdatedToAnalyze(zcu: *Zcu) Allocator.Error!?InternPool.Depender {
3169pub fn findOutdatedToAnalyze(zcu: *Zcu) Allocator.Error!?InternPool.AnalSubject {
31473170 if (!zcu.comp.debug_incremental) return null;
31483171
31493172 if (zcu.outdated.count() == 0 and zcu.potentially_outdated.count() == 0) {
......@@ -3151,8 +3174,8 @@ pub fn findOutdatedToAnalyze(zcu: *Zcu) Allocator.Error!?InternPool.Depender {
31513174 return null;
31523175 }
31533176
3154 // Our goal is to find an outdated Depender which itself has no outdated or
3155 // PO dependencies. Most of the time, such a Depender will exist - we track
3177 // Our goal is to find an outdated AnalSubject which itself has no outdated or
3178 // PO dependencies. Most of the time, such an AnalSubject will exist - we track
31563179 // them in the `outdated_ready` set for efficiency. However, this is not
31573180 // necessarily the case, since the Decl dependency graph may contain loops
31583181 // via mutually recursive definitions:
......@@ -3174,7 +3197,7 @@ pub fn findOutdatedToAnalyze(zcu: *Zcu) Allocator.Error!?InternPool.Depender {
31743197 // `outdated`. This set will be small (number of files changed in this
31753198 // update), so it's alright for us to just iterate here.
31763199 for (zcu.outdated_file_root.keys()) |file_decl| {
3177 const decl_depender = InternPool.Depender.wrap(.{ .decl = file_decl });
3200 const decl_depender = InternPool.AnalSubject.wrap(.{ .decl = file_decl });
31783201 if (zcu.outdated.contains(decl_depender)) {
31793202 // Since we didn't hit this in the first loop, this Decl must have
31803203 // pending dependencies, so is ineligible.
......@@ -3190,7 +3213,7 @@ pub fn findOutdatedToAnalyze(zcu: *Zcu) Allocator.Error!?InternPool.Depender {
31903213 return decl_depender;
31913214 }
31923215
3193 // There is no single Depender which is ready for re-analysis. Instead, we
3216 // There is no single AnalSubject which is ready for re-analysis. Instead, we
31943217 // must assume that some Decl with PO dependencies is outdated - e.g. in the
31953218 // above example we arbitrarily pick one of A or B. We should select a Decl,
31963219 // since a Decl is definitely responsible for the loop in the dependency
......@@ -3198,7 +3221,7 @@ pub fn findOutdatedToAnalyze(zcu: *Zcu) Allocator.Error!?InternPool.Depender {
31983221
31993222 // The choice of this Decl could have a big impact on how much total
32003223 // analysis we perform, since if analysis concludes its tyval is unchanged,
3201 // then other PO Dependers may be resolved as up-to-date. To hopefully avoid
3224 // then other PO AnalSubject may be resolved as up-to-date. To hopefully avoid
32023225 // doing too much work, let's find a Decl which the most things depend on -
32033226 // the idea is that this will resolve a lot of loops (but this is only a
32043227 // heuristic).
......@@ -3248,7 +3271,7 @@ pub fn findOutdatedToAnalyze(zcu: *Zcu) Allocator.Error!?InternPool.Depender {
32483271 chosen_decl_dependers,
32493272 });
32503273
3251 return InternPool.Depender.wrap(.{ .decl = chosen_decl_idx.? });
3274 return InternPool.AnalSubject.wrap(.{ .decl = chosen_decl_idx.? });
32523275}
32533276
32543277/// During an incremental update, before semantic analysis, call this to flush all values from
......@@ -3258,12 +3281,12 @@ pub fn flushRetryableFailures(zcu: *Zcu) !void {
32583281 for (zcu.retryable_failures.items) |depender| {
32593282 if (zcu.outdated.contains(depender)) continue;
32603283 if (zcu.potentially_outdated.fetchSwapRemove(depender)) |kv| {
3261 // This Depender was already PO, but we now consider it outdated.
3284 // This AnalSubject was already PO, but we now consider it outdated.
32623285 // Any transitive dependencies are already marked PO.
32633286 try zcu.outdated.put(gpa, depender, kv.value);
32643287 continue;
32653288 }
3266 // This Depender was not marked PO, but is now outdated. Mark it as
3289 // This AnalSubject was not marked PO, but is now outdated. Mark it as
32673290 // such, then recursively mark transitive dependencies as PO.
32683291 try zcu.outdated.put(gpa, depender, 0);
32693292 try zcu.markTransitiveDependersPotentiallyOutdated(depender);
......@@ -3433,7 +3456,7 @@ pub fn ensureDeclAnalyzed(mod: *Module, decl_index: Decl.Index) SemaError!void {
34333456 // which tries to limit re-analysis to Decls whose previously listed
34343457 // dependencies are all up-to-date.
34353458
3436 const decl_as_depender = InternPool.Depender.wrap(.{ .decl = decl_index });
3459 const decl_as_depender = InternPool.AnalSubject.wrap(.{ .decl = decl_index });
34373460 const decl_was_outdated = mod.outdated.swapRemove(decl_as_depender) or
34383461 mod.potentially_outdated.swapRemove(decl_as_depender);
34393462
......@@ -3499,7 +3522,7 @@ pub fn ensureDeclAnalyzed(mod: *Module, decl_index: Decl.Index) SemaError!void {
34993522 else => |e| {
35003523 decl.analysis = .sema_failure;
35013524 try mod.failed_decls.ensureUnusedCapacity(mod.gpa, 1);
3502 try mod.retryable_failures.append(mod.gpa, InternPool.Depender.wrap(.{ .decl = decl_index }));
3525 try mod.retryable_failures.append(mod.gpa, InternPool.AnalSubject.wrap(.{ .decl = decl_index }));
35033526 mod.failed_decls.putAssumeCapacityNoClobber(decl_index, try ErrorMsg.create(
35043527 mod.gpa,
35053528 decl.navSrcLoc(mod).upgrade(mod),
......@@ -3558,7 +3581,7 @@ pub fn ensureFuncBodyAnalyzed(zcu: *Zcu, maybe_coerced_func_index: InternPool.In
35583581 // that's the case, we should remove this function from the binary.
35593582 if (decl.val.ip_index != func_index) {
35603583 try zcu.markDependeeOutdated(.{ .func_ies = func_index });
3561 ip.removeDependenciesForDepender(gpa, InternPool.Depender.wrap(.{ .func = func_index }));
3584 ip.removeDependenciesForDepender(gpa, InternPool.AnalSubject.wrap(.{ .func = func_index }));
35623585 ip.remove(func_index);
35633586 @panic("TODO: remove orphaned function from binary");
35643587 }
......@@ -3584,7 +3607,7 @@ pub fn ensureFuncBodyAnalyzed(zcu: *Zcu, maybe_coerced_func_index: InternPool.In
35843607 .complete => {},
35853608 }
35863609
3587 const func_as_depender = InternPool.Depender.wrap(.{ .func = func_index });
3610 const func_as_depender = InternPool.AnalSubject.wrap(.{ .func = func_index });
35883611 const was_outdated = zcu.outdated.swapRemove(func_as_depender) or
35893612 zcu.potentially_outdated.swapRemove(func_as_depender);
35903613
......@@ -3705,7 +3728,7 @@ pub fn ensureFuncBodyAnalyzed(zcu: *Zcu, maybe_coerced_func_index: InternPool.In
37053728 .{@errorName(err)},
37063729 ));
37073730 func.analysis(ip).state = .codegen_failure;
3708 try zcu.retryable_failures.append(zcu.gpa, InternPool.Depender.wrap(.{ .func = func_index }));
3731 try zcu.retryable_failures.append(zcu.gpa, InternPool.AnalSubject.wrap(.{ .func = func_index }));
37093732 },
37103733 };
37113734 } else if (zcu.llvm_object) |llvm_object| {
......@@ -3750,7 +3773,7 @@ pub fn ensureFuncBodyAnalysisQueued(mod: *Module, func_index: InternPool.Index)
37503773
37513774 assert(decl.has_tv);
37523775
3753 const func_as_depender = InternPool.Depender.wrap(.{ .func = func_index });
3776 const func_as_depender = InternPool.AnalSubject.wrap(.{ .func = func_index });
37543777 const is_outdated = mod.outdated.contains(func_as_depender) or
37553778 mod.potentially_outdated.contains(func_as_depender);
37563779
......@@ -3834,7 +3857,7 @@ fn getFileRootStruct(zcu: *Zcu, decl_index: Decl.Index, namespace_index: Namespa
38343857 if (zcu.comp.debug_incremental) {
38353858 try ip.addDependency(
38363859 gpa,
3837 InternPool.Depender.wrap(.{ .decl = decl_index }),
3860 InternPool.AnalSubject.wrap(.{ .decl = decl_index }),
38383861 .{ .src_hash = tracked_inst },
38393862 );
38403863 }
......@@ -3883,7 +3906,7 @@ fn semaFileUpdate(zcu: *Zcu, file: *File, type_outdated: bool) SemaError!bool {
38833906
38843907 if (type_outdated) {
38853908 // Invalidate the existing type, reusing the decl and namespace.
3886 zcu.intern_pool.removeDependenciesForDepender(zcu.gpa, InternPool.Depender.wrap(.{ .decl = file.root_decl.unwrap().? }));
3909 zcu.intern_pool.removeDependenciesForDepender(zcu.gpa, InternPool.AnalSubject.wrap(.{ .decl = file.root_decl.unwrap().? }));
38873910 zcu.intern_pool.remove(decl.val.toIntern());
38883911 decl.val = undefined;
38893912 _ = try zcu.getFileRootStruct(file.root_decl.unwrap().?, decl.src_namespace, file);
......@@ -3944,7 +3967,6 @@ fn semaFile(mod: *Module, file: *File) SemaError!void {
39443967
39453968 new_decl.name = try file.fullyQualifiedName(mod);
39463969 new_decl.name_fully_qualified = true;
3947 new_decl.src_line = 0;
39483970 new_decl.is_pub = true;
39493971 new_decl.is_exported = false;
39503972 new_decl.alignment = .none;
......@@ -4075,7 +4097,7 @@ fn semaDecl(mod: *Module, decl_index: Decl.Index) !SemaDeclResult {
40754097 break :ip_index .none;
40764098 };
40774099
4078 mod.intern_pool.removeDependenciesForDepender(gpa, InternPool.Depender.wrap(.{ .decl = decl_index }));
4100 mod.intern_pool.removeDependenciesForDepender(gpa, InternPool.AnalSubject.wrap(.{ .decl = decl_index }));
40794101
40804102 decl.analysis = .in_progress;
40814103
......@@ -4301,7 +4323,7 @@ fn semaAnonOwnerDecl(zcu: *Zcu, decl_index: Decl.Index) !SemaDeclResult {
43014323 // with a new Decl.
43024324 //
43034325 // Yes, this does mean that any type owner Decl has a constant value for its entire lifetime.
4304 zcu.intern_pool.removeDependenciesForDepender(zcu.gpa, InternPool.Depender.wrap(.{ .decl = decl_index }));
4326 zcu.intern_pool.removeDependenciesForDepender(zcu.gpa, InternPool.AnalSubject.wrap(.{ .decl = decl_index }));
43054327 zcu.intern_pool.remove(decl.val.toIntern());
43064328 decl.analysis = .dependency_failure;
43074329 return .{
......@@ -4762,8 +4784,6 @@ fn scanDecl(iter: *ScanDeclIter, decl_inst: Zir.Inst.Index) Allocator.Error!void
47624784 const extra = zir.extraData(Zir.Inst.Declaration, inst_data.payload_index);
47634785 const declaration = extra.data;
47644786
4765 const line = iter.parent_decl.src_line + declaration.line_offset;
4766
47674787 // Every Decl needs a name.
47684788 const decl_name: InternPool.NullTerminatedString, const kind: Decl.Kind, const is_named_test: bool = switch (declaration.name) {
47694789 .@"comptime" => info: {
......@@ -4850,7 +4870,6 @@ fn scanDecl(iter: *ScanDeclIter, decl_inst: Zir.Inst.Index) Allocator.Error!void
48504870 const was_exported = decl.is_exported;
48514871 assert(decl.kind == kind); // ZIR tracking should preserve this
48524872 decl.name = decl_name;
4853 decl.src_line = line;
48544873 decl.is_pub = declaration.flags.is_pub;
48554874 decl.is_exported = declaration.flags.is_export;
48564875 break :decl_index .{ was_exported, decl_index };
......@@ -4860,7 +4879,6 @@ fn scanDecl(iter: *ScanDeclIter, decl_inst: Zir.Inst.Index) Allocator.Error!void
48604879 const new_decl = zcu.declPtr(new_decl_index);
48614880 new_decl.kind = kind;
48624881 new_decl.name = decl_name;
4863 new_decl.src_line = line;
48644882 new_decl.is_pub = declaration.flags.is_pub;
48654883 new_decl.is_exported = declaration.flags.is_export;
48664884 new_decl.zir_decl_index = tracked_inst.toOptional();
......@@ -5008,7 +5026,7 @@ pub fn analyzeFnBody(mod: *Module, func_index: InternPool.Index, arena: Allocato
50085026 const decl_prog_node = mod.sema_prog_node.start((try decl.fullyQualifiedName(mod)).toSlice(ip), 0);
50095027 defer decl_prog_node.end();
50105028
5011 mod.intern_pool.removeDependenciesForDepender(gpa, InternPool.Depender.wrap(.{ .func = func_index }));
5029 mod.intern_pool.removeDependenciesForDepender(gpa, InternPool.AnalSubject.wrap(.{ .func = func_index }));
50125030
50135031 var comptime_err_ret_trace = std.ArrayList(LazySrcLoc).init(gpa);
50145032 defer comptime_err_ret_trace.deinit();
......@@ -5263,7 +5281,6 @@ pub fn allocateNewDecl(zcu: *Zcu, namespace: Namespace.Index) !Decl.Index {
52635281 const decl_index = try zcu.intern_pool.createDecl(gpa, .{
52645282 .name = undefined,
52655283 .src_namespace = namespace,
5266 .src_line = undefined,
52675284 .has_tv = false,
52685285 .owns_tv = false,
52695286 .val = undefined,
......@@ -5311,14 +5328,12 @@ pub fn errorSetBits(mod: *Module) u16 {
53115328pub fn initNewAnonDecl(
53125329 mod: *Module,
53135330 new_decl_index: Decl.Index,
5314 src_line: u32,
53155331 val: Value,
53165332 name: InternPool.NullTerminatedString,
53175333) Allocator.Error!void {
53185334 const new_decl = mod.declPtr(new_decl_index);
53195335
53205336 new_decl.name = name;
5321 new_decl.src_line = src_line;
53225337 new_decl.val = val;
53235338 new_decl.alignment = .none;
53245339 new_decl.@"linksection" = .none;
......@@ -5612,7 +5627,7 @@ pub fn linkerUpdateDecl(zcu: *Zcu, decl_index: Decl.Index) !void {
56125627 .{@errorName(err)},
56135628 ));
56145629 decl.analysis = .codegen_failure;
5615 try zcu.retryable_failures.append(zcu.gpa, InternPool.Depender.wrap(.{ .decl = decl_index }));
5630 try zcu.retryable_failures.append(zcu.gpa, InternPool.AnalSubject.wrap(.{ .decl = decl_index }));
56165631 },
56175632 };
56185633 } else if (zcu.llvm_object) |llvm_object| {
src/codegen/llvm.zig+9-9
......@@ -1697,7 +1697,7 @@ pub const Object = struct {
16971697 const file, const subprogram = if (!wip.strip) debug_info: {
16981698 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;
17011701 const is_internal_linkage = decl.val.getExternFunc(zcu) == null and
17021702 !zcu.decl_exports.contains(decl_index);
17031703 const debug_decl_type = try o.lowerDebugType(decl.typeOf(zcu));
......@@ -1741,7 +1741,7 @@ pub const Object = struct {
17411741 .sync_scope = if (owner_mod.single_threaded) .singlethread else .system,
17421742 .file = file,
17431743 .scope = subprogram,
1744 .base_line = dg.decl.src_line,
1744 .base_line = dg.decl.navSrcLine(zcu),
17451745 .prev_dbg_line = 0,
17461746 .prev_dbg_column = 0,
17471747 .err_ret_trace = err_ret_trace,
......@@ -2067,7 +2067,7 @@ pub const Object = struct {
20672067 try o.builder.metadataString(name),
20682068 file,
20692069 scope,
2070 owner_decl.src_line + 1, // Line
2070 owner_decl.typeSrcLine(mod) + 1, // Line
20712071 try o.lowerDebugType(int_ty),
20722072 ty.abiSize(mod) * 8,
20732073 (ty.abiAlignment(mod).toByteUnits() orelse 0) * 8,
......@@ -2237,7 +2237,7 @@ pub const Object = struct {
22372237 try o.builder.metadataString(name),
22382238 try o.getDebugFile(mod.namespacePtr(owner_decl.src_namespace).file_scope),
22392239 try o.namespaceToDebugScope(owner_decl.src_namespace),
2240 owner_decl.src_line + 1, // Line
2240 owner_decl.typeSrcLine(mod) + 1, // Line
22412241 .none, // Underlying type
22422242 0, // Size
22432243 0, // Align
......@@ -2867,7 +2867,7 @@ pub const Object = struct {
28672867 try o.builder.metadataString(decl.name.toSlice(&mod.intern_pool)), // TODO use fully qualified name
28682868 try o.getDebugFile(mod.namespacePtr(decl.src_namespace).file_scope),
28692869 try o.namespaceToDebugScope(decl.src_namespace),
2870 decl.src_line + 1,
2870 decl.typeSrcLine(mod) + 1,
28712871 .none,
28722872 0,
28732873 0,
......@@ -4762,7 +4762,7 @@ pub const DeclGen = struct {
47624762 else => try o.lowerValue(init_val),
47634763 }, &o.builder);
47644764
4765 const line_number = decl.src_line + 1;
4765 const line_number = decl.navSrcLine(zcu) + 1;
47664766 const is_internal_linkage = !o.module.decl_exports.contains(decl_index);
47674767
47684768 const namespace = zcu.namespacePtr(decl.src_namespace);
......@@ -5188,7 +5188,7 @@ pub const FuncGen = struct {
51885188
51895189 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;
51925192 self.inlined = self.wip.debug_location;
51935193
51945194 const fqn = try decl.fullyQualifiedName(zcu);
......@@ -5217,7 +5217,7 @@ pub const FuncGen = struct {
52175217 o.debug_compile_unit,
52185218 );
52195219
5220 self.base_line = decl.src_line;
5220 self.base_line = decl.navSrcLine(zcu);
52215221 const inlined_at_location = try self.wip.debug_location.toMetadata(&o.builder);
52225222 self.wip.debug_location = .{
52235223 .location = .{
......@@ -8857,7 +8857,7 @@ pub const FuncGen = struct {
88578857 const src_index = self.air.instructions.items(.data)[@intFromEnum(inst)].arg.src_index;
88588858 const func_index = self.dg.decl.getOwnedFunctionIndex();
88598859 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;
88618861 const lbrace_col = func.lbrace_column + 1;
88628862
88638863 const debug_parameter = try o.builder.debugParameter(
src/codegen/spirv.zig+2-2
......@@ -212,7 +212,7 @@ pub const Object = struct {
212212 false => .{ .unstructured = .{} },
213213 },
214214 .current_block_label = undefined,
215 .base_line = decl.src_line,
215 .base_line = decl.navSrcLine(mod),
216216 };
217217 defer decl_gen.deinit();
218218
......@@ -6345,7 +6345,7 @@ const DeclGen = struct {
63456345 const decl = mod.funcOwnerDeclPtr(extra.data.func);
63466346 const old_base_line = self.base_line;
63476347 defer self.base_line = old_base_line;
6348 self.base_line = decl.src_line;
6348 self.base_line = decl.navSrcLine(mod);
63496349 return self.lowerBlock(inst, @ptrCast(self.air.extra[extra.end..][0..extra.data.body_len]));
63506350 }
63516351
src/link/Dwarf.zig+6-6
......@@ -948,8 +948,8 @@ pub const DeclState = struct {
948948 leb128.writeUnsignedFixed(4, self.dbg_line.addManyAsArrayAssumeCapacity(4), new_file);
949949 }
950950
951 const old_src_line: i33 = self.mod.declPtr(old_func_info.owner_decl).src_line;
952 const new_src_line: i33 = self.mod.declPtr(new_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).navSrcLine(self.mod);
953953 if (new_src_line != old_src_line) {
954954 self.dbg_line.appendAssumeCapacity(DW.LNS.advance_line);
955955 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
11161116 decl_state.dbg_line_func = decl.val.toIntern();
11171117 const func = decl.val.getFunction(mod).?;
11181118 log.debug("decl.src_line={d}, func.lbrace_line={d}, func.rbrace_line={d}", .{
1119 decl.src_line,
1119 decl.navSrcLine(mod),
11201120 func.lbrace_line,
11211121 func.rbrace_line,
11221122 });
1123 const line: u28 = @intCast(decl.src_line + func.lbrace_line);
1123 const line: u28 = @intCast(decl.navSrcLine(mod) + func.lbrace_line);
11241124
11251125 dbg_line_buffer.appendSliceAssumeCapacity(&.{
11261126 DW.LNS.extended_op,
......@@ -1702,11 +1702,11 @@ pub fn updateDeclLineNumber(self: *Dwarf, mod: *Module, decl_index: InternPool.D
17021702 const decl = mod.declPtr(decl_index);
17031703 const func = decl.val.getFunction(mod).?;
17041704 log.debug("decl.src_line={d}, func.lbrace_line={d}, func.rbrace_line={d}", .{
1705 decl.src_line,
1705 decl.navSrcLine(mod),
17061706 func.lbrace_line,
17071707 func.rbrace_line,
17081708 });
1709 const line: u28 = @intCast(decl.src_line + func.lbrace_line);
1709 const line: u28 = @intCast(decl.navSrcLine(mod) + func.lbrace_line);
17101710 var data: [4]u8 = undefined;
17111711 leb128.writeUnsignedFixed(4, &data, line);
17121712
src/print_zir.zig+2-2
......@@ -583,7 +583,7 @@ const Writer = struct {
583583
584584 .reify => {
585585 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});
587587 try self.writeInstRef(stream, inst_data.operand);
588588 try stream.writeAll(")) ");
589589 const prev_parent_decl_node = self.parent_decl_node;
......@@ -2749,7 +2749,7 @@ const Writer = struct {
27492749 extra.data.src_hash_3,
27502750 };
27512751 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
27542754 {
27552755 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");
1111const Sema = @import("Sema.zig");
1212const InternPool = @import("InternPool.zig");
1313const Alignment = InternPool.Alignment;
14const Zir = std.zig.Zir;
1415
1516/// Both types and values are canonically represented by a single 32-bit integer
1617/// which is an index into an `InternPool` data structure.
......@@ -3340,7 +3341,7 @@ pub const Type = struct {
33403341 .struct_type, .union_type, .opaque_type, .enum_type => |info| switch (info) {
33413342 .declared => |d| d.zir_index,
33423343 .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 reifying
3344 .generated_tag => |gt| ip.loadUnionType(gt.union_type).zir_index,
33443345 .empty_struct => return null,
33453346 },
33463347 else => return null,
......@@ -3440,6 +3441,33 @@ pub const Type = struct {
34403441 };
34413442 }
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
34433471 /// Given a namespace type, returns its list of caotured values.
34443472 pub fn getCaptures(ty: Type, zcu: *const Zcu) InternPool.CaptureValue.Slice {
34453473 const ip = &zcu.intern_pool;