| ... | ... | @@ -3763,9 +3763,12 @@ pub fn lowerUnnamedConst(self: *MachO, typed_value: TypedValue, decl: *Module.De |
| 3763 | 3763 | } |
| 3764 | 3764 | const unnamed_consts = gop.value_ptr; |
| 3765 | 3765 | |
| 3766 | const decl_name = try decl.getFullyQualifiedName(self.base.allocator); |
| 3767 | defer self.base.allocator.free(decl_name); |
| 3768 | |
| 3766 | 3769 | const name_str_index = blk: { |
| 3767 | 3770 | const index = unnamed_consts.items.len; |
| 3768 | | const name = try std.fmt.allocPrint(self.base.allocator, "__unnamed_{s}_{d}", .{ decl.name, index }); |
| 3771 | const name = try std.fmt.allocPrint(self.base.allocator, "__unnamed_{s}_{d}", .{ decl_name, index }); |
| 3769 | 3772 | defer self.base.allocator.free(name); |
| 3770 | 3773 | break :blk try self.makeString(name); |
| 3771 | 3774 | }; |
| ... | ... | @@ -4057,14 +4060,17 @@ fn placeDecl(self: *MachO, decl: *Module.Decl, code_len: usize) !*macho.nlist_64 |
| 4057 | 4060 | decl_ptr.* = try self.getMatchingSectionAtom(&decl.link.macho, decl.ty, decl.val); |
| 4058 | 4061 | } |
| 4059 | 4062 | const match = decl_ptr.*.?; |
| 4063 | const sym_name = try decl.getFullyQualifiedName(self.base.allocator); |
| 4064 | defer self.base.allocator.free(sym_name); |
| 4060 | 4065 | |
| 4061 | 4066 | if (decl.link.macho.size != 0) { |
| 4062 | 4067 | const capacity = decl.link.macho.capacity(self.*); |
| 4063 | 4068 | const need_realloc = code_len > capacity or !mem.isAlignedGeneric(u64, symbol.n_value, required_alignment); |
| 4069 | |
| 4064 | 4070 | if (need_realloc) { |
| 4065 | 4071 | const vaddr = try self.growAtom(&decl.link.macho, code_len, required_alignment, match); |
| 4066 | 4072 | |
| 4067 | | log.debug("growing {s} and moving from 0x{x} to 0x{x}", .{ decl.name, symbol.n_value, vaddr }); |
| 4073 | log.debug("growing {s} and moving from 0x{x} to 0x{x}", .{ sym_name, symbol.n_value, vaddr }); |
| 4068 | 4074 | |
| 4069 | 4075 | if (vaddr != symbol.n_value) { |
| 4070 | 4076 | log.debug(" (writing new GOT entry)", .{}); |
| ... | ... | @@ -4090,25 +4096,15 @@ fn placeDecl(self: *MachO, decl: *Module.Decl, code_len: usize) !*macho.nlist_64 |
| 4090 | 4096 | decl.link.macho.size = code_len; |
| 4091 | 4097 | decl.link.macho.dirty = true; |
| 4092 | 4098 | |
| 4093 | | const new_name = try std.fmt.allocPrint(self.base.allocator, "_{s}", .{ |
| 4094 | | mem.sliceTo(decl.name, 0), |
| 4095 | | }); |
| 4096 | | defer self.base.allocator.free(new_name); |
| 4097 | | |
| 4098 | | symbol.n_strx = try self.makeString(new_name); |
| 4099 | symbol.n_strx = try self.makeString(sym_name); |
| 4099 | 4100 | symbol.n_type = macho.N_SECT; |
| 4100 | 4101 | symbol.n_sect = @intCast(u8, self.text_section_index.?) + 1; |
| 4101 | 4102 | symbol.n_desc = 0; |
| 4102 | 4103 | } else { |
| 4103 | | const decl_name = try std.fmt.allocPrint(self.base.allocator, "_{s}", .{ |
| 4104 | | mem.sliceTo(decl.name, 0), |
| 4105 | | }); |
| 4106 | | defer self.base.allocator.free(decl_name); |
| 4107 | | |
| 4108 | | const name_str_index = try self.makeString(decl_name); |
| 4104 | const name_str_index = try self.makeString(sym_name); |
| 4109 | 4105 | const addr = try self.allocateAtom(&decl.link.macho, code_len, required_alignment, match); |
| 4110 | 4106 | |
| 4111 | | log.debug("allocated atom for {s} at 0x{x}", .{ decl_name, addr }); |
| 4107 | log.debug("allocated atom for {s} at 0x{x}", .{ sym_name, addr }); |
| 4112 | 4108 | |
| 4113 | 4109 | errdefer self.freeAtom(&decl.link.macho, match, false); |
| 4114 | 4110 | |
| ... | ... | @@ -6691,17 +6687,17 @@ fn snapshotState(self: *MachO) !void { |
| 6691 | 6687 | fn logSymtab(self: MachO) void { |
| 6692 | 6688 | log.debug("locals:", .{}); |
| 6693 | 6689 | for (self.locals.items) |sym, id| { |
| 6694 | | log.debug(" {d}: {s}: {}", .{ id, self.getString(sym.n_strx), sym }); |
| 6690 | log.debug(" {d}: {s}: @{x} in {d}", .{ id, self.getString(sym.n_strx), sym.n_value, sym.n_sect }); |
| 6695 | 6691 | } |
| 6696 | 6692 | |
| 6697 | 6693 | log.debug("globals:", .{}); |
| 6698 | 6694 | for (self.globals.items) |sym, id| { |
| 6699 | | log.debug(" {d}: {s}: {}", .{ id, self.getString(sym.n_strx), sym }); |
| 6695 | log.debug(" {d}: {s}: @{x} in {d}", .{ id, self.getString(sym.n_strx), sym.n_value, sym.n_sect }); |
| 6700 | 6696 | } |
| 6701 | 6697 | |
| 6702 | 6698 | log.debug("undefs:", .{}); |
| 6703 | 6699 | for (self.undefs.items) |sym, id| { |
| 6704 | | log.debug(" {d}: {s}: {}", .{ id, self.getString(sym.n_strx), sym }); |
| 6700 | log.debug(" {d}: {s}: in {d}", .{ id, self.getString(sym.n_strx), sym.n_desc }); |
| 6705 | 6701 | } |
| 6706 | 6702 | |
| 6707 | 6703 | { |
| ... | ... | @@ -6716,26 +6712,28 @@ fn logSymtab(self: MachO) void { |
| 6716 | 6712 | for (self.got_entries_table.values()) |value| { |
| 6717 | 6713 | const key = self.got_entries.items[value].target; |
| 6718 | 6714 | const atom = self.got_entries.items[value].atom; |
| 6715 | const n_value = self.locals.items[atom.local_sym_index].n_value; |
| 6719 | 6716 | switch (key) { |
| 6720 | | .local => { |
| 6721 | | const sym = self.locals.items[atom.local_sym_index]; |
| 6722 | | log.debug(" {} => {s}", .{ key, self.getString(sym.n_strx) }); |
| 6723 | | }, |
| 6724 | | .global => |n_strx| log.debug(" {} => {s}", .{ key, self.getString(n_strx) }), |
| 6717 | .local => |ndx| log.debug(" {d}: @{x}", .{ ndx, n_value }), |
| 6718 | .global => |n_strx| log.debug(" {s}: @{x}", .{ self.getString(n_strx), n_value }), |
| 6725 | 6719 | } |
| 6726 | 6720 | } |
| 6727 | 6721 | |
| 6728 | 6722 | log.debug("__thread_ptrs entries:", .{}); |
| 6729 | | for (self.tlv_ptr_entries_table.keys()) |key| { |
| 6730 | | switch (key) { |
| 6731 | | .local => unreachable, |
| 6732 | | .global => |n_strx| log.debug(" {} => {s}", .{ key, self.getString(n_strx) }), |
| 6733 | | } |
| 6723 | for (self.tlv_ptr_entries_table.values()) |value| { |
| 6724 | const key = self.tlv_ptr_entries.items[value].target; |
| 6725 | const atom = self.tlv_ptr_entries.items[value].atom; |
| 6726 | const n_value = self.locals.items[atom.local_sym_index].n_value; |
| 6727 | assert(key == .global); |
| 6728 | log.debug(" {s}: @{x}", .{ self.getString(key.global), n_value }); |
| 6734 | 6729 | } |
| 6735 | 6730 | |
| 6736 | 6731 | log.debug("stubs:", .{}); |
| 6737 | 6732 | for (self.stubs_table.keys()) |key| { |
| 6738 | | log.debug(" {} => {s}", .{ key, self.getString(key) }); |
| 6733 | const value = self.stubs_table.get(key).?; |
| 6734 | const atom = self.stubs.items[value]; |
| 6735 | const sym = self.locals.items[atom.local_sym_index]; |
| 6736 | log.debug(" {s}: @{x}", .{ self.getString(key), sym.n_value }); |
| 6739 | 6737 | } |
| 6740 | 6738 | } |
| 6741 | 6739 | |