outline GC steps

This commit is contained in:
dzaima 2024-09-13 18:40:36 +03:00
parent 66f37aa299
commit bd6d40a4fa
2 changed files with 26 additions and 13 deletions

View File

@ -46,7 +46,7 @@ static void gc_resetTag(Value* x) {
x->mmInfo&= 0x7F; 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_rootSz; i++) gc_roots[i]();
for (u32 i = 0; i < gc_rootObjSz; i++) mm_visitP(gc_rootObjs[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]); 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); mm_visitP(x);
} }
static void gc_run(bool toplevel) { static NOINLINE void gc_run_toplevel_1() {
if (toplevel) {
mm_forHeap(gc_resetTag); mm_forHeap(gc_resetTag);
} else { }
static NOINLINE void gc_run_nontoplevel_1() {
visit_mode = GC_DEC_REFC; visit_mode = GC_DEC_REFC;
mm_forHeap(gcv2_unmark_visit); mm_forHeap(gcv2_unmark_visit);
}
static NOINLINE void gc_run_nontoplevel_2() {
visit_mode = GC_MARK; visit_mode = GC_MARK;
mm_forHeap(gc_visitRefcNonzero); mm_forHeap(gc_visitRefcNonzero);
}
static NOINLINE void gc_run_nontoplevel_3() {
visit_mode = GC_INC_REFC; visit_mode = GC_INC_REFC;
mm_forHeap(gcv2_visit); mm_forHeap(gcv2_visit);
} }
static NOINLINE void gc_run_tryFree() {
mm_forHeap(gc_tryFree);
}
static void gc_run(bool toplevel) {
if (toplevel) {
gc_run_toplevel_1();
} else {
gc_run_nontoplevel_1();
gc_run_nontoplevel_2();
gc_run_nontoplevel_3();
}
visit_mode = GC_MARK; visit_mode = GC_MARK;
gc_visitRoots(); gc_visitRoots();
mm_forHeap(gc_tryFree); gc_run_tryFree();
mm_freeFreedAndMerge(); mm_freeFreedAndMerge();
} }
#endif #endif

View File

@ -1,4 +1,3 @@
#include "../utils/file.h"
#include "../utils/interrupt.h" #include "../utils/interrupt.h"
#define AllocInfo BN(AllocInfo) #define AllocInfo BN(AllocInfo)
#define buckets BN(buckets) #define buckets BN(buckets)
@ -139,7 +138,7 @@ void BN(forFreedHeap)(V2v f) {
} }
} }
#if ALLOC_MODE==0 && ENABLE_GC #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 < 64; i++) buckets[i] = NULL;
for (u64 i = 0; i < alSize; i++) { for (u64 i = 0; i < alSize; i++) {