aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/codegen.zig')
-rw-r--r--src/codegen.zig15
1 files changed, 14 insertions, 1 deletions
diff --git a/src/codegen.zig b/src/codegen.zig
index 9de13ee657..e385158ba6 100644
--- a/src/codegen.zig
+++ b/src/codegen.zig
@@ -464,7 +464,7 @@ fn lowerDeclRef(
}
if (decl.analysis != .complete) return error.AnalysisFail;
- decl.alive = true;
+ markDeclAlive(decl);
// TODO handle the dependency of this symbol on the decl's vaddr.
// If the decl changes vaddr, then this symbol needs to get regenerated.
const vaddr = bin_file.getDeclVAddr(decl);
@@ -478,3 +478,16 @@ fn lowerDeclRef(
return Result{ .appended = {} };
}
+
+fn markDeclAlive(decl: *Module.Decl) void {
+ if (decl.alive) return;
+ decl.alive = true;
+
+ // 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 markDeclAlive(pointee);
+ }
+}