authorgravatar for luuk@degram.devLuuk de Gram <luuk@degram.dev> 2022-05-26 20:33:00+02:00
committergravatar for luuk@degram.devLuuk de Gram <luuk@degram.dev> 2022-06-24 08:12:17+02:00
logc9f929a18b705451e9c2c81f01019575de8bf5fd
tree298c12bee26be29cd3c425bdf7fd0e2a35f4abc1
parent16daf3f3bcb27b2e0b0f45ee48c69824a4804981

fix memory leaks


4 files changed, 17 insertions(+), 9 deletions(-)

src/link/Wasm.zig+13-6
...@@ -538,6 +538,7 @@ fn resolveSymbolsInArchives(self: *Wasm) !void {...@@ -538,6 +538,7 @@ fn resolveSymbolsInArchives(self: *Wasm) !void {
538 continue;538 continue;
539 };539 };
540540
541 log.debug("Detected symbol '{s}' in archive '{s}', parsing objects..", .{ sym_name, archive.name });
541 // Symbol is found in unparsed object file within current archive.542 // Symbol is found in unparsed object file within current archive.
542 // Parse object and and resolve symbols again before we check remaining543 // Parse object and and resolve symbols again before we check remaining
543 // undefined symbols.544 // undefined symbols.
...@@ -581,11 +582,17 @@ pub fn deinit(self: *Wasm) void {...@@ -581,11 +582,17 @@ pub fn deinit(self: *Wasm) void {
581 object.deinit(gpa);582 object.deinit(gpa);
582 }583 }
583584
585 for (self.archives.items) |*archive| {
586 archive.file.close();
587 archive.deinit(gpa);
588 }
589
584 self.decls.deinit(gpa);590 self.decls.deinit(gpa);
585 self.symbols.deinit(gpa);591 self.symbols.deinit(gpa);
586 self.symbols_free_list.deinit(gpa);592 self.symbols_free_list.deinit(gpa);
587 self.globals.deinit(gpa);593 self.globals.deinit(gpa);
588 self.resolved_symbols.deinit(gpa);594 self.resolved_symbols.deinit(gpa);
595 self.undefs.deinit(gpa);
589 self.discarded.deinit(gpa);596 self.discarded.deinit(gpa);
590 self.symbol_atom.deinit(gpa);597 self.symbol_atom.deinit(gpa);
591 self.export_names.deinit(gpa);598 self.export_names.deinit(gpa);
...@@ -599,6 +606,7 @@ pub fn deinit(self: *Wasm) void {...@@ -599,6 +606,7 @@ pub fn deinit(self: *Wasm) void {
599 self.data_segments.deinit(gpa);606 self.data_segments.deinit(gpa);
600 self.segment_info.deinit(gpa);607 self.segment_info.deinit(gpa);
601 self.objects.deinit(gpa);608 self.objects.deinit(gpa);
609 self.archives.deinit(gpa);
602610
603 // free output sections611 // free output sections
604 self.imports.deinit(gpa);612 self.imports.deinit(gpa);
...@@ -1838,10 +1846,10 @@ pub fn flushModule(self: *Wasm, comp: *Compilation, prog_node: *std.Progress.Nod...@@ -1838,10 +1846,10 @@ pub fn flushModule(self: *Wasm, comp: *Compilation, prog_node: *std.Progress.Nod
18381846
1839 try self.parseInputFiles(positionals.items);1847 try self.parseInputFiles(positionals.items);
18401848
1841 var object_index: u16 = 0;1849 for (self.objects.items) |_, object_index| {
1842 while (object_index < self.objects.items.len) : (object_index += 1) {1850 try self.resolveSymbolsInObject(@intCast(u16, object_index));
1843 try self.resolveSymbolsInObject(object_index);
1844 }1851 }
1852
1845 try self.resolveSymbolsInArchives();1853 try self.resolveSymbolsInArchives();
18461854
1847 // When we finish/error we reset the state of the linker1855 // When we finish/error we reset the state of the linker
...@@ -1867,9 +1875,8 @@ pub fn flushModule(self: *Wasm, comp: *Compilation, prog_node: *std.Progress.Nod...@@ -1867,9 +1875,8 @@ pub fn flushModule(self: *Wasm, comp: *Compilation, prog_node: *std.Progress.Nod
1867 }1875 }
1868 }1876 }
18691877
1870 while (object_index > 0) {1878 for (self.objects.items) |*object, object_index| {
1871 object_index -= 1;1879 try object.parseIntoAtoms(self.base.allocator, @intCast(u16, object_index), self);
1872 try self.objects.items[object_index].parseIntoAtoms(self.base.allocator, object_index, self);
1873 }1880 }
18741881
1875 if (self.dwarf) |*dwarf| {1882 if (self.dwarf) |*dwarf| {
src/link/Wasm/Archive.zig-1
...@@ -95,7 +95,6 @@ pub fn deinit(self: *Archive, allocator: Allocator) void {...@@ -95,7 +95,6 @@ pub fn deinit(self: *Archive, allocator: Allocator) void {
95 value.deinit(allocator);95 value.deinit(allocator);
96 }96 }
97 self.toc.deinit(allocator);97 self.toc.deinit(allocator);
98 allocator.free(self.name);
99}98}
10099
101pub fn parse(self: *Archive, allocator: Allocator) !void {100pub fn parse(self: *Archive, allocator: Allocator) !void {
src/link/Wasm/Atom.zig+1-1
...@@ -75,7 +75,7 @@ pub fn clear(self: *Atom) void {...@@ -75,7 +75,7 @@ pub fn clear(self: *Atom) void {
75pub fn format(self: Atom, comptime fmt: []const u8, options: std.fmt.FormatOptions, writer: anytype) !void {75pub fn format(self: Atom, comptime fmt: []const u8, options: std.fmt.FormatOptions, writer: anytype) !void {
76 _ = fmt;76 _ = fmt;
77 _ = options;77 _ = options;
78 writer.print("Atom{{ .sym_index = {d}, .alignment = {d}, .size = {d}, .offset = 0x{x:0>8} }}", .{78 try writer.print("Atom{{ .sym_index = {d}, .alignment = {d}, .size = {d}, .offset = 0x{x:0>8} }}", .{
79 self.sym_index,79 self.sym_index,
80 self.alignment,80 self.alignment,
81 self.size,81 self.size,
src/link/Wasm/Object.zig+3-1
...@@ -813,7 +813,9 @@ pub fn parseIntoAtoms(self: *Object, gpa: Allocator, object_index: u16, wasm_bin...@@ -813,7 +813,9 @@ pub fn parseIntoAtoms(self: *Object, gpa: Allocator, object_index: u16, wasm_bin
813 index: u32,813 index: u32,
814 };814 };
815 var symbol_for_segment = std.AutoArrayHashMap(Key, std.ArrayList(u32)).init(gpa);815 var symbol_for_segment = std.AutoArrayHashMap(Key, std.ArrayList(u32)).init(gpa);
816 defer symbol_for_segment.deinit();816 defer for (symbol_for_segment.values()) |*list| {
817 list.deinit();
818 } else symbol_for_segment.deinit();
817819
818 for (self.symtable) |symbol, symbol_index| {820 for (self.symtable) |symbol, symbol_index| {
819 switch (symbol.tag) {821 switch (symbol.tag) {