diff options
| author | Jacob Young <jacobly0@users.noreply.github.com> | 2024-07-09 19:50:45 -0400 |
|---|---|---|
| committer | Jacob Young <jacobly0@users.noreply.github.com> | 2024-07-10 11:10:49 -0400 |
| commit | 9cf42b103601c26294739143f6aeb4b93e1858d8 (patch) | |
| tree | 7a8b11d928a318df7f8466172717be7b5bdf92ad /src/InternPool.zig | |
| parent | 667b4f9054cd0d4c8e9912bddc18049d09107678 (diff) | |
| download | zig-9cf42b103601c26294739143f6aeb4b93e1858d8.tar.gz zig-9cf42b103601c26294739143f6aeb4b93e1858d8.zip | |
InternPool: fix race on `FuncInstance.branch_quota`
Diffstat (limited to 'src/InternPool.zig')
| -rw-r--r-- | src/InternPool.zig | 27 |
1 files changed, 16 insertions, 11 deletions
diff --git a/src/InternPool.zig b/src/InternPool.zig index f1b7cbd7a5..f862fedef9 100644 --- a/src/InternPool.zig +++ b/src/InternPool.zig @@ -5914,27 +5914,32 @@ fn extraFuncDecl(tid: Zcu.PerThread.Id, extra: Local.Extra, extra_index: u32) Ke } fn extraFuncInstance(ip: *const InternPool, tid: Zcu.PerThread.Id, extra: Local.Extra, extra_index: u32) Key.Func { - const P = Tag.FuncInstance; - const fi = extraDataTrail(extra, P, extra_index); - const func_decl = ip.funcDeclInfo(fi.data.generic_owner); + const extra_items = extra.view().items(.@"0"); + const analysis_extra_index = extra_index + std.meta.fieldIndex(Tag.FuncInstance, "analysis").?; + const analysis: FuncAnalysis = @bitCast(@atomicLoad(u32, &extra_items[analysis_extra_index], .monotonic)); + const owner_decl: DeclIndex = @enumFromInt(extra_items[extra_index + std.meta.fieldIndex(Tag.FuncInstance, "owner_decl").?]); + const ty: Index = @enumFromInt(extra_items[extra_index + std.meta.fieldIndex(Tag.FuncInstance, "ty").?]); + const generic_owner: Index = @enumFromInt(extra_items[extra_index + std.meta.fieldIndex(Tag.FuncInstance, "generic_owner").?]); + const func_decl = ip.funcDeclInfo(generic_owner); + const end_extra_index = extra_index + @as(u32, @typeInfo(Tag.FuncInstance).Struct.fields.len); return .{ .tid = tid, - .ty = fi.data.ty, - .uncoerced_ty = fi.data.ty, - .analysis_extra_index = extra_index + std.meta.fieldIndex(P, "analysis").?, + .ty = ty, + .uncoerced_ty = ty, + .analysis_extra_index = analysis_extra_index, .zir_body_inst_extra_index = func_decl.zir_body_inst_extra_index, - .resolved_error_set_extra_index = if (fi.data.analysis.inferred_error_set) fi.end else 0, - .branch_quota_extra_index = extra_index + std.meta.fieldIndex(P, "branch_quota").?, - .owner_decl = fi.data.owner_decl, + .resolved_error_set_extra_index = if (analysis.inferred_error_set) end_extra_index else 0, + .branch_quota_extra_index = extra_index + std.meta.fieldIndex(Tag.FuncInstance, "branch_quota").?, + .owner_decl = owner_decl, .zir_body_inst = func_decl.zir_body_inst, .lbrace_line = func_decl.lbrace_line, .rbrace_line = func_decl.rbrace_line, .lbrace_column = func_decl.lbrace_column, .rbrace_column = func_decl.rbrace_column, - .generic_owner = fi.data.generic_owner, + .generic_owner = generic_owner, .comptime_args = .{ .tid = tid, - .start = fi.end + @intFromBool(fi.data.analysis.inferred_error_set), + .start = end_extra_index + @intFromBool(analysis.inferred_error_set), .len = ip.funcTypeParamsLen(func_decl.ty), }, }; |
