diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2021-07-08 19:51:03 +0200 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2021-07-15 18:49:47 +0200 |
| commit | bb5b82cab9f142bef916e35ec186314a41613356 (patch) | |
| tree | 1c319d7bb514a107971bda5837f0ae32bdc6b175 /src | |
| parent | 0cc4938419c52681d7f7d5a48054e3f8aa827840 (diff) | |
| download | zig-bb5b82cab9f142bef916e35ec186314a41613356.tar.gz zig-bb5b82cab9f142bef916e35ec186314a41613356.zip | |
zld: dedup symbols in the symbol table
Diffstat (limited to 'src')
| -rw-r--r-- | src/link/MachO/Zld.zig | 31 |
1 files changed, 15 insertions, 16 deletions
diff --git a/src/link/MachO/Zld.zig b/src/link/MachO/Zld.zig index e9a8199d9d..0022f1dbba 100644 --- a/src/link/MachO/Zld.zig +++ b/src/link/MachO/Zld.zig @@ -2477,33 +2477,32 @@ fn writeSymbolTable(self: *Zld) !void { var locals = std.ArrayList(macho.nlist_64).init(self.allocator); defer locals.deinit(); - try locals.ensureTotalCapacity(self.locals.items.len); - for (self.locals.items) |symbol| { + var exports = std.ArrayList(macho.nlist_64).init(self.allocator); + defer exports.deinit(); + + for (self.locals.items) |symbol, i| { + if (i == 0) continue; // skip null symbol if (symbol.isTemp()) continue; // TODO when merging codepaths, this should go into freelist + const reg = symbol.payload.regular; const nlist = try symbol.asNlist(self, &self.strtab); - locals.appendAssumeCapacity(nlist); + if (reg.linkage == .translation_unit) { + try locals.append(nlist); + } else { + try exports.append(nlist); + } } - var exports = std.ArrayList(macho.nlist_64).init(self.allocator); - defer exports.deinit(); - var undefs = std.ArrayList(macho.nlist_64).init(self.allocator); defer undefs.deinit(); var undef_dir = std.StringHashMap(u32).init(self.allocator); defer undef_dir.deinit(); - for (self.globals.values()) |sym| { + for (self.imports.items) |sym| { const nlist = try sym.asNlist(self, &self.strtab); - switch (sym.payload) { - .regular => try exports.append(nlist), - .proxy => { - const id = @intCast(u32, undefs.items.len); - try undefs.append(nlist); - try undef_dir.putNoClobber(sym.name, id); - }, - else => unreachable, - } + const id = @intCast(u32, undefs.items.len); + try undefs.append(nlist); + try undef_dir.putNoClobber(sym.name, id); } const nlocals = locals.items.len; |
