| ... | ... | @@ -3202,20 +3202,22 @@ fn detectAllocCollision(self: *MachO, start: u64, size: u64) ?u64 { |
| 3202 | 3202 | |
| 3203 | 3203 | const end = start + padToIdeal(size); |
| 3204 | 3204 | |
| 3205 | | for (self.sections.items(.header)) |header| { |
| 3206 | | if (header.isZerofill()) continue; |
| 3207 | | const increased_size = padToIdeal(header.size); |
| 3208 | | const test_end = header.offset +| increased_size; |
| 3209 | | if (end > header.offset and start < test_end) { |
| 3210 | | return test_end; |
| 3205 | if (self.base.isRelocatable()) { |
| 3206 | for (self.sections.items(.header)) |header| { |
| 3207 | if (header.isZerofill()) continue; |
| 3208 | const increased_size = padToIdeal(header.size); |
| 3209 | const test_end = header.offset +| increased_size; |
| 3210 | if (end > header.offset and start < test_end) { |
| 3211 | return test_end; |
| 3212 | } |
| 3211 | 3213 | } |
| 3212 | | } |
| 3213 | | |
| 3214 | | for (self.segments.items) |seg| { |
| 3215 | | const increased_size = padToIdeal(seg.filesize); |
| 3216 | | const test_end = seg.fileoff +| increased_size; |
| 3217 | | if (end > seg.fileoff and start < test_end) { |
| 3218 | | return test_end; |
| 3214 | } else { |
| 3215 | for (self.segments.items) |seg| { |
| 3216 | const increased_size = padToIdeal(seg.filesize); |
| 3217 | const test_end = seg.fileoff +| increased_size; |
| 3218 | if (end > seg.fileoff and start < test_end) { |
| 3219 | return test_end; |
| 3220 | } |
| 3219 | 3221 | } |
| 3220 | 3222 | } |
| 3221 | 3223 | |
| ... | ... | @@ -3223,27 +3225,29 @@ fn detectAllocCollision(self: *MachO, start: u64, size: u64) ?u64 { |
| 3223 | 3225 | } |
| 3224 | 3226 | |
| 3225 | 3227 | fn detectAllocCollisionVirtual(self: *MachO, start: u64, size: u64) ?u64 { |
| 3226 | | // Conservatively commit one page size as reserved space for the headers as we |
| 3227 | | // expect it to grow and everything else be moved in flush anyhow. |
| 3228 | | const header_size = self.getPageSize(); |
| 3229 | | if (start < header_size) |
| 3230 | | return header_size; |
| 3231 | | |
| 3232 | 3228 | const end = start + padToIdeal(size); |
| 3233 | 3229 | |
| 3234 | | for (self.sections.items(.header)) |header| { |
| 3235 | | const increased_size = padToIdeal(header.size); |
| 3236 | | const test_end = header.addr +| increased_size; |
| 3237 | | if (end > header.addr and start < test_end) { |
| 3238 | | return test_end; |
| 3230 | if (self.base.isRelocatable()) { |
| 3231 | for (self.sections.items(.header)) |header| { |
| 3232 | const increased_size = padToIdeal(header.size); |
| 3233 | const test_end = header.addr +| increased_size; |
| 3234 | if (end > header.addr and start < test_end) { |
| 3235 | return test_end; |
| 3236 | } |
| 3239 | 3237 | } |
| 3240 | | } |
| 3238 | } else { |
| 3239 | // Conservatively commit one page size as reserved space for the headers as we |
| 3240 | // expect it to grow and everything else be moved in flush anyhow. |
| 3241 | const header_size = self.getPageSize(); |
| 3242 | if (start < header_size) |
| 3243 | return header_size; |
| 3241 | 3244 | |
| 3242 | | for (self.segments.items) |seg| { |
| 3243 | | const increased_size = padToIdeal(seg.vmsize); |
| 3244 | | const test_end = seg.vmaddr +| increased_size; |
| 3245 | | if (end > seg.vmaddr and start < test_end) { |
| 3246 | | return test_end; |
| 3245 | for (self.segments.items) |seg| { |
| 3246 | const increased_size = padToIdeal(seg.vmsize); |
| 3247 | const test_end = seg.vmaddr +| increased_size; |
| 3248 | if (end > seg.vmaddr and start < test_end) { |
| 3249 | return test_end; |
| 3250 | } |
| 3247 | 3251 | } |
| 3248 | 3252 | } |
| 3249 | 3253 | |
| ... | ... | @@ -3252,21 +3256,29 @@ fn detectAllocCollisionVirtual(self: *MachO, start: u64, size: u64) ?u64 { |
| 3252 | 3256 | |
| 3253 | 3257 | pub fn allocatedSize(self: *MachO, start: u64) u64 { |
| 3254 | 3258 | if (start == 0) return 0; |
| 3259 | |
| 3255 | 3260 | var min_pos: u64 = std.math.maxInt(u64); |
| 3256 | | for (self.sections.items(.header)) |header| { |
| 3257 | | if (header.offset <= start) continue; |
| 3258 | | if (header.offset < min_pos) min_pos = header.offset; |
| 3259 | | } |
| 3260 | | for (self.segments.items) |seg| { |
| 3261 | | if (seg.fileoff <= start) continue; |
| 3262 | | if (seg.fileoff < min_pos) min_pos = seg.fileoff; |
| 3261 | |
| 3262 | if (self.base.isRelocatable()) { |
| 3263 | for (self.sections.items(.header)) |header| { |
| 3264 | if (header.offset <= start) continue; |
| 3265 | if (header.offset < min_pos) min_pos = header.offset; |
| 3266 | } |
| 3267 | } else { |
| 3268 | for (self.segments.items) |seg| { |
| 3269 | if (seg.fileoff <= start) continue; |
| 3270 | if (seg.fileoff < min_pos) min_pos = seg.fileoff; |
| 3271 | } |
| 3263 | 3272 | } |
| 3273 | |
| 3264 | 3274 | return min_pos - start; |
| 3265 | 3275 | } |
| 3266 | 3276 | |
| 3267 | 3277 | pub fn allocatedSizeVirtual(self: *MachO, start: u64) u64 { |
| 3268 | 3278 | if (start == 0) return 0; |
| 3279 | |
| 3269 | 3280 | var min_pos: u64 = std.math.maxInt(u64); |
| 3281 | |
| 3270 | 3282 | if (self.base.isRelocatable()) { |
| 3271 | 3283 | for (self.sections.items(.header)) |header| { |
| 3272 | 3284 | if (header.addr <= start) continue; |