authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-01-11 19:09:41+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-01-24 12:34:39+01:00
logb0327ff233faca0dd11e50c9ba7fc41f434a4d82
tree46d358eca4b86b5c401cc458e3b7224f11e4a006
parent21e3bb38afad7a2cc4e84910d7630e4ee3435a85

macho: handle dead stripping of atoms


2 files changed, 7 insertions(+), 3 deletions(-)

src/link/MachO.zig+4
...@@ -501,6 +501,10 @@ pub fn flushModule(self: *MachO, arena: Allocator, prog_node: *std.Progress.Node...@@ -501,6 +501,10 @@ pub fn flushModule(self: *MachO, arena: Allocator, prog_node: *std.Progress.Node
501 try self.createObjcSections();501 try self.createObjcSections();
502 try self.claimUnresolved();502 try self.claimUnresolved();
503503
504 if (self.base.gc_sections) {
505 try dead_strip.gcAtoms(self);
506 }
507
504 state_log.debug("{}", .{self.dumpState()});508 state_log.debug("{}", .{self.dumpState()});
505509
506 @panic("TODO");510 @panic("TODO");
src/link/MachO/dead_strip.zig+3-3
...@@ -1,10 +1,10 @@...@@ -1,10 +1,10 @@
1pub fn gcAtoms(macho_file: *MachO) !void {1pub fn gcAtoms(macho_file: *MachO) !void {
2 const gpa = macho_file.base.allocator;2 const gpa = macho_file.base.comp.gpa;
33
4 var objects = try std.ArrayList(File.Index).initCapacity(gpa, macho_file.objects.items.len + 1);4 var objects = try std.ArrayList(File.Index).initCapacity(gpa, macho_file.objects.items.len + 1);
5 defer objects.deinit();5 defer objects.deinit();
6 for (macho_file.objects.items) |index| objects.appendAssumeCapacity(index);6 for (macho_file.objects.items) |index| objects.appendAssumeCapacity(index);
7 if (macho_file.internal_object_index) |index| objects.appendAssumeCapacity(index);7 if (macho_file.internal_object) |index| objects.appendAssumeCapacity(index);
88
9 var roots = std.ArrayList(*Atom).init(gpa);9 var roots = std.ArrayList(*Atom).init(gpa);
10 defer roots.deinit();10 defer roots.deinit();
...@@ -21,7 +21,7 @@ fn collectRoots(roots: *std.ArrayList(*Atom), objects: []const File.Index, macho...@@ -21,7 +21,7 @@ fn collectRoots(roots: *std.ArrayList(*Atom), objects: []const File.Index, macho
21 const sym = macho_file.getSymbol(sym_index);21 const sym = macho_file.getSymbol(sym_index);
22 const file = sym.getFile(macho_file) orelse continue;22 const file = sym.getFile(macho_file) orelse continue;
23 if (file.getIndex() != index) continue;23 if (file.getIndex() != index) continue;
24 if (sym.flags.no_dead_strip or (macho_file.options.dylib and sym.visibility == .global))24 if (sym.flags.no_dead_strip or (macho_file.base.isDynLib() and sym.visibility == .global))
25 try markSymbol(sym, roots, macho_file);25 try markSymbol(sym, roots, macho_file);
26 }26 }
2727