authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-04-03 10:07:49+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-04-03 10:07:49+02:00
log72137824e5ee59798140aef1d2061adc1c8227b9
tree5cdb727ea245f082d4e19c7b770932e4dcc04ff1
parentad8dfd367384a104f588bdc393cabae90c47c82f

macho: clean up code responsible for growing sections in file


2 files changed, 48 insertions(+), 47 deletions(-)

src/link/Coff.zig+1-5
......@@ -622,11 +622,7 @@ fn allocateAtom(self: *Coff, atom_index: Atom.Index, new_atom_size: u32, alignme
622622 try self.growSection(sect_id, needed_size);
623623 maybe_last_atom_index.* = atom_index;
624624 }
625
626 {
627 const atom_ptr = self.getAtomPtr(atom_index);
628 atom_ptr.size = new_atom_size;
629 }
625 self.getAtomPtr(atom_index).size = new_atom_size;
630626
631627 if (atom.prev_index) |prev_index| {
632628 const prev = self.getAtomPtr(prev_index);
src/link/MachO.zig+47-42
......@@ -3053,7 +3053,51 @@ fn allocateSection(self: *MachO, segname: []const u8, sectname: []const u8, opts
30533053 return section_id;
30543054}
30553055
3056fn moveSectionInVirtualMemory(self: *MachO, sect_id: u8, needed_size: u64) !void {
3056fn growSection(self: *MachO, sect_id: u8, needed_size: u64) !void {
3057 const header = &self.sections.items(.header)[sect_id];
3058 const segment_index = self.sections.items(.segment_index)[sect_id];
3059 const segment = &self.segments.items[segment_index];
3060 const maybe_last_atom_index = self.sections.items(.last_atom_index)[sect_id];
3061 const sect_capacity = self.allocatedSize(header.offset);
3062
3063 if (needed_size > sect_capacity) {
3064 const new_offset = self.findFreeSpace(needed_size, self.page_size);
3065 const current_size = if (maybe_last_atom_index) |last_atom_index| blk: {
3066 const last_atom = self.getAtom(last_atom_index);
3067 const sym = last_atom.getSymbol(self);
3068 break :blk (sym.n_value + last_atom.size) - segment.vmaddr;
3069 } else 0;
3070
3071 log.debug("moving {s},{s} from 0x{x} to 0x{x}", .{
3072 header.segName(),
3073 header.sectName(),
3074 header.offset,
3075 new_offset,
3076 });
3077
3078 const amt = try self.base.file.?.copyRangeAll(
3079 header.offset,
3080 self.base.file.?,
3081 new_offset,
3082 current_size,
3083 );
3084 if (amt != current_size) return error.InputOutput;
3085 header.offset = @intCast(u32, new_offset);
3086 segment.fileoff = new_offset;
3087 }
3088
3089 const sect_vm_capacity = self.allocatedVirtualSize(segment.vmaddr);
3090 if (needed_size > sect_vm_capacity) {
3091 self.markRelocsDirtyByAddress(segment.vmaddr + needed_size);
3092 try self.growSectionVirtualMemory(sect_id, needed_size);
3093 }
3094
3095 header.size = needed_size;
3096 segment.filesize = mem.alignForwardGeneric(u64, needed_size, self.page_size);
3097 segment.vmsize = mem.alignForwardGeneric(u64, needed_size, self.page_size);
3098}
3099
3100fn growSectionVirtualMemory(self: *MachO, sect_id: u8, needed_size: u64) !void {
30573101 const header = &self.sections.items(.header)[sect_id];
30583102 const segment = self.getSegmentPtr(sect_id);
30593103 const increased_size = padToIdeal(needed_size);
......@@ -3172,45 +3216,9 @@ fn allocateAtom(self: *MachO, atom_index: Atom.Index, new_atom_size: u64, alignm
31723216 else
31733217 true;
31743218 if (expand_section) {
3175 const sect_capacity = self.allocatedSize(header.offset);
31763219 const needed_size = (vaddr + new_atom_size) - segment.vmaddr;
3177 if (needed_size > sect_capacity) {
3178 const new_offset = self.findFreeSpace(needed_size, self.page_size);
3179 const current_size = if (maybe_last_atom_index.*) |last_atom_index| blk: {
3180 const last_atom = self.getAtom(last_atom_index);
3181 const sym = last_atom.getSymbol(self);
3182 break :blk (sym.n_value + last_atom.size) - segment.vmaddr;
3183 } else 0;
3184
3185 log.debug("moving {s},{s} from 0x{x} to 0x{x}", .{
3186 header.segName(),
3187 header.sectName(),
3188 header.offset,
3189 new_offset,
3190 });
3191
3192 const amt = try self.base.file.?.copyRangeAll(
3193 header.offset,
3194 self.base.file.?,
3195 new_offset,
3196 current_size,
3197 );
3198 if (amt != current_size) return error.InputOutput;
3199 header.offset = @intCast(u32, new_offset);
3200 segment.fileoff = new_offset;
3201 }
3202
3203 const sect_vm_capacity = self.allocatedVirtualSize(segment.vmaddr);
3204 if (needed_size > sect_vm_capacity) {
3205 self.markRelocsDirtyByAddress(segment.vmaddr + needed_size);
3206 try self.moveSectionInVirtualMemory(sect_id, needed_size);
3207 }
3208
3209 header.size = needed_size;
3210 segment.filesize = mem.alignForwardGeneric(u64, needed_size, self.page_size);
3211 segment.vmsize = mem.alignForwardGeneric(u64, needed_size, self.page_size);
3220 try self.growSection(sect_id, needed_size);
32123221 maybe_last_atom_index.* = atom_index;
3213
32143222 self.segment_table_dirty = true;
32153223 }
32163224
......@@ -3218,10 +3226,7 @@ fn allocateAtom(self: *MachO, atom_index: Atom.Index, new_atom_size: u64, alignm
32183226 if (header.@"align" < align_pow) {
32193227 header.@"align" = align_pow;
32203228 }
3221 {
3222 const atom_ptr = self.getAtomPtr(atom_index);
3223 atom_ptr.size = new_atom_size;
3224 }
3229 self.getAtomPtr(atom_index).size = new_atom_size;
32253230
32263231 if (atom.prev_index) |prev_index| {
32273232 const prev = self.getAtomPtr(prev_index);