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...@@ -588,7 +588,6 @@ pub fn flushModule(self: *MachO, arena: Allocator, prog_node: *std.Progress.Node
588 try self.initSegments();588 try self.initSegments();
589589
590 try self.allocateSections();590 try self.allocateSections();
591 self.allocateSegments();
592 self.allocateAtoms();591 self.allocateAtoms();
593 self.allocateSyntheticSymbols();592 self.allocateSyntheticSymbols();
594 try self.allocateLinkeditSegment();593 try self.allocateLinkeditSegment();
...@@ -2275,20 +2274,31 @@ fn allocateSections(self: *MachO) !void {...@@ -2275,20 +2274,31 @@ fn allocateSections(self: *MachO) !void {
2275 self.segments.items[index].vmaddr + self.segments.items[index].vmsize2274 self.segments.items[index].vmaddr + self.segments.items[index].vmsize
2276 else2275 else
2277 0;2276 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
2278 vmaddr += headerpad;2285 vmaddr += headerpad;
2279 var fileoff = headerpad;2286 var fileoff = headerpad;
22802287
2281 const page_size = self.getPageSize();2288 const page_size = self.getPageSize();
2282 const slice = self.sections.slice();2289 const slice = self.sections.slice();
22832290
2284 var next_seg_id: u8 = if (self.pagezero_seg_index) |index| index + 1 else 0;2291 for (slice.items(.header), slice.items(.segment_id)) |*header, curr_seg_id| {
2285 for (slice.items(.header), slice.items(.segment_id)) |*header, seg_id| {
2286 defer next_seg_id = seg_id;
2287
2288 if (mem.indexOf(u8, header.segName(), "ZIG")) |_| continue;2292 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;
2290 vmaddr = mem.alignForward(u64, vmaddr, page_size);2298 vmaddr = mem.alignForward(u64, vmaddr, page_size);
2291 fileoff = mem.alignForward(u32, fileoff, page_size);2299 fileoff = mem.alignForward(u32, fileoff, page_size);
2300 curr_seg.vmaddr = vmaddr;
2301 curr_seg.fileoff = fileoff;
2292 }2302 }
22932303
2294 const alignment = try math.powi(u32, 2, header.@"align");2304 const alignment = try math.powi(u32, 2, header.@"align");
...@@ -2302,6 +2312,14 @@ fn allocateSections(self: *MachO) !void {...@@ -2302,6 +2312,14 @@ fn allocateSections(self: *MachO) !void {
2302 header.offset = fileoff;2312 header.offset = fileoff;
2303 fileoff += @intCast(header.size);2313 fileoff += @intCast(header.size);
2304 }2314 }
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;
2305 }2323 }
23062324
2307 // TODO iterate over sections again, but consider only zig sections2325 // TODO iterate over sections again, but consider only zig sections
...@@ -2335,51 +2353,6 @@ fn allocateSections(self: *MachO) !void {...@@ -2335,51 +2353,6 @@ fn allocateSections(self: *MachO) !void {
2335 }2353 }
2336}2354}
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
2383pub fn allocateAtoms(self: *MachO) void {2356pub fn allocateAtoms(self: *MachO) void {
2384 const slice = self.sections.slice();2357 const slice = self.sections.slice();
2385 for (slice.items(.header), slice.items(.atoms)) |header, atoms| {2358 for (slice.items(.header), slice.items(.atoms)) |header, atoms| {