diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2022-01-15 00:17:25 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2022-01-15 00:17:25 -0700 |
| commit | a5c7742ba6fc793608b8bb7ba058e33eccd9cfec (patch) | |
| tree | 29bf43a0bb915e35244d457514885baca2a5916b /src/codegen/llvm.zig | |
| parent | 41f3799bf0cfc8241f458094781ba45967e2576e (diff) | |
| download | zig-a5c7742ba6fc793608b8bb7ba058e33eccd9cfec.tar.gz zig-a5c7742ba6fc793608b8bb7ba058e33eccd9cfec.zip | |
stage2: fix Decl garbage collection not marking enough
It is the job of codegen backends to mark Decls that are referenced as
alive so that the frontend does not sweep them with the garbage. This
commit unifies the code between the backends with an added method on
Decl.
The implementation is more complete than before, switching on the Decl
val tag and recursing into sub-values.
As a result, two more array tests are passing.
Diffstat (limited to 'src/codegen/llvm.zig')
| -rw-r--r-- | src/codegen/llvm.zig | 26 |
1 files changed, 4 insertions, 22 deletions
diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index 7858fa76fa..d8c9589213 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -1224,7 +1224,7 @@ pub const DeclGen = struct { .decl_ref => return lowerDeclRefValue(dg, tv, tv.val.castTag(.decl_ref).?.data), .variable => { const decl = tv.val.castTag(.variable).?.data.owner_decl; - dg.markDeclAlive(decl); + decl.markAlive(); const val = try dg.resolveGlobalDecl(decl); const llvm_var_type = try dg.llvmType(tv.ty); const llvm_addrspace = dg.llvmAddressSpace(decl.@"addrspace"); @@ -1373,7 +1373,7 @@ pub const DeclGen = struct { .function => tv.val.castTag(.function).?.data.owner_decl, else => unreachable, }; - dg.markDeclAlive(fn_decl); + fn_decl.markAlive(); return dg.resolveLlvmFunction(fn_decl); }, .ErrorSet => { @@ -1681,7 +1681,7 @@ pub const DeclGen = struct { ptr_val: Value, decl: *Module.Decl, ) Error!ParentPtr { - dg.markDeclAlive(decl); + decl.markAlive(); var ptr_ty_payload: Type.Payload.ElemType = .{ .base = .{ .tag = .single_mut_pointer }, .data = decl.ty, @@ -1763,7 +1763,7 @@ pub const DeclGen = struct { return self.lowerPtrToVoid(tv.ty); } - self.markDeclAlive(decl); + decl.markAlive(); const llvm_val = if (decl.ty.zigTypeTag() == .Fn) try self.resolveLlvmFunction(decl) @@ -1774,24 +1774,6 @@ pub const DeclGen = struct { return llvm_val.constBitCast(llvm_type); } - fn markDeclAlive(dg: *DeclGen, decl: *Module.Decl) void { - if (decl.alive) return; - decl.alive = true; - - log.debug("{*} ({s}) marked alive by {*} ({s})", .{ - decl, decl.name, - dg.decl, dg.decl.name, - }); - - // This is the first time we are marking this Decl alive. We must - // therefore recurse into its value and mark any Decl it references - // as also alive, so that any Decl referenced does not get garbage collected. - - if (decl.val.pointerDecl()) |pointee| { - return dg.markDeclAlive(pointee); - } - } - fn lowerPtrToVoid(dg: *DeclGen, ptr_ty: Type) !*const llvm.Value { const target = dg.module.getTarget(); const alignment = ptr_ty.ptrAlignment(target); |
