authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-12-08 10:55:23+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-12-09 09:24:25+01:00
logecb341a006c4361aff1755c9d2d2644d35528dcd
treeecbe40bf0b5090fc24112e15a4faf26fb8d55d73
parent381abcfb7a24dcfda761390d6ef914047330f878

dwarf: move growing debug_abbrev section to dsym


2 files changed, 9 insertions(+), 21 deletions(-)

src/link/Dwarf.zig+4-15
......@@ -1745,21 +1745,10 @@ pub fn writeDbgAbbrev(self: *Dwarf) !void {
17451745 },
17461746 .macho => {
17471747 const d_sym = self.bin_file.cast(File.MachO).?.getDebugSymbols().?;
1748 const dwarf_segment = d_sym.segments.items[d_sym.dwarf_segment_cmd_index.?];
1749 const debug_abbrev_sect = &d_sym.sections.items[d_sym.debug_abbrev_section_index.?];
1750 const allocated_size = d_sym.allocatedSize(debug_abbrev_sect.offset);
1751 if (needed_size > allocated_size) {
1752 debug_abbrev_sect.size = 0; // free the space
1753 const offset = d_sym.findFreeSpace(needed_size, 1);
1754 debug_abbrev_sect.offset = @intCast(u32, offset);
1755 debug_abbrev_sect.addr = dwarf_segment.vmaddr + offset - dwarf_segment.fileoff;
1756 }
1757 debug_abbrev_sect.size = needed_size;
1758 log.debug("__debug_abbrev start=0x{x} end=0x{x}", .{
1759 debug_abbrev_sect.offset,
1760 debug_abbrev_sect.offset + needed_size,
1761 });
1762 const file_pos = debug_abbrev_sect.offset + abbrev_offset;
1748 const sect_index = d_sym.debug_abbrev_section_index.?;
1749 try d_sym.growSection(sect_index, needed_size);
1750 const sect = d_sym.getSection(sect_index);
1751 const file_pos = sect.offset + abbrev_offset;
17631752 try d_sym.file.pwriteAll(&abbrev_buf, file_pos);
17641753 },
17651754 .wasm => {
src/link/MachO/DebugSymbols.zig+5-6
......@@ -137,7 +137,6 @@ fn allocateSection(self: *DebugSymbols, sectname: []const u8, size: u64, alignme
137137 off + size,
138138 });
139139
140 sect.addr = segment.vmaddr + off - segment.fileoff;
141140 sect.offset = @intCast(u32, off);
142141
143142 const index = @intCast(u8, self.sections.items.len);
......@@ -152,11 +151,13 @@ pub fn growSection(self: *DebugSymbols, sect_index: u8, needed_size: u32) !void
152151 const sect = self.getSectionPtr(sect_index);
153152
154153 if (needed_size > self.allocatedSize(sect.offset)) {
154 const existing_size = sect.size;
155 sect.size = 0; // free the space
155156 const new_offset = self.findFreeSpace(needed_size, 1);
156157
157158 log.debug("moving {s} section: {} bytes from 0x{x} to 0x{x}", .{
158159 sect.sectName(),
159 sect.size,
160 existing_size,
160161 sect.offset,
161162 new_offset,
162163 });
......@@ -165,9 +166,9 @@ pub fn growSection(self: *DebugSymbols, sect_index: u8, needed_size: u32) !void
165166 sect.offset,
166167 self.file,
167168 new_offset,
168 sect.size,
169 existing_size,
169170 );
170 if (amt != sect.size) return error.InputOutput;
171 if (amt != existing_size) return error.InputOutput;
171172 sect.offset = @intCast(u32, new_offset);
172173 }
173174 sect.size = needed_size;
......@@ -275,7 +276,6 @@ pub fn flushModule(self: *DebugSymbols, macho_file: *MachO) !void {
275276 }
276277
277278 {
278 const dwarf_segment = self.getDwarfSegmentPtr();
279279 const debug_strtab_sect = &self.sections.items[self.debug_str_section_index.?];
280280 if (self.debug_string_table_dirty or self.dwarf.strtab.items.len != debug_strtab_sect.size) {
281281 const allocated_size = self.allocatedSize(debug_strtab_sect.offset);
......@@ -284,7 +284,6 @@ pub fn flushModule(self: *DebugSymbols, macho_file: *MachO) !void {
284284 if (needed_size > allocated_size) {
285285 debug_strtab_sect.size = 0; // free the space
286286 const new_offset = self.findFreeSpace(needed_size, 1);
287 debug_strtab_sect.addr = dwarf_segment.vmaddr + new_offset - dwarf_segment.fileoff;
288287 debug_strtab_sect.offset = @intCast(u32, new_offset);
289288 }
290289 debug_strtab_sect.size = @intCast(u32, needed_size);