aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2021-07-08 19:51:03 +0200
committerJakub Konka <kubkon@jakubkonka.com>2021-07-15 18:49:47 +0200
commitbb5b82cab9f142bef916e35ec186314a41613356 (patch)
tree1c319d7bb514a107971bda5837f0ae32bdc6b175 /src
parent0cc4938419c52681d7f7d5a48054e3f8aa827840 (diff)
downloadzig-bb5b82cab9f142bef916e35ec186314a41613356.tar.gz
zig-bb5b82cab9f142bef916e35ec186314a41613356.zip
zld: dedup symbols in the symbol table
Diffstat (limited to 'src')
-rw-r--r--src/link/MachO/Zld.zig31
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;