authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-01-20 18:03:10+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-01-24 12:34:42+01:00
log5c30c23fc4d9f996244c11ff95104d86be88b4e4
treee7c18125d2b96cc8de150e277c32cc33cc703c62
parentaef2c91d9f91c89a883c95331fa382692ab5e7c3

macho: get rid of allocateSegments


1 files changed, 24 insertions(+), 51 deletions(-)

src/link/MachO.zig+24-51
......@@ -588,7 +588,6 @@ pub fn flushModule(self: *MachO, arena: Allocator, prog_node: *std.Progress.Node
588588 try self.initSegments();
589589
590590 try self.allocateSections();
591 self.allocateSegments();
592591 self.allocateAtoms();
593592 self.allocateSyntheticSymbols();
594593 try self.allocateLinkeditSegment();
......@@ -2275,20 +2274,31 @@ fn allocateSections(self: *MachO) !void {
22752274 self.segments.items[index].vmaddr + self.segments.items[index].vmsize
22762275 else
22772276 0;
2277
2278 var prev_seg_id: u8 = if (self.pagezero_seg_index) |index| index + 1 else 0;
2279 {
2280 const seg = &self.segments.items[prev_seg_id];
2281 seg.vmaddr = vmaddr;
2282 seg.fileoff = 0;
2283 }
2284
22782285 vmaddr += headerpad;
22792286 var fileoff = headerpad;
22802287
22812288 const page_size = self.getPageSize();
22822289 const slice = self.sections.slice();
22832290
2284 var next_seg_id: u8 = if (self.pagezero_seg_index) |index| index + 1 else 0;
2285 for (slice.items(.header), slice.items(.segment_id)) |*header, seg_id| {
2286 defer next_seg_id = seg_id;
2287
2291 for (slice.items(.header), slice.items(.segment_id)) |*header, curr_seg_id| {
22882292 if (mem.indexOf(u8, header.segName(), "ZIG")) |_| continue;
2289 if (seg_id != next_seg_id) {
2293 if (prev_seg_id != curr_seg_id) {
2294 const prev_seg = &self.segments.items[prev_seg_id];
2295 const curr_seg = &self.segments.items[curr_seg_id];
2296 prev_seg.vmsize = vmaddr - prev_seg.vmaddr;
2297 prev_seg.filesize = fileoff - prev_seg.fileoff;
22902298 vmaddr = mem.alignForward(u64, vmaddr, page_size);
22912299 fileoff = mem.alignForward(u32, fileoff, page_size);
2300 curr_seg.vmaddr = vmaddr;
2301 curr_seg.fileoff = fileoff;
22922302 }
22932303
22942304 const alignment = try math.powi(u32, 2, header.@"align");
......@@ -2302,6 +2312,14 @@ fn allocateSections(self: *MachO) !void {
23022312 header.offset = fileoff;
23032313 fileoff += @intCast(header.size);
23042314 }
2315
2316 prev_seg_id = curr_seg_id;
2317 }
2318
2319 {
2320 const prev_seg = &self.segments.items[prev_seg_id];
2321 prev_seg.vmsize = vmaddr - prev_seg.vmaddr;
2322 prev_seg.filesize = fileoff - prev_seg.fileoff;
23052323 }
23062324
23072325 // TODO iterate over sections again, but consider only zig sections
......@@ -2335,51 +2353,6 @@ fn allocateSections(self: *MachO) !void {
23352353 }
23362354}
23372355
2338fn allocateSegments(self: *MachO) void {
2339 const page_size = self.getPageSize();
2340 var vmaddr = if (self.pagezero_seg_index) |index|
2341 self.segments.items[index].vmaddr + self.segments.items[index].vmsize
2342 else
2343 0;
2344 var fileoff: u64 = 0;
2345 const index = if (self.pagezero_seg_index) |index| index + 1 else 0;
2346 const last_index = self.linkedit_seg_index.?; // TODO: please clean this up!
2347
2348 const slice = self.sections.slice();
2349 var next_sect_id: u8 = 0;
2350 for (self.segments.items[index..last_index], index..last_index) |*seg, seg_id| {
2351 if (mem.indexOf(u8, seg.segName(), "ZIG")) |_| {
2352 vmaddr = mem.alignForward(u64, seg.vmaddr + seg.vmsize, page_size);
2353 if (mem.eql(u8, seg.segName(), "__BSS_ZIG")) {
2354 fileoff = mem.alignForward(u64, seg.fileoff + seg.filesize, page_size);
2355 }
2356 } else {
2357 seg.vmaddr = vmaddr;
2358 seg.fileoff = fileoff;
2359
2360 for (
2361 slice.items(.header)[next_sect_id..],
2362 slice.items(.segment_id)[next_sect_id..],
2363 ) |header, sid| {
2364 if (seg_id != sid) break;
2365
2366 vmaddr = header.addr + header.size;
2367 if (!header.isZerofill()) {
2368 fileoff = header.offset + header.size;
2369 }
2370
2371 next_sect_id += 1;
2372 }
2373
2374 vmaddr = mem.alignForward(u64, vmaddr, page_size);
2375 fileoff = mem.alignForward(u64, fileoff, page_size);
2376
2377 seg.vmsize = vmaddr - seg.vmaddr;
2378 seg.filesize = fileoff - seg.fileoff;
2379 }
2380 }
2381}
2382
23832356pub fn allocateAtoms(self: *MachO) void {
23842357 const slice = self.sections.slice();
23852358 for (slice.items(.header), slice.items(.atoms)) |header, atoms| {