aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLuuk de Gram <luuk@degram.dev>2022-05-26 20:33:00 +0200
committerLuuk de Gram <luuk@degram.dev>2022-06-24 08:12:17 +0200
commitc9f929a18b705451e9c2c81f01019575de8bf5fd (patch)
tree298c12bee26be29cd3c425bdf7fd0e2a35f4abc1 /src
parent16daf3f3bcb27b2e0b0f45ee48c69824a4804981 (diff)
downloadzig-c9f929a18b705451e9c2c81f01019575de8bf5fd.tar.gz
zig-c9f929a18b705451e9c2c81f01019575de8bf5fd.zip
fix memory leaks
Diffstat (limited to 'src')
-rw-r--r--src/link/Wasm.zig19
-rw-r--r--src/link/Wasm/Archive.zig1
-rw-r--r--src/link/Wasm/Atom.zig2
-rw-r--r--src/link/Wasm/Object.zig4
4 files changed, 17 insertions, 9 deletions
diff --git a/src/link/Wasm.zig b/src/link/Wasm.zig
index 74d3ab36aa..6ffba60956 100644
--- a/src/link/Wasm.zig
+++ b/src/link/Wasm.zig
@@ -538,6 +538,7 @@ fn resolveSymbolsInArchives(self: *Wasm) !void {
continue;
};
+ log.debug("Detected symbol '{s}' in archive '{s}', parsing objects..", .{ sym_name, archive.name });
// Symbol is found in unparsed object file within current archive.
// Parse object and and resolve symbols again before we check remaining
// undefined symbols.
@@ -581,11 +582,17 @@ pub fn deinit(self: *Wasm) void {
object.deinit(gpa);
}
+ for (self.archives.items) |*archive| {
+ archive.file.close();
+ archive.deinit(gpa);
+ }
+
self.decls.deinit(gpa);
self.symbols.deinit(gpa);
self.symbols_free_list.deinit(gpa);
self.globals.deinit(gpa);
self.resolved_symbols.deinit(gpa);
+ self.undefs.deinit(gpa);
self.discarded.deinit(gpa);
self.symbol_atom.deinit(gpa);
self.export_names.deinit(gpa);
@@ -599,6 +606,7 @@ pub fn deinit(self: *Wasm) void {
self.data_segments.deinit(gpa);
self.segment_info.deinit(gpa);
self.objects.deinit(gpa);
+ self.archives.deinit(gpa);
// free output sections
self.imports.deinit(gpa);
@@ -1838,10 +1846,10 @@ pub fn flushModule(self: *Wasm, comp: *Compilation, prog_node: *std.Progress.Nod
try self.parseInputFiles(positionals.items);
- var object_index: u16 = 0;
- while (object_index < self.objects.items.len) : (object_index += 1) {
- try self.resolveSymbolsInObject(object_index);
+ for (self.objects.items) |_, object_index| {
+ try self.resolveSymbolsInObject(@intCast(u16, object_index));
}
+
try self.resolveSymbolsInArchives();
// 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
}
}
- while (object_index > 0) {
- object_index -= 1;
- try self.objects.items[object_index].parseIntoAtoms(self.base.allocator, object_index, self);
+ for (self.objects.items) |*object, object_index| {
+ try object.parseIntoAtoms(self.base.allocator, @intCast(u16, object_index), self);
}
if (self.dwarf) |*dwarf| {
diff --git a/src/link/Wasm/Archive.zig b/src/link/Wasm/Archive.zig
index 816a8cd0d0..9169a7effa 100644
--- a/src/link/Wasm/Archive.zig
+++ b/src/link/Wasm/Archive.zig
@@ -95,7 +95,6 @@ pub fn deinit(self: *Archive, allocator: Allocator) void {
value.deinit(allocator);
}
self.toc.deinit(allocator);
- allocator.free(self.name);
}
pub fn parse(self: *Archive, allocator: Allocator) !void {
diff --git a/src/link/Wasm/Atom.zig b/src/link/Wasm/Atom.zig
index 588a9a3edd..d5bb4509f6 100644
--- a/src/link/Wasm/Atom.zig
+++ b/src/link/Wasm/Atom.zig
@@ -75,7 +75,7 @@ pub fn clear(self: *Atom) void {
pub fn format(self: Atom, comptime fmt: []const u8, options: std.fmt.FormatOptions, writer: anytype) !void {
_ = fmt;
_ = options;
- writer.print("Atom{{ .sym_index = {d}, .alignment = {d}, .size = {d}, .offset = 0x{x:0>8} }}", .{
+ try writer.print("Atom{{ .sym_index = {d}, .alignment = {d}, .size = {d}, .offset = 0x{x:0>8} }}", .{
self.sym_index,
self.alignment,
self.size,
diff --git a/src/link/Wasm/Object.zig b/src/link/Wasm/Object.zig
index 3a24fc6ccb..6fa451af09 100644
--- a/src/link/Wasm/Object.zig
+++ b/src/link/Wasm/Object.zig
@@ -813,7 +813,9 @@ pub fn parseIntoAtoms(self: *Object, gpa: Allocator, object_index: u16, wasm_bin
index: u32,
};
var symbol_for_segment = std.AutoArrayHashMap(Key, std.ArrayList(u32)).init(gpa);
- defer symbol_for_segment.deinit();
+ defer for (symbol_for_segment.values()) |*list| {
+ list.deinit();
+ } else symbol_for_segment.deinit();
for (self.symtable) |symbol, symbol_index| {
switch (symbol.tag) {