| ... | ... | @@ -238,10 +238,10 @@ const Entry = struct { |
| 238 | 238 | } |
| 239 | 239 | }; |
| 240 | 240 | |
| 241 | | const BindingTable = std.AutoHashMapUnmanaged(*Atom, std.ArrayListUnmanaged(Atom.Binding)); |
| 242 | | const UnnamedConstTable = std.AutoHashMapUnmanaged(Module.Decl.Index, std.ArrayListUnmanaged(*Atom)); |
| 243 | | const RebaseTable = std.AutoHashMapUnmanaged(*Atom, std.ArrayListUnmanaged(u32)); |
| 244 | | const RelocationTable = std.AutoHashMapUnmanaged(*Atom, std.ArrayListUnmanaged(Relocation)); |
| 241 | const BindingTable = std.AutoArrayHashMapUnmanaged(*Atom, std.ArrayListUnmanaged(Atom.Binding)); |
| 242 | const UnnamedConstTable = std.AutoArrayHashMapUnmanaged(Module.Decl.Index, std.ArrayListUnmanaged(*Atom)); |
| 243 | const RebaseTable = std.AutoArrayHashMapUnmanaged(*Atom, std.ArrayListUnmanaged(u32)); |
| 244 | const RelocationTable = std.AutoArrayHashMapUnmanaged(*Atom, std.ArrayListUnmanaged(Relocation)); |
| 245 | 245 | |
| 246 | 246 | const PendingUpdate = union(enum) { |
| 247 | 247 | resolve_undef: u32, |
| ... | ... | @@ -547,11 +547,8 @@ pub fn flushModule(self: *MachO, comp: *Compilation, prog_node: *std.Progress.No |
| 547 | 547 | |
| 548 | 548 | try self.allocateSpecialSymbols(); |
| 549 | 549 | |
| 550 | | { |
| 551 | | var it = self.relocs.keyIterator(); |
| 552 | | while (it.next()) |atom| { |
| 553 | | try atom.*.resolveRelocations(self); |
| 554 | | } |
| 550 | for (self.relocs.keys()) |atom| { |
| 551 | try atom.resolveRelocations(self); |
| 555 | 552 | } |
| 556 | 553 | |
| 557 | 554 | if (build_options.enable_logging) { |
| ... | ... | @@ -1018,8 +1015,7 @@ fn writePtrWidthAtom(self: *MachO, atom: *Atom) !void { |
| 1018 | 1015 | |
| 1019 | 1016 | fn markRelocsDirtyByTarget(self: *MachO, target: SymbolWithLoc) void { |
| 1020 | 1017 | // TODO: reverse-lookup might come in handy here |
| 1021 | | var it = self.relocs.valueIterator(); |
| 1022 | | while (it.next()) |relocs| { |
| 1018 | for (self.relocs.values()) |*relocs| { |
| 1023 | 1019 | for (relocs.items) |*reloc| { |
| 1024 | 1020 | if (!reloc.target.eql(target)) continue; |
| 1025 | 1021 | reloc.dirty = true; |
| ... | ... | @@ -1028,8 +1024,7 @@ fn markRelocsDirtyByTarget(self: *MachO, target: SymbolWithLoc) void { |
| 1028 | 1024 | } |
| 1029 | 1025 | |
| 1030 | 1026 | fn markRelocsDirtyByAddress(self: *MachO, addr: u64) void { |
| 1031 | | var it = self.relocs.valueIterator(); |
| 1032 | | while (it.next()) |relocs| { |
| 1027 | for (self.relocs.values()) |*relocs| { |
| 1033 | 1028 | for (relocs.items) |*reloc| { |
| 1034 | 1029 | const target_atom = reloc.getTargetAtom(self) orelse continue; |
| 1035 | 1030 | const target_sym = target_atom.getSymbol(self); |
| ... | ... | @@ -1785,47 +1780,32 @@ pub fn deinit(self: *MachO) void { |
| 1785 | 1780 | assert(self.decls.count() == 0); |
| 1786 | 1781 | } |
| 1787 | 1782 | |
| 1788 | | { |
| 1789 | | var it = self.unnamed_const_atoms.valueIterator(); |
| 1790 | | while (it.next()) |atoms| { |
| 1791 | | atoms.deinit(gpa); |
| 1792 | | } |
| 1793 | | self.unnamed_const_atoms.deinit(gpa); |
| 1783 | for (self.unnamed_const_atoms.values()) |*atoms| { |
| 1784 | atoms.deinit(gpa); |
| 1794 | 1785 | } |
| 1786 | self.unnamed_const_atoms.deinit(gpa); |
| 1795 | 1787 | |
| 1796 | 1788 | self.atom_by_index_table.deinit(gpa); |
| 1797 | 1789 | |
| 1798 | | { |
| 1799 | | var it = self.relocs.valueIterator(); |
| 1800 | | while (it.next()) |relocs| { |
| 1801 | | relocs.deinit(gpa); |
| 1802 | | } |
| 1803 | | self.relocs.deinit(gpa); |
| 1790 | for (self.relocs.values()) |*relocs| { |
| 1791 | relocs.deinit(gpa); |
| 1804 | 1792 | } |
| 1793 | self.relocs.deinit(gpa); |
| 1805 | 1794 | |
| 1806 | | { |
| 1807 | | var it = self.rebases.valueIterator(); |
| 1808 | | while (it.next()) |rebases| { |
| 1809 | | rebases.deinit(gpa); |
| 1810 | | } |
| 1811 | | self.rebases.deinit(gpa); |
| 1795 | for (self.rebases.values()) |*rebases| { |
| 1796 | rebases.deinit(gpa); |
| 1812 | 1797 | } |
| 1798 | self.rebases.deinit(gpa); |
| 1813 | 1799 | |
| 1814 | | { |
| 1815 | | var it = self.bindings.valueIterator(); |
| 1816 | | while (it.next()) |bindings| { |
| 1817 | | bindings.deinit(gpa); |
| 1818 | | } |
| 1819 | | self.bindings.deinit(gpa); |
| 1800 | for (self.bindings.values()) |*bindings| { |
| 1801 | bindings.deinit(gpa); |
| 1820 | 1802 | } |
| 1803 | self.bindings.deinit(gpa); |
| 1821 | 1804 | |
| 1822 | | { |
| 1823 | | var it = self.lazy_bindings.valueIterator(); |
| 1824 | | while (it.next()) |bindings| { |
| 1825 | | bindings.deinit(gpa); |
| 1826 | | } |
| 1827 | | self.lazy_bindings.deinit(gpa); |
| 1805 | for (self.lazy_bindings.values()) |*bindings| { |
| 1806 | bindings.deinit(gpa); |
| 1828 | 1807 | } |
| 1808 | self.lazy_bindings.deinit(gpa); |
| 1829 | 1809 | } |
| 1830 | 1810 | |
| 1831 | 1811 | fn freeAtom(self: *MachO, atom: *Atom) void { |
| ... | ... | @@ -2580,13 +2560,13 @@ pub fn deleteExport(self: *MachO, exp: Export) void { |
| 2580 | 2560 | } |
| 2581 | 2561 | |
| 2582 | 2562 | fn freeRelocationsForAtom(self: *MachO, atom: *Atom) void { |
| 2583 | | var removed_relocs = self.relocs.fetchRemove(atom); |
| 2563 | var removed_relocs = self.relocs.fetchOrderedRemove(atom); |
| 2584 | 2564 | if (removed_relocs) |*relocs| relocs.value.deinit(self.base.allocator); |
| 2585 | | var removed_rebases = self.rebases.fetchRemove(atom); |
| 2565 | var removed_rebases = self.rebases.fetchOrderedRemove(atom); |
| 2586 | 2566 | if (removed_rebases) |*rebases| rebases.value.deinit(self.base.allocator); |
| 2587 | | var removed_bindings = self.bindings.fetchRemove(atom); |
| 2567 | var removed_bindings = self.bindings.fetchOrderedRemove(atom); |
| 2588 | 2568 | if (removed_bindings) |*bindings| bindings.value.deinit(self.base.allocator); |
| 2589 | | var removed_lazy_bindings = self.lazy_bindings.fetchRemove(atom); |
| 2569 | var removed_lazy_bindings = self.lazy_bindings.fetchOrderedRemove(atom); |
| 2590 | 2570 | if (removed_lazy_bindings) |*lazy_bindings| lazy_bindings.value.deinit(self.base.allocator); |
| 2591 | 2571 | } |
| 2592 | 2572 | |
| ... | ... | @@ -3199,11 +3179,8 @@ fn writeLinkeditSegmentData(self: *MachO) !void { |
| 3199 | 3179 | fn collectRebaseData(self: *MachO, rebase: *Rebase) !void { |
| 3200 | 3180 | const gpa = self.base.allocator; |
| 3201 | 3181 | const slice = self.sections.slice(); |
| 3202 | | var it = self.rebases.keyIterator(); |
| 3203 | | |
| 3204 | | while (it.next()) |key_ptr| { |
| 3205 | | const atom = key_ptr.*; |
| 3206 | 3182 | |
| 3183 | for (self.rebases.keys()) |atom, i| { |
| 3207 | 3184 | log.debug(" ATOM(%{d}, '{s}')", .{ atom.sym_index, atom.getName(self) }); |
| 3208 | 3185 | |
| 3209 | 3186 | const sym = atom.getSymbol(self); |
| ... | ... | @@ -3212,7 +3189,7 @@ fn collectRebaseData(self: *MachO, rebase: *Rebase) !void { |
| 3212 | 3189 | |
| 3213 | 3190 | const base_offset = sym.n_value - seg.vmaddr; |
| 3214 | 3191 | |
| 3215 | | const rebases = self.rebases.get(atom).?; |
| 3192 | const rebases = self.rebases.values()[i]; |
| 3216 | 3193 | try rebase.entries.ensureUnusedCapacity(gpa, rebases.items.len); |
| 3217 | 3194 | |
| 3218 | 3195 | for (rebases.items) |offset| { |
| ... | ... | @@ -3231,11 +3208,8 @@ fn collectRebaseData(self: *MachO, rebase: *Rebase) !void { |
| 3231 | 3208 | fn collectBindData(self: *MachO, bind: anytype, raw_bindings: anytype) !void { |
| 3232 | 3209 | const gpa = self.base.allocator; |
| 3233 | 3210 | const slice = self.sections.slice(); |
| 3234 | | var it = raw_bindings.keyIterator(); |
| 3235 | | |
| 3236 | | while (it.next()) |key_ptr| { |
| 3237 | | const atom = key_ptr.*; |
| 3238 | 3211 | |
| 3212 | for (raw_bindings.keys()) |atom, i| { |
| 3239 | 3213 | log.debug(" ATOM(%{d}, '{s}')", .{ atom.sym_index, atom.getName(self) }); |
| 3240 | 3214 | |
| 3241 | 3215 | const sym = atom.getSymbol(self); |
| ... | ... | @@ -3244,7 +3218,7 @@ fn collectBindData(self: *MachO, bind: anytype, raw_bindings: anytype) !void { |
| 3244 | 3218 | |
| 3245 | 3219 | const base_offset = sym.n_value - seg.vmaddr; |
| 3246 | 3220 | |
| 3247 | | const bindings = raw_bindings.get(atom).?; |
| 3221 | const bindings = raw_bindings.values()[i]; |
| 3248 | 3222 | try bind.entries.ensureUnusedCapacity(gpa, bindings.items.len); |
| 3249 | 3223 | |
| 3250 | 3224 | for (bindings.items) |binding| { |