aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2025-09-14 11:03:27 +0200
committerlemon <lsof@mailbox.org>2025-09-14 11:03:27 +0200
commita95e385217841da91c3e44674dbaa95fb613a153 (patch)
treea241ddf7c0b83fff1e45ccdf7feabaded9e4ed8d
parent0ca9f9fec545c6c73f9dae24c68271d792906a62 (diff)
change freearena for correctness
-rw-r--r--c.c8
-rw-r--r--common.h8
-rw-r--r--mem.c13
-rw-r--r--regalloc.c1
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);
}