aboutsummaryrefslogtreecommitdiff
path: root/src/link
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2024-01-11 19:09:41 +0100
committerJakub Konka <kubkon@jakubkonka.com>2024-01-24 12:34:39 +0100
commitb0327ff233faca0dd11e50c9ba7fc41f434a4d82 (patch)
tree46d358eca4b86b5c401cc458e3b7224f11e4a006 /src/link
parent21e3bb38afad7a2cc4e84910d7630e4ee3435a85 (diff)
downloadzig-b0327ff233faca0dd11e50c9ba7fc41f434a4d82.tar.gz
zig-b0327ff233faca0dd11e50c9ba7fc41f434a4d82.zip
macho: handle dead stripping of atoms
Diffstat (limited to 'src/link')
-rw-r--r--src/link/MachO.zig4
-rw-r--r--src/link/MachO/dead_strip.zig6
2 files changed, 7 insertions, 3 deletions
diff --git a/src/link/MachO.zig b/src/link/MachO.zig
index d083471fee..f9e1c2a953 100644
--- a/src/link/MachO.zig
+++ b/src/link/MachO.zig
@@ -501,6 +501,10 @@ pub fn flushModule(self: *MachO, arena: Allocator, prog_node: *std.Progress.Node
try self.createObjcSections();
try self.claimUnresolved();
+ if (self.base.gc_sections) {
+ try dead_strip.gcAtoms(self);
+ }
+
state_log.debug("{}", .{self.dumpState()});
@panic("TODO");
diff --git a/src/link/MachO/dead_strip.zig b/src/link/MachO/dead_strip.zig
index 8097d5f710..7356e65a60 100644
--- a/src/link/MachO/dead_strip.zig
+++ b/src/link/MachO/dead_strip.zig
@@ -1,10 +1,10 @@
pub fn gcAtoms(macho_file: *MachO) !void {
- const gpa = macho_file.base.allocator;
+ const gpa = macho_file.base.comp.gpa;
var objects = try std.ArrayList(File.Index).initCapacity(gpa, macho_file.objects.items.len + 1);
defer objects.deinit();
for (macho_file.objects.items) |index| objects.appendAssumeCapacity(index);
- if (macho_file.internal_object_index) |index| objects.appendAssumeCapacity(index);
+ if (macho_file.internal_object) |index| objects.appendAssumeCapacity(index);
var roots = std.ArrayList(*Atom).init(gpa);
defer roots.deinit();
@@ -21,7 +21,7 @@ fn collectRoots(roots: *std.ArrayList(*Atom), objects: []const File.Index, macho
const sym = macho_file.getSymbol(sym_index);
const file = sym.getFile(macho_file) orelse continue;
if (file.getIndex() != index) continue;
- if (sym.flags.no_dead_strip or (macho_file.options.dylib and sym.visibility == .global))
+ if (sym.flags.no_dead_strip or (macho_file.base.isDynLib() and sym.visibility == .global))
try markSymbol(sym, roots, macho_file);
}