authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2021-07-08 19:51:03+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2021-07-15 18:49:47+02:00
logbb5b82cab9f142bef916e35ec186314a41613356
tree1c319d7bb514a107971bda5837f0ae32bdc6b175
parent0cc4938419c52681d7f7d5a48054e3f8aa827840

zld: dedup symbols in the symbol table


1 files changed, 15 insertions(+), 16 deletions(-)

src/link/MachO/Zld.zig+15-16
......@@ -2477,33 +2477,32 @@ fn writeSymbolTable(self: *Zld) !void {
24772477
24782478 var locals = std.ArrayList(macho.nlist_64).init(self.allocator);
24792479 defer locals.deinit();
2480 try locals.ensureTotalCapacity(self.locals.items.len);
24812480
2482 for (self.locals.items) |symbol| {
2481 var exports = std.ArrayList(macho.nlist_64).init(self.allocator);
2482 defer exports.deinit();
2483
2484 for (self.locals.items) |symbol, i| {
2485 if (i == 0) continue; // skip null symbol
24832486 if (symbol.isTemp()) continue; // TODO when merging codepaths, this should go into freelist
2487 const reg = symbol.payload.regular;
24842488 const nlist = try symbol.asNlist(self, &self.strtab);
2485 locals.appendAssumeCapacity(nlist);
2489 if (reg.linkage == .translation_unit) {
2490 try locals.append(nlist);
2491 } else {
2492 try exports.append(nlist);
2493 }
24862494 }
24872495
2488 var exports = std.ArrayList(macho.nlist_64).init(self.allocator);
2489 defer exports.deinit();
2490
24912496 var undefs = std.ArrayList(macho.nlist_64).init(self.allocator);
24922497 defer undefs.deinit();
24932498 var undef_dir = std.StringHashMap(u32).init(self.allocator);
24942499 defer undef_dir.deinit();
24952500
2496 for (self.globals.values()) |sym| {
2501 for (self.imports.items) |sym| {
24972502 const nlist = try sym.asNlist(self, &self.strtab);
2498 switch (sym.payload) {
2499 .regular => try exports.append(nlist),
2500 .proxy => {
2501 const id = @intCast(u32, undefs.items.len);
2502 try undefs.append(nlist);
2503 try undef_dir.putNoClobber(sym.name, id);
2504 },
2505 else => unreachable,
2506 }
2503 const id = @intCast(u32, undefs.items.len);
2504 try undefs.append(nlist);
2505 try undef_dir.putNoClobber(sym.name, id);
25072506 }
25082507
25092508 const nlocals = locals.items.len;