Commit 0f80652efb

mlugg <mlugg@mlugg.co.uk>
2023-06-02 10:53:29
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.
1 parent 7a59cd2
Changed files (1)
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
         ));
     }