From e6fbab42185f4fb4e3a3b1e3e93eaa5d3d81b7c7 Mon Sep 17 00:00:00 2001 From: lemon Date: Sat, 20 Dec 2025 17:59:40 +0100 Subject: backend: unify pass memory allocation strategies It was all over the place for temporary data structures used by individual passes. Now there is an arena specifically for that, which is nicer. --- ir/ir.c | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'ir/ir.c') diff --git a/ir/ir.c b/ir/ir.c index 5f1797c..35a36b4 100644 --- a/ir/ir.c +++ b/ir/ir.c @@ -45,6 +45,8 @@ irinit(struct function *fn) static union ref *phisbuf[64]; static struct irdat datsbuf[64]; + assert(fn->arena && !fn->passarena); + ninstr = 0; instrfreelist = -1; vinit(&calltab, callsbuf, countof(callsbuf)); @@ -629,6 +631,9 @@ void irfini(struct function *fn) { extern int nerror; + static union { char m[sizeof(struct arena) + (4<<10)]; struct arena *_align; } amem; + struct arena *passarena = (void *)&amem.m; + fn->passarena = &passarena; if (nerror) { freefn(fn); return; @@ -638,10 +643,12 @@ irfini(struct function *fn) lowerintrin(fn); if (ccopt.o > OPT0) { mem2reg(fn); + freearena(fn->passarena); copyopt(fn); } if (ccopt.o >= OPT1) { simpl(fn); + freearena(fn->passarena); } if (ccopt.dbg.o) { bfmt(ccopt.dbgout, "<< Before isel >>\n"); @@ -649,9 +656,11 @@ irfini(struct function *fn) } mctarg->isel(fn); regalloc(fn); + freearena(fn->passarena); if (!ccopt.dbg.any) mctarg->emit(fn); + freearena(fn->passarena); freefn(fn); } -- cgit v1.2.3