From 1b76779857cae1d8212f574a4a3059fad9419476 Mon Sep 17 00:00:00 2001 From: Jakub Konka Date: Thu, 11 Jan 2024 18:54:59 +0100 Subject: [PATCH] macho: convert tentative defs and create objc sections --- src/link/MachO.zig | 47 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/src/link/MachO.zig b/src/link/MachO.zig index 9514d6d71f..b07d30bb11 100644 --- a/src/link/MachO.zig +++ b/src/link/MachO.zig @@ -500,6 +500,9 @@ pub fn flushModule(self: *MachO, arena: Allocator, prog_node: *std.Progress.Node try self.resolveSymbols(); try self.resolveSyntheticSymbols(); + try self.convertTentativeDefinitions(); + try self.createObjcSections(); + state_log.debug("{}", .{self.dumpState()}); @panic("TODO"); @@ -1263,6 +1266,50 @@ fn resolveSyntheticSymbols(self: *MachO) !void { } } +fn convertTentativeDefinitions(self: *MachO) !void { + for (self.objects.items) |index| { + try self.getFile(index).?.object.convertTentativeDefinitions(self); + } +} + +fn createObjcSections(self: *MachO) !void { + const gpa = self.base.comp.gpa; + var objc_msgsend_syms = std.AutoArrayHashMap(Symbol.Index, void).init(gpa); + defer objc_msgsend_syms.deinit(); + + for (self.objects.items) |index| { + const object = self.getFile(index).?.object; + + for (object.symbols.items, 0..) |sym_index, i| { + const nlist_idx = @as(Symbol.Index, @intCast(i)); + const nlist = object.symtab.items(.nlist)[nlist_idx]; + if (!nlist.ext()) continue; + if (!nlist.undf()) continue; + + const sym = self.getSymbol(sym_index); + if (sym.getFile(self) != null) continue; + if (mem.startsWith(u8, sym.getName(self), "_objc_msgSend$")) { + _ = try objc_msgsend_syms.put(sym_index, {}); + } + } + } + + for (objc_msgsend_syms.keys()) |sym_index| { + const sym = self.getSymbol(sym_index); + sym.value = 0; + sym.atom = 0; + sym.nlist_idx = 0; + sym.file = self.internal_object.?; + sym.flags = .{}; + sym.visibility = .hidden; + const object = self.getInternalObject().?; + const name = eatPrefix(sym.getName(self), "_objc_msgSend$").?; + const selrefs_index = try object.addObjcMsgsendSections(name, self); + try sym.addExtra(.{ .objc_selrefs = selrefs_index }, self); + try object.symbols.append(gpa, sym_index); + } +} + fn shrinkAtom(self: *MachO, atom_index: Atom.Index, new_block_size: u64) void { _ = self; _ = atom_index;