Commit 5c30c23fc4

Jakub Konka <kubkon@jakubkonka.com>
2024-01-20 18:03:10
macho: get rid of allocateSegments
1 parent aef2c91
Changed files (1)
src
src/link/MachO.zig
@@ -588,7 +588,6 @@ pub fn flushModule(self: *MachO, arena: Allocator, prog_node: *std.Progress.Node
     try self.initSegments();
 
     try self.allocateSections();
-    self.allocateSegments();
     self.allocateAtoms();
     self.allocateSyntheticSymbols();
     try self.allocateLinkeditSegment();
@@ -2275,20 +2274,31 @@ fn allocateSections(self: *MachO) !void {
         self.segments.items[index].vmaddr + self.segments.items[index].vmsize
     else
         0;
+
+    var prev_seg_id: u8 = if (self.pagezero_seg_index) |index| index + 1 else 0;
+    {
+        const seg = &self.segments.items[prev_seg_id];
+        seg.vmaddr = vmaddr;
+        seg.fileoff = 0;
+    }
+
     vmaddr += headerpad;
     var fileoff = headerpad;
 
     const page_size = self.getPageSize();
     const slice = self.sections.slice();
 
-    var next_seg_id: u8 = if (self.pagezero_seg_index) |index| index + 1 else 0;
-    for (slice.items(.header), slice.items(.segment_id)) |*header, seg_id| {
-        defer next_seg_id = seg_id;
-
+    for (slice.items(.header), slice.items(.segment_id)) |*header, curr_seg_id| {
         if (mem.indexOf(u8, header.segName(), "ZIG")) |_| continue;
-        if (seg_id != next_seg_id) {
+        if (prev_seg_id != curr_seg_id) {
+            const prev_seg = &self.segments.items[prev_seg_id];
+            const curr_seg = &self.segments.items[curr_seg_id];
+            prev_seg.vmsize = vmaddr - prev_seg.vmaddr;
+            prev_seg.filesize = fileoff - prev_seg.fileoff;
             vmaddr = mem.alignForward(u64, vmaddr, page_size);
             fileoff = mem.alignForward(u32, fileoff, page_size);
+            curr_seg.vmaddr = vmaddr;
+            curr_seg.fileoff = fileoff;
         }
 
         const alignment = try math.powi(u32, 2, header.@"align");
@@ -2302,6 +2312,14 @@ fn allocateSections(self: *MachO) !void {
             header.offset = fileoff;
             fileoff += @intCast(header.size);
         }
+
+        prev_seg_id = curr_seg_id;
+    }
+
+    {
+        const prev_seg = &self.segments.items[prev_seg_id];
+        prev_seg.vmsize = vmaddr - prev_seg.vmaddr;
+        prev_seg.filesize = fileoff - prev_seg.fileoff;
     }
 
     // TODO iterate over sections again, but consider only zig sections
@@ -2335,51 +2353,6 @@ fn allocateSections(self: *MachO) !void {
     }
 }
 
-fn allocateSegments(self: *MachO) void {
-    const page_size = self.getPageSize();
-    var vmaddr = if (self.pagezero_seg_index) |index|
-        self.segments.items[index].vmaddr + self.segments.items[index].vmsize
-    else
-        0;
-    var fileoff: u64 = 0;
-    const index = if (self.pagezero_seg_index) |index| index + 1 else 0;
-    const last_index = self.linkedit_seg_index.?; // TODO: please clean this up!
-
-    const slice = self.sections.slice();
-    var next_sect_id: u8 = 0;
-    for (self.segments.items[index..last_index], index..last_index) |*seg, seg_id| {
-        if (mem.indexOf(u8, seg.segName(), "ZIG")) |_| {
-            vmaddr = mem.alignForward(u64, seg.vmaddr + seg.vmsize, page_size);
-            if (mem.eql(u8, seg.segName(), "__BSS_ZIG")) {
-                fileoff = mem.alignForward(u64, seg.fileoff + seg.filesize, page_size);
-            }
-        } else {
-            seg.vmaddr = vmaddr;
-            seg.fileoff = fileoff;
-
-            for (
-                slice.items(.header)[next_sect_id..],
-                slice.items(.segment_id)[next_sect_id..],
-            ) |header, sid| {
-                if (seg_id != sid) break;
-
-                vmaddr = header.addr + header.size;
-                if (!header.isZerofill()) {
-                    fileoff = header.offset + header.size;
-                }
-
-                next_sect_id += 1;
-            }
-
-            vmaddr = mem.alignForward(u64, vmaddr, page_size);
-            fileoff = mem.alignForward(u64, fileoff, page_size);
-
-            seg.vmsize = vmaddr - seg.vmaddr;
-            seg.filesize = fileoff - seg.fileoff;
-        }
-    }
-}
-
 pub fn allocateAtoms(self: *MachO) void {
     const slice = self.sections.slice();
     for (slice.items(.header), slice.items(.atoms)) |header, atoms| {