aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2022-03-29 20:08:28 -0700
committerAndrew Kelley <andrew@ziglang.org>2022-03-29 20:08:28 -0700
commite39c86399da565d3855d54b242bf7b5940e3924d (patch)
treeb67c392b14d2adc64e15c890ed978daf05fb9ceb /src
parentb59428e9f78b1f9f265c0ffdba79b128d77644d2 (diff)
downloadzig-e39c86399da565d3855d54b242bf7b5940e3924d.tar.gz
zig-e39c86399da565d3855d54b242bf7b5940e3924d.zip
link: half-hearted bug fix for decl_state field
The init()/commit() API of this field leads to the type of bug that this commit fixes by defering an uncomfortably complex expression. I didn't bother doing the equivalent fix in link/MachO.zig because instead I think the `decl_state` field should be entirely removed from Dwarf.
Diffstat (limited to 'src')
-rw-r--r--src/link/Dwarf.zig2
-rw-r--r--src/link/Elf.zig6
2 files changed, 7 insertions, 1 deletions
diff --git a/src/link/Dwarf.zig b/src/link/Dwarf.zig
index 83222090c0..7840b8d6a7 100644
--- a/src/link/Dwarf.zig
+++ b/src/link/Dwarf.zig
@@ -91,7 +91,7 @@ pub const DeclState = struct {
};
}
- fn deinit(self: *DeclState, gpa: Allocator) void {
+ pub fn deinit(self: *DeclState, gpa: Allocator) void {
self.dbg_line.deinit();
self.dbg_info.deinit();
self.abbrev_type_arena.deinit();
diff --git a/src/link/Elf.zig b/src/link/Elf.zig
index 771a57b26e..ece30c4347 100644
--- a/src/link/Elf.zig
+++ b/src/link/Elf.zig
@@ -2342,6 +2342,12 @@ pub fn updateFunc(self: *Elf, module: *Module, func: *Module.Fn, air: Air, liven
if (self.dwarf) |*dw| {
try dw.initDeclState(decl);
}
+ defer if (self.dwarf) |*dw| {
+ if (dw.decl_state) |*ds| {
+ ds.deinit(dw.allocator);
+ dw.decl_state = null;
+ }
+ };
const res = if (self.dwarf) |*dw|
try codegen.generateFunction(&self.base, decl.srcLoc(), func, air, liveness, &code_buffer, .{