| ... | ... | @@ -500,6 +500,9 @@ pub fn flushModule(self: *MachO, arena: Allocator, prog_node: *std.Progress.Node |
| 500 | 500 | try self.resolveSymbols(); |
| 501 | 501 | try self.resolveSyntheticSymbols(); |
| 502 | 502 | |
| 503 | try self.convertTentativeDefinitions(); |
| 504 | try self.createObjcSections(); |
| 505 | |
| 503 | 506 | state_log.debug("{}", .{self.dumpState()}); |
| 504 | 507 | |
| 505 | 508 | @panic("TODO"); |
| ... | ... | @@ -1263,6 +1266,50 @@ fn resolveSyntheticSymbols(self: *MachO) !void { |
| 1263 | 1266 | } |
| 1264 | 1267 | } |
| 1265 | 1268 | |
| 1269 | fn convertTentativeDefinitions(self: *MachO) !void { |
| 1270 | for (self.objects.items) |index| { |
| 1271 | try self.getFile(index).?.object.convertTentativeDefinitions(self); |
| 1272 | } |
| 1273 | } |
| 1274 | |
| 1275 | fn createObjcSections(self: *MachO) !void { |
| 1276 | const gpa = self.base.comp.gpa; |
| 1277 | var objc_msgsend_syms = std.AutoArrayHashMap(Symbol.Index, void).init(gpa); |
| 1278 | defer objc_msgsend_syms.deinit(); |
| 1279 | |
| 1280 | for (self.objects.items) |index| { |
| 1281 | const object = self.getFile(index).?.object; |
| 1282 | |
| 1283 | for (object.symbols.items, 0..) |sym_index, i| { |
| 1284 | const nlist_idx = @as(Symbol.Index, @intCast(i)); |
| 1285 | const nlist = object.symtab.items(.nlist)[nlist_idx]; |
| 1286 | if (!nlist.ext()) continue; |
| 1287 | if (!nlist.undf()) continue; |
| 1288 | |
| 1289 | const sym = self.getSymbol(sym_index); |
| 1290 | if (sym.getFile(self) != null) continue; |
| 1291 | if (mem.startsWith(u8, sym.getName(self), "_objc_msgSend$")) { |
| 1292 | _ = try objc_msgsend_syms.put(sym_index, {}); |
| 1293 | } |
| 1294 | } |
| 1295 | } |
| 1296 | |
| 1297 | for (objc_msgsend_syms.keys()) |sym_index| { |
| 1298 | const sym = self.getSymbol(sym_index); |
| 1299 | sym.value = 0; |
| 1300 | sym.atom = 0; |
| 1301 | sym.nlist_idx = 0; |
| 1302 | sym.file = self.internal_object.?; |
| 1303 | sym.flags = .{}; |
| 1304 | sym.visibility = .hidden; |
| 1305 | const object = self.getInternalObject().?; |
| 1306 | const name = eatPrefix(sym.getName(self), "_objc_msgSend$").?; |
| 1307 | const selrefs_index = try object.addObjcMsgsendSections(name, self); |
| 1308 | try sym.addExtra(.{ .objc_selrefs = selrefs_index }, self); |
| 1309 | try object.symbols.append(gpa, sym_index); |
| 1310 | } |
| 1311 | } |
| 1312 | |
| 1266 | 1313 | fn shrinkAtom(self: *MachO, atom_index: Atom.Index, new_block_size: u64) void { |
| 1267 | 1314 | _ = self; |
| 1268 | 1315 | _ = atom_index; |