zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit bb5b82cab9f142bef916e35ec186314a41613356 (tree)
parent 0cc4938419c52681d7f7d5a48054e3f8aa827840
Author: Jakub Konka <kubkon@jakubkonka.com>
Date:   Thu,  8 Jul 2021 19:51:03 +0200

zld: dedup symbols in the symbol table

Diffstat:
Msrc/link/MachO/Zld.zig | 31+++++++++++++++----------------
1 file changed, 15 insertions(+), 16 deletions(-)

diff --git 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;