From 8ab4a003c8f22a3fd8f84bdb2fc27d8c20d3bf2f Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Thu, 29 Apr 2021 20:34:33 -0700 Subject: stage2: properly free Decl name Two problems solved: * The Decl name may be allocated with gpa or it may be a reference to the ZIR string table. * The main update() function was freeing the ZIR when we still had Decl objects referencing it. --- src/Compilation.zig | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'src/Compilation.zig') diff --git a/src/Compilation.zig b/src/Compilation.zig index e4de593fd0..82ede40a9d 100644 --- a/src/Compilation.zig +++ b/src/Compilation.zig @@ -1646,10 +1646,15 @@ pub fn update(self: *Compilation) !void { // If there are any errors, we anticipate the source files being loaded // to report error messages. Otherwise we unload all source files to save memory. + // The ZIR needs to stay loaded in memory because (1) Decl objects contain references + // to it, and (2) generic instantiations, comptime calls, inline calls will need + // to reference the ZIR. if (self.totalErrorCount() == 0 and !self.keep_source_files_loaded) { if (self.bin_file.options.module) |module| { for (module.import_table.items()) |entry| { - entry.value.unload(self.gpa); + const file = entry.value; + file.unloadTree(self.gpa); + file.unloadSource(self.gpa); } } } -- cgit v1.2.3