wingo pushed a commit to branch wip-whippet in repository guile. commit e65c81518d8457b42ccf548de1098567dc2632b9 Author: Andy Wingo <wi...@igalia.com> AuthorDate: Fri Jan 10 16:02:37 2025 +0100
Fix copy space compilation in debug mode Also add copy_space_should_promote --- src/copy-space.h | 55 ++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 48 insertions(+), 7 deletions(-) diff --git a/src/copy-space.h b/src/copy-space.h index 21e2f3719..7f4331b58 100644 --- a/src/copy-space.h +++ b/src/copy-space.h @@ -82,8 +82,7 @@ struct copy_space_slab { STATIC_ASSERT_EQ(sizeof(struct copy_space_slab), COPY_SPACE_SLAB_SIZE); static inline struct copy_space_block* -copy_space_block_header(struct copy_space_block_payload *payload) { - uintptr_t addr = (uintptr_t) payload; +copy_space_block_for_addr(uintptr_t addr) { uintptr_t base = align_down(addr, COPY_SPACE_SLAB_SIZE); struct copy_space_slab *slab = (struct copy_space_slab*) base; uintptr_t block_idx = @@ -91,6 +90,11 @@ copy_space_block_header(struct copy_space_block_payload *payload) { return &slab->headers[block_idx - COPY_SPACE_HEADER_BLOCKS_PER_SLAB]; } +static inline struct copy_space_block* +copy_space_block_header(struct copy_space_block_payload *payload) { + return copy_space_block_for_addr((uintptr_t) payload); +} + static inline struct copy_space_block_payload* copy_space_block_payload(struct copy_space_block *block) { uintptr_t addr = (uintptr_t) block; @@ -469,12 +473,34 @@ copy_space_finish_gc(struct copy_space *space) { space->in_gc = 0; } +static int +copy_space_can_allocate(struct copy_space *space, size_t bytes) { + // With lock! + for (struct copy_space_block *empties = space->empty.list.head; + empties; + empties = empties->next) { + if (bytes <= COPY_SPACE_REGION_SIZE) return 1; + bytes -= COPY_SPACE_REGION_SIZE; + } + return 0; +} + static void copy_space_add_to_allocation_counter(struct copy_space *space, uintptr_t *counter) { *counter += space->allocated_bytes - space->allocated_bytes_at_last_gc; } +static inline int +copy_space_contains_address(struct copy_space *space, uintptr_t addr) { + return extents_contain_addr(space->extents, addr); +} + +static inline int +copy_space_contains(struct copy_space *space, struct gc_ref ref) { + return copy_space_contains_address(space, gc_ref_value(ref)); +} + static void copy_space_gc_during_evacuation(void *data) { // If space is really tight and reordering of objects during @@ -617,11 +643,6 @@ copy_space_forward_if_traced(struct copy_space *space, struct gc_edge edge, return copy_space_forward_if_traced_nonatomic(space, edge, old_ref); } -static inline int -copy_space_contains(struct copy_space *space, struct gc_ref ref) { - return extents_contain_addr(space->extents, gc_ref_value(ref)); -} - static int copy_space_is_aligned(struct copy_space *space) { return space->flags & COPY_SPACE_ALIGNED; @@ -655,6 +676,12 @@ copy_space_contains_address_aligned(struct copy_space *space, uintptr_t addr) { return (addr - low_addr) < size; } +static inline int +copy_space_contains_edge_aligned(struct copy_space *space, + struct gc_edge edge) { + return copy_space_contains_address_aligned(space, gc_edge_address(edge)); +} + static uint8_t* copy_space_field_logged_byte(struct gc_edge edge) { uintptr_t addr = gc_edge_address(edge); @@ -672,6 +699,20 @@ copy_space_field_logged_bit(struct gc_edge edge) { return 1 << (field % 8); } +static inline int +copy_space_should_promote(struct copy_space *space, struct gc_ref ref) { + GC_ASSERT(copy_space_contains(space, ref)); + uintptr_t addr = gc_ref_value(ref); + struct copy_space_block *block = copy_space_block_for_addr(gc_ref_value(ref)); + GC_ASSERT_EQ(copy_space_object_region(ref), space->active_region ^ 1); + return block->is_survivor[space->active_region ^ 1]; +} + +static int +copy_space_contains_edge(struct copy_space *space, struct gc_edge edge) { + return copy_space_contains_address(space, gc_edge_address(edge)); +} + static int copy_space_remember_edge(struct copy_space *space, struct gc_edge edge) { GC_ASSERT(copy_space_contains_edge(space, edge));