From 0f80652efb170aa4158e378dbb493da717c9bd17 Mon Sep 17 00:00:00 2001 From: mlugg Date: Fri, 2 Jun 2023 09:53:29 +0100 Subject: Sema: remove leftover references to value_arena Notably, there was a bug where the fields of reified structs and unions were allocated into an arena which was leaked. These are now in the Module.tmp_hack_arena. --- src/Sema.zig | 52 +++++++++++----------------------------------------- 1 file changed, 11 insertions(+), 41 deletions(-) (limited to 'src') diff --git a/src/Sema.zig b/src/Sema.zig index 8c657b3f52..81befbf49e 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -702,24 +702,15 @@ pub const Block = struct { pub fn startAnonDecl(block: *Block) !WipAnonDecl { return WipAnonDecl{ .block = block, - .new_decl_arena = std.heap.ArenaAllocator.init(block.sema.gpa), .finished = false, }; } pub const WipAnonDecl = struct { block: *Block, - new_decl_arena: std.heap.ArenaAllocator, finished: bool, - pub fn arena(wad: *WipAnonDecl) Allocator { - return wad.new_decl_arena.allocator(); - } - pub fn deinit(wad: *WipAnonDecl) void { - if (!wad.finished) { - wad.new_decl_arena.deinit(); - } wad.* = undefined; } @@ -2774,9 +2765,6 @@ fn zirStructDecl( break :blk LazySrcLoc.nodeOffset(node_offset); } else sema.src; - var new_decl_arena = std.heap.ArenaAllocator.init(gpa); - errdefer new_decl_arena.deinit(); - // Because these three things each reference each other, `undefined` // placeholders are used before being set after the struct type gains an // InternPool index. @@ -3230,9 +3218,6 @@ fn zirUnionDecl( break :blk decls_len; } else 0; - var new_decl_arena = std.heap.ArenaAllocator.init(gpa); - errdefer new_decl_arena.deinit(); - // Because these three things each reference each other, `undefined` // placeholders are used before being set after the union type gains an // InternPool index. @@ -3297,7 +3282,6 @@ fn zirOpaqueDecl( defer tracy.end(); const mod = sema.mod; - const gpa = sema.gpa; const small = @bitCast(Zir.Inst.OpaqueDecl.Small, extended.small); var extra_index: usize = extended.operand; @@ -3313,9 +3297,6 @@ fn zirOpaqueDecl( break :blk decls_len; } else 0; - var new_decl_arena = std.heap.ArenaAllocator.init(gpa); - errdefer new_decl_arena.deinit(); - // Because these three things each reference each other, `undefined` // placeholders are used in two places before being set after the opaque // type gains an InternPool index. @@ -3691,7 +3672,7 @@ fn zirMakePtrConst(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileErro defer anon_decl.deinit(); return sema.analyzeDeclRef(try anon_decl.finish( elem_ty, - try store_val.copy(anon_decl.arena()), + store_val, ptr_info.@"align", )); } @@ -3937,7 +3918,7 @@ fn zirResolveInferredAlloc(sema: *Sema, block: *Block, inst: Zir.Inst.Index) Com defer anon_decl.deinit(); const new_decl_index = try anon_decl.finish( final_elem_ty, - try store_val.copy(anon_decl.arena()), + store_val, ia1.alignment.toByteUnits(0), ); break :d new_decl_index; @@ -5168,7 +5149,7 @@ fn storeToInferredAllocComptime( defer anon_decl.deinit(); iac.decl_index = try anon_decl.finish( operand_ty, - try operand_val.copy(anon_decl.arena()), + operand_val, iac.alignment.toByteUnits(0), ); return; @@ -5860,7 +5841,7 @@ fn zirExportValue(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError defer anon_decl.deinit(); break :blk try anon_decl.finish( operand.ty, - try operand.val.copy(anon_decl.arena()), + operand.val, 0, ); }; @@ -15895,7 +15876,7 @@ fn zirBuiltinSrc( var anon_decl = try block.startAnonDecl(); defer anon_decl.deinit(); // The compiler must not call realpath anywhere. - const name = try fn_owner_decl.getFileScope(mod).fullPathZ(anon_decl.arena()); + const name = try fn_owner_decl.getFileScope(mod).fullPathZ(sema.arena); const new_decl_ty = try mod.arrayType(.{ .len = name.len, .child = .u8_type, @@ -18792,7 +18773,7 @@ fn addConstantMaybeRef( defer anon_decl.deinit(); const decl = try anon_decl.finish( ty, - try val.copy(anon_decl.arena()), + val, 0, // default alignment ); return sema.analyzeDeclRef(decl); @@ -19515,9 +19496,6 @@ fn zirReify( return sema.fail(block, src, "reified opaque must have no decls", .{}); } - var new_decl_arena = std.heap.ArenaAllocator.init(gpa); - errdefer new_decl_arena.deinit(); - // Because these three things each reference each other, // `undefined` placeholders are used in two places before being set // after the opaque type gains an InternPool index. @@ -19572,10 +19550,6 @@ fn zirReify( } const layout = mod.toEnum(std.builtin.Type.ContainerLayout, layout_val); - var new_decl_arena = std.heap.ArenaAllocator.init(gpa); - errdefer new_decl_arena.deinit(); - const new_decl_arena_allocator = new_decl_arena.allocator(); - // Because these three things each reference each other, `undefined` // placeholders are used before being set after the union type gains an // InternPool index. @@ -19645,7 +19619,7 @@ fn zirReify( } // Fields - try union_obj.fields.ensureTotalCapacity(new_decl_arena_allocator, fields_len); + try union_obj.fields.ensureTotalCapacity(mod.tmp_hack_arena.allocator(), fields_len); for (0..fields_len) |i| { const elem_val = try fields_val.elemValue(mod, i); @@ -19873,10 +19847,6 @@ fn reifyStruct( const gpa = sema.gpa; const ip = &mod.intern_pool; - var new_decl_arena = std.heap.ArenaAllocator.init(gpa); - errdefer new_decl_arena.deinit(); - const new_decl_arena_allocator = new_decl_arena.allocator(); - // Because these three things each reference each other, `undefined` // placeholders are used before being set after the struct type gains an // InternPool index. @@ -19921,7 +19891,7 @@ fn reifyStruct( // Fields const fields_len = try sema.usizeCast(block, src, fields_val.sliceLen(mod)); - try struct_obj.fields.ensureTotalCapacity(new_decl_arena_allocator, fields_len); + try struct_obj.fields.ensureTotalCapacity(mod.tmp_hack_arena.allocator(), fields_len); var i: usize = 0; while (i < fields_len) : (i += 1) { const elem_val = try fields_val.elemValue(mod, i); @@ -20209,7 +20179,7 @@ fn zirTypeName(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai var anon_decl = try block.startAnonDecl(); defer anon_decl.deinit(); - const bytes = try ty.nameAllocArena(anon_decl.arena(), mod); + const bytes = try ty.nameAllocArena(sema.arena, mod); const decl_ty = try mod.arrayType(.{ .len = bytes.len, @@ -29740,7 +29710,7 @@ fn refValue(sema: *Sema, block: *Block, ty: Type, val: Value) !Value { defer anon_decl.deinit(); const decl = try anon_decl.finish( ty, - try val.copy(anon_decl.arena()), + val, 0, // default alignment ); try sema.maybeQueueFuncBodyAnalysis(decl); @@ -29824,7 +29794,7 @@ fn analyzeRef( defer anon_decl.deinit(); return sema.analyzeDeclRef(try anon_decl.finish( operand_ty, - try val.copy(anon_decl.arena()), + val, 0, // default alignment )); } -- cgit v1.2.3