From 6aa6f3a25722c2ec8ebaf6305dc53e68c0f9a971 Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Wed, 2 Jul 2025 11:38:30 +0200 Subject: [PATCH] Nofl space doesn't track ephemerons Instead, we rely on ephemerons being traced precisely, and thus having a tag word. --- src/gc-trace.h | 3 +-- src/mmc.c | 10 +--------- src/nofl-space.h | 15 +-------------- 3 files changed, 3 insertions(+), 25 deletions(-) diff --git a/src/gc-trace.h b/src/gc-trace.h index cc1dd2808..2906d94c7 100644 --- a/src/gc-trace.h +++ b/src/gc-trace.h @@ -31,8 +31,7 @@ static inline int gc_has_conservative_roots(void) { enum gc_trace_kind { GC_TRACE_PRECISELY, GC_TRACE_NONE, - GC_TRACE_CONSERVATIVELY, - GC_TRACE_EPHEMERON, + GC_TRACE_CONSERVATIVELY }; struct gc_trace_plan { diff --git a/src/mmc.c b/src/mmc.c index 0dce510b3..d81a400a4 100644 --- a/src/mmc.c +++ b/src/mmc.c @@ -435,10 +435,6 @@ trace_one(struct gc_ref ref, struct gc_heap *heap, heap, worker); break; } - case GC_TRACE_EPHEMERON: - gc_trace_ephemeron(gc_ref_heap_object(ref), tracer_visit, heap, - worker); - break; default: GC_CRASH(); } @@ -1154,11 +1150,7 @@ gc_write_barrier_slow(struct gc_mutator *mut, struct gc_ref obj, struct gc_ephemeron* gc_allocate_ephemeron(struct gc_mutator *mut) { - struct gc_ref ret = - gc_ref_from_heap_object(gc_allocate(mut, gc_ephemeron_size(), - GC_ALLOCATION_TAGGED)); - nofl_space_set_ephemeron_flag(ret); - return gc_ref_heap_object(ret); + return gc_allocate (mut, gc_ephemeron_size(), GC_ALLOCATION_TAGGED); } void diff --git a/src/nofl-space.h b/src/nofl-space.h index 699c69c2d..b9a9b6b25 100644 --- a/src/nofl-space.h +++ b/src/nofl-space.h @@ -250,7 +250,7 @@ enum nofl_metadata_byte { NOFL_METADATA_BYTE_TRACE_PRECISELY = 0, NOFL_METADATA_BYTE_TRACE_NONE = 8, NOFL_METADATA_BYTE_TRACE_CONSERVATIVELY = 16, - NOFL_METADATA_BYTE_TRACE_EPHEMERON = 24, + NOFL_METADATA_BYTE_TRACE_UNUSED = 24, NOFL_METADATA_BYTE_TRACE_KIND_MASK = 0|8|16|24, NOFL_METADATA_BYTE_PINNED = 16, NOFL_METADATA_BYTE_END = 32, @@ -971,15 +971,6 @@ nofl_finish_sweeping(struct nofl_allocator *alloc, while (nofl_allocator_next_hole(alloc, space, 0)) {} } -static void -nofl_space_set_ephemeron_flag(struct gc_ref ref) { - if (gc_has_conservative_intraheap_edges()) { - uint8_t *metadata = nofl_metadata_byte_for_object(ref); - uint8_t byte = *metadata & ~NOFL_METADATA_BYTE_TRACE_KIND_MASK; - *metadata = byte | NOFL_METADATA_BYTE_TRACE_EPHEMERON; - } -} - struct gc_trace_worker; static inline int @@ -1821,8 +1812,6 @@ nofl_metadata_byte_trace_kind(uint8_t byte) #if GC_CONSERVATIVE_TRACE case NOFL_METADATA_BYTE_TRACE_CONSERVATIVELY: return GC_TRACE_CONSERVATIVELY; - case NOFL_METADATA_BYTE_TRACE_EPHEMERON: - return GC_TRACE_EPHEMERON; #endif default: GC_CRASH(); @@ -1842,8 +1831,6 @@ nofl_space_object_trace_plan(struct nofl_space *space, struct gc_ref ref) { size_t granules = nofl_space_live_object_granules(loc); return (struct gc_trace_plan){ kind, granules * NOFL_GRANULE_SIZE }; } - case GC_TRACE_EPHEMERON: - return (struct gc_trace_plan){ kind, }; #endif default: GC_CRASH();