From a95e385217841da91c3e44674dbaa95fb613a153 Mon Sep 17 00:00:00 2001 From: lemon Date: Sun, 14 Sep 2025 11:03:27 +0200 Subject: change freearena for correctness --- c.c | 8 ++++---- common.h | 8 ++++---- mem.c | 13 +++++++------ regalloc.c | 1 - 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/c.c b/c.c index d059cda..6833722 100644 --- a/c.c +++ b/c.c @@ -3154,7 +3154,7 @@ stmt(struct comp *cm, struct function *fn) useblk(fn, end); expreffects(fn, &ex); putbranch(fn, begin); - freearena(atmpp); + freearena(&atmpp); } else if (!terminates) putbranch(fn, begin); useblk(fn, fl); } @@ -3222,7 +3222,7 @@ stmt(struct comp *cm, struct function *fn) EMITS expreffects(fn, &ex); break; } - freearena(cm->exarena); + freearena(&cm->exarena); return fn->curblk == NULL; } @@ -3459,8 +3459,8 @@ docomp(struct comp *cm) } else { if (ccopt.dbg.p && decl.ty.t) efmt("type %ty\n", decl.ty); } - freearena(cm->fnarena); - freearena(cm->exarena); + freearena(&cm->fnarena); + freearena(&cm->exarena); } while (st.more); } } diff --git a/common.h b/common.h index 6c2e1e9..7848fa1 100644 --- a/common.h +++ b/common.h @@ -344,8 +344,9 @@ struct arena { #define vec_of(T) struct { T *p; int _cap; uint n; } /* libc *alloc wrappers */ -extern void *xcalloc(size_t n, const char *); -extern void *xrealloc(void *, size_t n, const char *); +void *xcalloc(size_t n, const char *); +void *xrealloc(void *, size_t n, const char *); +void free(void *); #define xcalloc(n) xcalloc(n, __func__) #define xrealloc(p,n) xrealloc(p, n, __func__) @@ -383,13 +384,12 @@ alloccopy(struct arena **arena, const void *src, uint siz, uint align) { return memcpy(alloc(arena, siz, align), src, siz); } -void freearena(struct arena *); +void freearena(struct arena **); void vinit_(void **p, int *pcap, void *inlbuf, int cap, uint siz); void vpush_(void **p, int *pcap, uint *pn, uint siz); void *vpushn_(void **p, int *pcap, uint *pn, uint siz, const void *dat, uint ndat); void vresize_(void **p, int *pcap, uint *pn, uint siz, uint N); -extern void free(void *); #define VINIT(inlbuf, Cap) { (inlbuf), (Cap) } #define vfree(v) ((v)->_cap < 0 ? free((v)->p) : (void)0, memset((v), 0, sizeof*(v))) #define vinit(v, inlbuf, Cap) (vfree(v), vinit_((void **)&(v)->p, &(v)->_cap, inlbuf, (Cap), sizeof *(v)->p)) diff --git a/mem.c b/mem.c index b673986..8ed87eb 100644 --- a/mem.c +++ b/mem.c @@ -124,16 +124,17 @@ allocz(struct arena **par, uint siz, uint align) } void -freearena(struct arena *ar) +freearena(struct arena **par) { struct arena *prev; - for (; ar; ar = prev) { - prev = ar->prev; - if (ar->dyn) - free(ar); + for (; *par; *par = prev) { + prev = (*par)->prev; + if ((*par)->dyn) + free(*par); else { assert(!prev); - ar->n = 0; + (*par)->n = 0; + return; } } } diff --git a/regalloc.c b/regalloc.c index c71c803..b7516d0 100644 --- a/regalloc.c +++ b/regalloc.c @@ -1107,7 +1107,6 @@ regalloc(struct function *fn) irdump(fn); } fn->regusage = globusage; - freearena(ra.arena); } -- cgit v1.2.3