aboutsummaryrefslogtreecommitdiff
path: root/src/link/MachO.zig
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2024-02-08 13:22:48 +0100
committerJakub Konka <kubkon@jakubkonka.com>2024-02-08 13:22:48 +0100
commitdcb7f5791a206d7713bea153a8d94f22dfb155a9 (patch)
treee4b0e3196d2d1a50ed990d6b05c75bd6e8909342 /src/link/MachO.zig
parent102846315c1be4518ce7783717dc1ceb133b66cf (diff)
downloadzig-dcb7f5791a206d7713bea153a8d94f22dfb155a9.tar.gz
zig-dcb7f5791a206d7713bea153a8d94f22dfb155a9.zip
macho: alloc improvement for relocatable
Diffstat (limited to 'src/link/MachO.zig')
-rw-r--r--src/link/MachO.zig86
1 files changed, 49 insertions, 37 deletions
diff --git a/src/link/MachO.zig b/src/link/MachO.zig
index d018cc01a2..e6923bbbe9 100644
--- a/src/link/MachO.zig
+++ b/src/link/MachO.zig
@@ -3202,20 +3202,22 @@ fn detectAllocCollision(self: *MachO, start: u64, size: u64) ?u64 {
const end = start + padToIdeal(size);
- for (self.sections.items(.header)) |header| {
- if (header.isZerofill()) continue;
- const increased_size = padToIdeal(header.size);
- const test_end = header.offset +| increased_size;
- if (end > header.offset and start < test_end) {
- return test_end;
+ if (self.base.isRelocatable()) {
+ for (self.sections.items(.header)) |header| {
+ if (header.isZerofill()) continue;
+ const increased_size = padToIdeal(header.size);
+ const test_end = header.offset +| increased_size;
+ if (end > header.offset and start < test_end) {
+ return test_end;
+ }
}
- }
-
- for (self.segments.items) |seg| {
- const increased_size = padToIdeal(seg.filesize);
- const test_end = seg.fileoff +| increased_size;
- if (end > seg.fileoff and start < test_end) {
- return test_end;
+ } else {
+ for (self.segments.items) |seg| {
+ const increased_size = padToIdeal(seg.filesize);
+ const test_end = seg.fileoff +| increased_size;
+ if (end > seg.fileoff and start < test_end) {
+ return test_end;
+ }
}
}
@@ -3223,27 +3225,29 @@ fn detectAllocCollision(self: *MachO, start: u64, size: u64) ?u64 {
}
fn detectAllocCollisionVirtual(self: *MachO, start: u64, size: u64) ?u64 {
- // Conservatively commit one page size as reserved space for the headers as we
- // expect it to grow and everything else be moved in flush anyhow.
- const header_size = self.getPageSize();
- if (start < header_size)
- return header_size;
-
const end = start + padToIdeal(size);
- for (self.sections.items(.header)) |header| {
- const increased_size = padToIdeal(header.size);
- const test_end = header.addr +| increased_size;
- if (end > header.addr and start < test_end) {
- return test_end;
+ if (self.base.isRelocatable()) {
+ for (self.sections.items(.header)) |header| {
+ const increased_size = padToIdeal(header.size);
+ const test_end = header.addr +| increased_size;
+ if (end > header.addr and start < test_end) {
+ return test_end;
+ }
}
- }
+ } else {
+ // Conservatively commit one page size as reserved space for the headers as we
+ // expect it to grow and everything else be moved in flush anyhow.
+ const header_size = self.getPageSize();
+ if (start < header_size)
+ return header_size;
- for (self.segments.items) |seg| {
- const increased_size = padToIdeal(seg.vmsize);
- const test_end = seg.vmaddr +| increased_size;
- if (end > seg.vmaddr and start < test_end) {
- return test_end;
+ for (self.segments.items) |seg| {
+ const increased_size = padToIdeal(seg.vmsize);
+ const test_end = seg.vmaddr +| increased_size;
+ if (end > seg.vmaddr and start < test_end) {
+ return test_end;
+ }
}
}
@@ -3252,21 +3256,29 @@ fn detectAllocCollisionVirtual(self: *MachO, start: u64, size: u64) ?u64 {
pub fn allocatedSize(self: *MachO, start: u64) u64 {
if (start == 0) return 0;
+
var min_pos: u64 = std.math.maxInt(u64);
- for (self.sections.items(.header)) |header| {
- if (header.offset <= start) continue;
- if (header.offset < min_pos) min_pos = header.offset;
- }
- for (self.segments.items) |seg| {
- if (seg.fileoff <= start) continue;
- if (seg.fileoff < min_pos) min_pos = seg.fileoff;
+
+ if (self.base.isRelocatable()) {
+ for (self.sections.items(.header)) |header| {
+ if (header.offset <= start) continue;
+ if (header.offset < min_pos) min_pos = header.offset;
+ }
+ } else {
+ for (self.segments.items) |seg| {
+ if (seg.fileoff <= start) continue;
+ if (seg.fileoff < min_pos) min_pos = seg.fileoff;
+ }
}
+
return min_pos - start;
}
pub fn allocatedSizeVirtual(self: *MachO, start: u64) u64 {
if (start == 0) return 0;
+
var min_pos: u64 = std.math.maxInt(u64);
+
if (self.base.isRelocatable()) {
for (self.sections.items(.header)) |header| {
if (header.addr <= start) continue;