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 {...@@ -2477,33 +2477,32 @@ fn writeSymbolTable(self: *Zld) !void {
24772477
2478 var locals = std.ArrayList(macho.nlist_64).init(self.allocator);2478 var locals = std.ArrayList(macho.nlist_64).init(self.allocator);
2479 defer locals.deinit();2479 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
2483 if (symbol.isTemp()) continue; // TODO when merging codepaths, this should go into freelist2486 if (symbol.isTemp()) continue; // TODO when merging codepaths, this should go into freelist
2487 const reg = symbol.payload.regular;
2484 const nlist = try symbol.asNlist(self, &self.strtab);2488 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 }
2486 }2494 }
24872495
2488 var exports = std.ArrayList(macho.nlist_64).init(self.allocator);
2489 defer exports.deinit();
2490
2491 var undefs = std.ArrayList(macho.nlist_64).init(self.allocator);2496 var undefs = std.ArrayList(macho.nlist_64).init(self.allocator);
2492 defer undefs.deinit();2497 defer undefs.deinit();
2493 var undef_dir = std.StringHashMap(u32).init(self.allocator);2498 var undef_dir = std.StringHashMap(u32).init(self.allocator);
2494 defer undef_dir.deinit();2499 defer undef_dir.deinit();
24952500
2496 for (self.globals.values()) |sym| {2501 for (self.imports.items) |sym| {
2497 const nlist = try sym.asNlist(self, &self.strtab);2502 const nlist = try sym.asNlist(self, &self.strtab);
2498 switch (sym.payload) {2503 const id = @intCast(u32, undefs.items.len);
2499 .regular => try exports.append(nlist),2504 try undefs.append(nlist);
2500 .proxy => {2505 try undef_dir.putNoClobber(sym.name, id);
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 }
2507 }2506 }
25082507
2509 const nlocals = locals.items.len;2508 const nlocals = locals.items.len;