| ... | ... | @@ -266,7 +266,7 @@ const StringSection = struct { |
| 266 | 266 | /// A linker section containing a sequence of `Unit`s. |
| 267 | 267 | pub const Section = struct { |
| 268 | 268 | dirty: bool, |
| 269 | | pad_to_ideal: bool, |
| 269 | pad_entries_to_ideal: bool, |
| 270 | 270 | alignment: InternPool.Alignment, |
| 271 | 271 | index: u32, |
| 272 | 272 | first: Unit.Index.Optional, |
| ... | ... | @@ -288,7 +288,7 @@ pub const Section = struct { |
| 288 | 288 | |
| 289 | 289 | const init: Section = .{ |
| 290 | 290 | .dirty = true, |
| 291 | | .pad_to_ideal = true, |
| 291 | .pad_entries_to_ideal = true, |
| 292 | 292 | .alignment = .@"1", |
| 293 | 293 | .index = std.math.maxInt(u32), |
| 294 | 294 | .first = .none, |
| ... | ... | @@ -340,12 +340,12 @@ pub const Section = struct { |
| 340 | 340 | if (sec.last.unwrap()) |last_unit| { |
| 341 | 341 | const last_unit_ptr = sec.getUnit(last_unit); |
| 342 | 342 | last_unit_ptr.next = unit.toOptional(); |
| 343 | | unit_ptr.off = last_unit_ptr.off + sec.padToIdeal(last_unit_ptr.len); |
| 343 | unit_ptr.off = last_unit_ptr.off + sec.padUnitToIdeal(last_unit_ptr.len); |
| 344 | 344 | } |
| 345 | 345 | if (sec.first == .none) |
| 346 | 346 | sec.first = unit.toOptional(); |
| 347 | 347 | sec.last = unit.toOptional(); |
| 348 | | try sec.resize(dwarf, unit_ptr.off + sec.padToIdeal(unit_ptr.len)); |
| 348 | try sec.resize(dwarf, unit_ptr.off + sec.padUnitToIdeal(unit_ptr.len)); |
| 349 | 349 | return unit; |
| 350 | 350 | } |
| 351 | 351 | |
| ... | ... | @@ -377,7 +377,7 @@ pub const Section = struct { |
| 377 | 377 | entry_ptr.off = if (unit_ptr.last.unwrap()) |last_entry| off: { |
| 378 | 378 | const last_entry_ptr = unit_ptr.getEntry(last_entry); |
| 379 | 379 | last_entry_ptr.next = entry.toOptional(); |
| 380 | | break :off last_entry_ptr.off + sec.padToIdeal(last_entry_ptr.len); |
| 380 | break :off last_entry_ptr.off + sec.padEntryToIdeal(last_entry_ptr.len); |
| 381 | 381 | } else 0; |
| 382 | 382 | entry_ptr.prev = unit_ptr.last; |
| 383 | 383 | unit_ptr.last = entry.toOptional(); |
| ... | ... | @@ -469,8 +469,12 @@ pub const Section = struct { |
| 469 | 469 | for (sec.units.items) |*unit| try unit.resolveRelocs(sec, dwarf); |
| 470 | 470 | } |
| 471 | 471 | |
| 472 | | fn padToIdeal(sec: *Section, actual_size: anytype) @TypeOf(actual_size) { |
| 473 | | return @intCast(sec.alignment.forward(if (sec.pad_to_ideal) Dwarf.padToIdeal(actual_size) else actual_size)); |
| 472 | fn padUnitToIdeal(sec: *Section, actual_size: anytype) @TypeOf(actual_size) { |
| 473 | return @intCast(sec.alignment.forward(Dwarf.padToIdeal(actual_size))); |
| 474 | } |
| 475 | |
| 476 | fn padEntryToIdeal(sec: *Section, actual_size: anytype) @TypeOf(actual_size) { |
| 477 | return @intCast(sec.alignment.forward(if (sec.pad_entries_to_ideal) Dwarf.padToIdeal(actual_size) else actual_size)); |
| 474 | 478 | } |
| 475 | 479 | }; |
| 476 | 480 | |
| ... | ... | @@ -568,7 +572,7 @@ const Unit = struct { |
| 568 | 572 | last_unit_ptr.next = unit; |
| 569 | 573 | unit_ptr.prev = sec.last; |
| 570 | 574 | unit_ptr.next = .none; |
| 571 | | new_off = last_unit_ptr.off + sec.padToIdeal(last_unit_ptr.len); |
| 575 | new_off = last_unit_ptr.off + sec.padUnitToIdeal(last_unit_ptr.len); |
| 572 | 576 | sec.last = unit; |
| 573 | 577 | sec.dirty = true; |
| 574 | 578 | } else if (extra_header_len > 0) { |
| ... | ... | @@ -872,7 +876,7 @@ const Entry = struct { |
| 872 | 876 | assert(fbs.pos == extended_op_bytes + op_len_bytes); |
| 873 | 877 | if (len > 2) writer.writeByte(DW.LNE.padding) catch unreachable; |
| 874 | 878 | }, |
| 875 | | } else assert(!sec.pad_to_ideal and len == 0); |
| 879 | } else assert(!sec.pad_entries_to_ideal and len == 0); |
| 876 | 880 | assert(fbs.pos <= len); |
| 877 | 881 | try dwarf.getFile().?.pwriteAll(fbs.getWritten(), sec.off(dwarf) + unit.off + unit.header_len + start); |
| 878 | 882 | } |
| ... | ... | @@ -899,11 +903,11 @@ const Entry = struct { |
| 899 | 903 | last_entry_ptr.next = entry; |
| 900 | 904 | entry_ptr.prev = unit.last; |
| 901 | 905 | entry_ptr.next = .none; |
| 902 | | entry_ptr.off = last_entry_ptr.off + sec.padToIdeal(last_entry_ptr.len); |
| 906 | entry_ptr.off = last_entry_ptr.off + sec.padEntryToIdeal(last_entry_ptr.len); |
| 903 | 907 | unit.last = entry; |
| 904 | 908 | try last_entry_ptr.pad(unit, sec, dwarf); |
| 905 | 909 | } |
| 906 | | try unit.resize(sec, dwarf, 0, @intCast(unit.header_len + entry_ptr.off + sec.padToIdeal(len) + unit.trailer_len)); |
| 910 | try unit.resize(sec, dwarf, 0, @intCast(unit.header_len + entry_ptr.off + sec.padEntryToIdeal(len) + unit.trailer_len)); |
| 907 | 911 | } |
| 908 | 912 | entry_ptr.len = len; |
| 909 | 913 | try entry_ptr.pad(unit, sec, dwarf); |
| ... | ... | @@ -2247,13 +2251,13 @@ pub fn initMetadata(dwarf: *Dwarf) UpdateError!void { |
| 2247 | 2251 | } |
| 2248 | 2252 | dwarf.reloadSectionMetadata(); |
| 2249 | 2253 | |
| 2250 | | dwarf.debug_abbrev.section.pad_to_ideal = false; |
| 2254 | dwarf.debug_abbrev.section.pad_entries_to_ideal = false; |
| 2251 | 2255 | assert(try dwarf.debug_abbrev.section.addUnit(DebugAbbrev.header_bytes, DebugAbbrev.trailer_bytes, dwarf) == DebugAbbrev.unit); |
| 2252 | 2256 | errdefer dwarf.debug_abbrev.section.popUnit(dwarf.gpa); |
| 2253 | 2257 | for (std.enums.values(AbbrevCode)) |abbrev_code| |
| 2254 | 2258 | assert(@intFromEnum(try dwarf.debug_abbrev.section.getUnit(DebugAbbrev.unit).addEntry(dwarf.gpa)) == @intFromEnum(abbrev_code)); |
| 2255 | 2259 | |
| 2256 | | dwarf.debug_aranges.section.pad_to_ideal = false; |
| 2260 | dwarf.debug_aranges.section.pad_entries_to_ideal = false; |
| 2257 | 2261 | dwarf.debug_aranges.section.alignment = InternPool.Alignment.fromNonzeroByteUnits(@intFromEnum(dwarf.address_size) * 2); |
| 2258 | 2262 | |
| 2259 | 2263 | dwarf.debug_frame.section.alignment = switch (dwarf.debug_frame.header.format) { |
| ... | ... | @@ -2262,17 +2266,17 @@ pub fn initMetadata(dwarf: *Dwarf) UpdateError!void { |
| 2262 | 2266 | .eh_frame => .@"4", |
| 2263 | 2267 | }; |
| 2264 | 2268 | |
| 2265 | | dwarf.debug_line_str.section.pad_to_ideal = false; |
| 2269 | dwarf.debug_line_str.section.pad_entries_to_ideal = false; |
| 2266 | 2270 | assert(try dwarf.debug_line_str.section.addUnit(0, 0, dwarf) == StringSection.unit); |
| 2267 | 2271 | errdefer dwarf.debug_line_str.section.popUnit(dwarf.gpa); |
| 2268 | 2272 | |
| 2269 | | dwarf.debug_str.section.pad_to_ideal = false; |
| 2273 | dwarf.debug_str.section.pad_entries_to_ideal = false; |
| 2270 | 2274 | assert(try dwarf.debug_str.section.addUnit(0, 0, dwarf) == StringSection.unit); |
| 2271 | 2275 | errdefer dwarf.debug_str.section.popUnit(dwarf.gpa); |
| 2272 | 2276 | |
| 2273 | | dwarf.debug_loclists.section.pad_to_ideal = false; |
| 2277 | dwarf.debug_loclists.section.pad_entries_to_ideal = false; |
| 2274 | 2278 | |
| 2275 | | dwarf.debug_rnglists.section.pad_to_ideal = false; |
| 2279 | dwarf.debug_rnglists.section.pad_entries_to_ideal = false; |
| 2276 | 2280 | } |
| 2277 | 2281 | |
| 2278 | 2282 | pub fn deinit(dwarf: *Dwarf) void { |