authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2024-07-09 19:50:45-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2024-07-10 11:10:49-04:00
log9cf42b103601c26294739143f6aeb4b93e1858d8
tree7a8b11d928a318df7f8466172717be7b5bdf92ad
parent667b4f9054cd0d4c8e9912bddc18049d09107678

InternPool: fix race on `FuncInstance.branch_quota`


1 files changed, 16 insertions(+), 11 deletions(-)

src/InternPool.zig+16-11
...@@ -5914,27 +5914,32 @@ fn extraFuncDecl(tid: Zcu.PerThread.Id, extra: Local.Extra, extra_index: u32) Ke...@@ -5914,27 +5914,32 @@ fn extraFuncDecl(tid: Zcu.PerThread.Id, extra: Local.Extra, extra_index: u32) Ke
5914}5914}
59155915
5916fn extraFuncInstance(ip: *const InternPool, tid: Zcu.PerThread.Id, extra: Local.Extra, extra_index: u32) Key.Func {5916fn extraFuncInstance(ip: *const InternPool, tid: Zcu.PerThread.Id, extra: Local.Extra, extra_index: u32) Key.Func {
5917 const P = Tag.FuncInstance;5917 const extra_items = extra.view().items(.@"0");
5918 const fi = extraDataTrail(extra, P, extra_index);5918 const analysis_extra_index = extra_index + std.meta.fieldIndex(Tag.FuncInstance, "analysis").?;
5919 const func_decl = ip.funcDeclInfo(fi.data.generic_owner);5919 const analysis: FuncAnalysis = @bitCast(@atomicLoad(u32, &extra_items[analysis_extra_index], .monotonic));
5920 const owner_decl: DeclIndex = @enumFromInt(extra_items[extra_index + std.meta.fieldIndex(Tag.FuncInstance, "owner_decl").?]);
5921 const ty: Index = @enumFromInt(extra_items[extra_index + std.meta.fieldIndex(Tag.FuncInstance, "ty").?]);
5922 const generic_owner: Index = @enumFromInt(extra_items[extra_index + std.meta.fieldIndex(Tag.FuncInstance, "generic_owner").?]);
5923 const func_decl = ip.funcDeclInfo(generic_owner);
5924 const end_extra_index = extra_index + @as(u32, @typeInfo(Tag.FuncInstance).Struct.fields.len);
5920 return .{5925 return .{
5921 .tid = tid,5926 .tid = tid,
5922 .ty = fi.data.ty,5927 .ty = ty,
5923 .uncoerced_ty = fi.data.ty,5928 .uncoerced_ty = ty,
5924 .analysis_extra_index = extra_index + std.meta.fieldIndex(P, "analysis").?,5929 .analysis_extra_index = analysis_extra_index,
5925 .zir_body_inst_extra_index = func_decl.zir_body_inst_extra_index,5930 .zir_body_inst_extra_index = func_decl.zir_body_inst_extra_index,
5926 .resolved_error_set_extra_index = if (fi.data.analysis.inferred_error_set) fi.end else 0,5931 .resolved_error_set_extra_index = if (analysis.inferred_error_set) end_extra_index else 0,
5927 .branch_quota_extra_index = extra_index + std.meta.fieldIndex(P, "branch_quota").?,5932 .branch_quota_extra_index = extra_index + std.meta.fieldIndex(Tag.FuncInstance, "branch_quota").?,
5928 .owner_decl = fi.data.owner_decl,5933 .owner_decl = owner_decl,
5929 .zir_body_inst = func_decl.zir_body_inst,5934 .zir_body_inst = func_decl.zir_body_inst,
5930 .lbrace_line = func_decl.lbrace_line,5935 .lbrace_line = func_decl.lbrace_line,
5931 .rbrace_line = func_decl.rbrace_line,5936 .rbrace_line = func_decl.rbrace_line,
5932 .lbrace_column = func_decl.lbrace_column,5937 .lbrace_column = func_decl.lbrace_column,
5933 .rbrace_column = func_decl.rbrace_column,5938 .rbrace_column = func_decl.rbrace_column,
5934 .generic_owner = fi.data.generic_owner,5939 .generic_owner = generic_owner,
5935 .comptime_args = .{5940 .comptime_args = .{
5936 .tid = tid,5941 .tid = tid,
5937 .start = fi.end + @intFromBool(fi.data.analysis.inferred_error_set),5942 .start = end_extra_index + @intFromBool(analysis.inferred_error_set),
5938 .len = ip.funcTypeParamsLen(func_decl.ty),5943 .len = ip.funcTypeParamsLen(func_decl.ty),
5939 },5944 },
5940 };5945 };