| ... | @@ -2477,33 +2477,32 @@ fn writeSymbolTable(self: *Zld) !void { | ... | @@ -2477,33 +2477,32 @@ fn writeSymbolTable(self: *Zld) !void { |
| 2477 | | 2477 | |
| 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); | | |
| 2481 | | 2480 | |
| 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 freelist | 2486 | 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 | } |
| 2487 | | 2495 | |
| 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(); |
| 2495 | | 2500 | |
| 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 | } |
| 2508 | | 2507 | |
| 2509 | const nlocals = locals.items.len; | 2508 | const nlocals = locals.items.len; |