| ... | @@ -3202,20 +3202,22 @@ fn detectAllocCollision(self: *MachO, start: u64, size: u64) ?u64 { | ... | @@ -3202,20 +3202,22 @@ fn detectAllocCollision(self: *MachO, start: u64, size: u64) ?u64 { |
| 3202 | | 3202 | |
| 3203 | const end = start + padToIdeal(size); | 3203 | const end = start + padToIdeal(size); |
| 3204 | | 3204 | |
| 3205 | for (self.sections.items(.header)) |header| { | 3205 | if (self.base.isRelocatable()) { |
| 3206 | if (header.isZerofill()) continue; | 3206 | for (self.sections.items(.header)) |header| { |
| 3207 | const increased_size = padToIdeal(header.size); | 3207 | if (header.isZerofill()) continue; |
| 3208 | const test_end = header.offset +| increased_size; | 3208 | const increased_size = padToIdeal(header.size); |
| 3209 | if (end > header.offset and start < test_end) { | 3209 | const test_end = header.offset +| increased_size; |
| 3210 | return test_end; | 3210 | if (end > header.offset and start < test_end) { |
| | 3211 | return test_end; |
| | 3212 | } |
| 3211 | } | 3213 | } |
| 3212 | } | 3214 | } else { |
| 3213 | | 3215 | for (self.segments.items) |seg| { |
| 3214 | for (self.segments.items) |seg| { | 3216 | const increased_size = padToIdeal(seg.filesize); |
| 3215 | const increased_size = padToIdeal(seg.filesize); | 3217 | const test_end = seg.fileoff +| increased_size; |
| 3216 | const test_end = seg.fileoff +| increased_size; | 3218 | if (end > seg.fileoff and start < test_end) { |
| 3217 | if (end > seg.fileoff and start < test_end) { | 3219 | return test_end; |
| 3218 | return test_end; | 3220 | } |
| 3219 | } | 3221 | } |
| 3220 | } | 3222 | } |
| 3221 | | 3223 | |
| ... | @@ -3223,27 +3225,29 @@ fn detectAllocCollision(self: *MachO, start: u64, size: u64) ?u64 { | ... | @@ -3223,27 +3225,29 @@ fn detectAllocCollision(self: *MachO, start: u64, size: u64) ?u64 { |
| 3223 | } | 3225 | } |
| 3224 | | 3226 | |
| 3225 | fn detectAllocCollisionVirtual(self: *MachO, start: u64, size: u64) ?u64 { | 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 | const end = start + padToIdeal(size); | 3228 | const end = start + padToIdeal(size); |
| 3233 | | 3229 | |
| 3234 | for (self.sections.items(.header)) |header| { | 3230 | if (self.base.isRelocatable()) { |
| 3235 | const increased_size = padToIdeal(header.size); | 3231 | for (self.sections.items(.header)) |header| { |
| 3236 | const test_end = header.addr +| increased_size; | 3232 | const increased_size = padToIdeal(header.size); |
| 3237 | if (end > header.addr and start < test_end) { | 3233 | const test_end = header.addr +| increased_size; |
| 3238 | return test_end; | 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| { | 3245 | for (self.segments.items) |seg| { |
| 3243 | const increased_size = padToIdeal(seg.vmsize); | 3246 | const increased_size = padToIdeal(seg.vmsize); |
| 3244 | const test_end = seg.vmaddr +| increased_size; | 3247 | const test_end = seg.vmaddr +| increased_size; |
| 3245 | if (end > seg.vmaddr and start < test_end) { | 3248 | if (end > seg.vmaddr and start < test_end) { |
| 3246 | return 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,21 +3256,29 @@ fn detectAllocCollisionVirtual(self: *MachO, start: u64, size: u64) ?u64 { |
| 3252 | | 3256 | |
| 3253 | pub fn allocatedSize(self: *MachO, start: u64) u64 { | 3257 | pub fn allocatedSize(self: *MachO, start: u64) u64 { |
| 3254 | if (start == 0) return 0; | 3258 | if (start == 0) return 0; |
| | 3259 | |
| 3255 | var min_pos: u64 = std.math.maxInt(u64); | 3260 | var min_pos: u64 = std.math.maxInt(u64); |
| 3256 | for (self.sections.items(.header)) |header| { | 3261 | |
| 3257 | if (header.offset <= start) continue; | 3262 | if (self.base.isRelocatable()) { |
| 3258 | if (header.offset < min_pos) min_pos = header.offset; | 3263 | for (self.sections.items(.header)) |header| { |
| 3259 | } | 3264 | if (header.offset <= start) continue; |
| 3260 | for (self.segments.items) |seg| { | 3265 | if (header.offset < min_pos) min_pos = header.offset; |
| 3261 | if (seg.fileoff <= start) continue; | 3266 | } |
| 3262 | if (seg.fileoff < min_pos) min_pos = seg.fileoff; | 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 | return min_pos - start; | 3274 | return min_pos - start; |
| 3265 | } | 3275 | } |
| 3266 | | 3276 | |
| 3267 | pub fn allocatedSizeVirtual(self: *MachO, start: u64) u64 { | 3277 | pub fn allocatedSizeVirtual(self: *MachO, start: u64) u64 { |
| 3268 | if (start == 0) return 0; | 3278 | if (start == 0) return 0; |
| | 3279 | |
| 3269 | var min_pos: u64 = std.math.maxInt(u64); | 3280 | var min_pos: u64 = std.math.maxInt(u64); |
| | 3281 | |
| 3270 | if (self.base.isRelocatable()) { | 3282 | if (self.base.isRelocatable()) { |
| 3271 | for (self.sections.items(.header)) |header| { | 3283 | for (self.sections.items(.header)) |header| { |
| 3272 | if (header.addr <= start) continue; | 3284 | if (header.addr <= start) continue; |