From bd6d40a4fa05c59e5e5e0ef8255e9073b0c864c8 Mon Sep 17 00:00:00 2001 From: dzaima Date: Fri, 13 Sep 2024 18:40:36 +0300 Subject: [PATCH] outline GC steps --- src/opt/gc.c | 36 +++++++++++++++++++++++++----------- src/opt/mm_buddyTemplate.c | 3 +-- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/src/opt/gc.c b/src/opt/gc.c index 77adc56e..0c336452 100644 --- a/src/opt/gc.c +++ b/src/opt/gc.c @@ -46,7 +46,7 @@ static void gc_resetTag(Value* x) { x->mmInfo&= 0x7F; } -void gc_visitRoots() { +NOINLINE void gc_visitRoots() { for (u32 i = 0; i < gc_rootSz; i++) gc_roots[i](); for (u32 i = 0; i < gc_rootObjSz; i++) mm_visitP(gc_rootObjs[i]); for (u32 i = 0; i < gc_rootBRefsSz; i++) mm_visit(*gc_rootBRefs[i]); @@ -145,24 +145,38 @@ static void gcv2_unmark_visit(Value* x) { mm_visitP(x); } + static NOINLINE void gc_run_toplevel_1() { + mm_forHeap(gc_resetTag); + } + static NOINLINE void gc_run_nontoplevel_1() { + visit_mode = GC_DEC_REFC; + mm_forHeap(gcv2_unmark_visit); + } + static NOINLINE void gc_run_nontoplevel_2() { + visit_mode = GC_MARK; + mm_forHeap(gc_visitRefcNonzero); + } + static NOINLINE void gc_run_nontoplevel_3() { + visit_mode = GC_INC_REFC; + mm_forHeap(gcv2_visit); + } + static NOINLINE void gc_run_tryFree() { + mm_forHeap(gc_tryFree); + } + static void gc_run(bool toplevel) { if (toplevel) { - mm_forHeap(gc_resetTag); + gc_run_toplevel_1(); } else { - visit_mode = GC_DEC_REFC; - mm_forHeap(gcv2_unmark_visit); - - visit_mode = GC_MARK; - mm_forHeap(gc_visitRefcNonzero); - - visit_mode = GC_INC_REFC; - mm_forHeap(gcv2_visit); + gc_run_nontoplevel_1(); + gc_run_nontoplevel_2(); + gc_run_nontoplevel_3(); } visit_mode = GC_MARK; gc_visitRoots(); - mm_forHeap(gc_tryFree); + gc_run_tryFree(); mm_freeFreedAndMerge(); } #endif diff --git a/src/opt/mm_buddyTemplate.c b/src/opt/mm_buddyTemplate.c index facf2997..5be1a05c 100644 --- a/src/opt/mm_buddyTemplate.c +++ b/src/opt/mm_buddyTemplate.c @@ -1,4 +1,3 @@ -#include "../utils/file.h" #include "../utils/interrupt.h" #define AllocInfo BN(AllocInfo) #define buckets BN(buckets) @@ -139,7 +138,7 @@ void BN(forFreedHeap)(V2v f) { } } #if ALLOC_MODE==0 && ENABLE_GC -static void BN(freeFreedAndMerge)() { +static NOINLINE void BN(freeFreedAndMerge)() { for (u64 i = 0; i < 64; i++) buckets[i] = NULL; for (u64 i = 0; i < alSize; i++) {