commit 72fc4559786dac5154ba344755758ba7a096be1b
parent 99ad19546d983957d4bdb5596fc323a260d73fa6
Author: Quentin Carbonneaux <quentin.carbonneaux@yale.edu>
Date: Tue, 6 Oct 2015 22:51:51 -0400
add pool memory management
Diffstat:
7 files changed, 54 insertions(+), 33 deletions(-)
diff --git a/lisc/isel.c b/lisc/isel.c
@@ -516,8 +516,6 @@ selcall(Fn *fn, Ins *i0, Ins *i1)
assert(stk == 8);
emit(OXPush, 1, R, CON_Z, R);
}
-
- free(ac);
}
static void
@@ -580,8 +578,6 @@ selpar(Fn *fn, Ins *i0, Ins *i1)
*curi++ = (Ins){OStorel, 0, R, {r1, r}};
}
}
-
- free(ac);
}
/* instruction selection
@@ -611,7 +607,6 @@ isel(Fn *fn)
ip = icpy(ip = i0, insb, curi - insb);
ip = icpy(ip, i, &b->ins[b->nins] - i);
b->nins = n;
- free(b->ins);
b->ins = i0;
/* lower function calls */
diff --git a/lisc/lisc.h b/lisc/lisc.h
@@ -272,8 +272,10 @@ void dumpts(Bits *, Tmp *, FILE *);
extern Typ typ[NTyp];
extern Ins insb[NIns], *curi;
void diag(char *);
+void *ealloc(size_t);
void *alloc(size_t);
-Blk *balloc();
+void freeall(void);
+Blk *balloc(void);
void emit(int, int, Ref, Ref, Ref);
void emiti(Ins);
int bcnt(Bits *);
diff --git a/lisc/main.c b/lisc/main.c
@@ -61,6 +61,7 @@ main(int ac, char *av[])
}
fn = parse(inf);
+ fclose(inf);
if (debug['P']) {
fprintf(stderr, "\n> After parsing:\n");
printfn(fn, stderr);
@@ -85,6 +86,7 @@ main(int ac, char *av[])
emitfn(fn, stdout);
else
fprintf(stderr, "\n");
+ freeall();
exit(0);
Usage:
diff --git a/lisc/rega.c b/lisc/rega.c
@@ -198,7 +198,6 @@ pmgen()
w = 0;
pmrec(status, i, &w);
}
- free(status);
}
static void
@@ -269,7 +268,6 @@ dopm(Blk *b, Ins *i, RMap *m)
ip = icpy(ir = ip, insb, curi - insb);
ip = icpy(ip, i1, &b->ins[b->nins] - i1);
b->nins = n;
- free(b->ins);
b->ins = i0;
return ir;
}
@@ -441,15 +439,10 @@ rega(Fn *fn)
}
}
for (b=fn->start; b; b=b->link)
- while ((p=b->phi)) {
+ while ((p=b->phi))
b->phi = p->link;
- free(p);
- }
fn->reg = regu;
- free(end);
- free(beg);
-
if (debug['R']) {
fprintf(stderr, "\n> After register allocation:\n");
printfn(fn, stderr);
diff --git a/lisc/spill.c b/lisc/spill.c
@@ -188,7 +188,7 @@ limit(Bits *b, int k, Bits *fst)
return 0;
if (nt > maxt) {
free(tarr);
- tarr = alloc(nt * sizeof tarr[0]);
+ tarr = ealloc(nt * sizeof tarr[0]);
maxt = nt;
}
i = 0;
diff --git a/lisc/ssa.c b/lisc/ssa.c
@@ -24,7 +24,6 @@ fillpreds(Fn *f)
for (b=f->start; b; b=b->link) {
b->npred = 0;
- free(b->pred);
b->pred = 0;
}
for (b=f->start; b; b=b->link) {
@@ -74,7 +73,6 @@ fillrpo(Fn *f)
b->id = -1;
n = 1 + rporec(f->start, f->nblk-1);
f->nblk -= n;
- free(f->rpo);
f->rpo = alloc(f->nblk * sizeof f->rpo[0]);
for (p=&f->start; *p;) {
b = *p;
@@ -197,7 +195,6 @@ topdef(Blk *b, Fn *f, int w)
void
ssafix(Fn *f, int t)
{
- char s[NString];
uint n;
int t0, t1, w;
Ref rt;
@@ -252,10 +249,6 @@ ssafix(Fn *f, int t)
b->jmp.arg = topdef(b, f, w);
}
/* add new temporaries */
- for (t1=f->ntmp; t1<t0; t1++) {
- snprintf(s, NString, "%s%d", f->tmp[t].name, t0-t1);
- newtmp(s, f);
- }
- free(top);
- free(bot);
+ for (t1=f->ntmp; t1<t0; t1++)
+ newtmp(f->tmp[t].name, f);
}
diff --git a/lisc/util.c b/lisc/util.c
@@ -13,14 +13,20 @@ struct Vec {
} align[];
};
+
enum {
- VMin = 2,
+ VMin = 32,
VMag = 0xcabba9e,
+ NPtr = 256,
};
Typ typ[NTyp];
Ins insb[NIns], *curi;
+static void *ptr[NPtr];
+static void **pool = ptr;
+static int nptr = 1;
+
void
diag(char *s)
{
@@ -30,18 +36,50 @@ diag(char *s)
}
void *
-alloc(size_t n)
+ealloc(size_t n)
{
void *p;
- if (n == 0)
- return 0;
p = calloc(1, n);
if (!p)
- abort();
+ diag("ealloc: out of memory");
return p;
}
+void *
+alloc(size_t n)
+{
+ void **pp;
+
+ if (n == 0)
+ return 0;
+ if (nptr >= NPtr) {
+ pp = ealloc(NPtr * sizeof(void *));
+ pp[0] = pool;
+ pool = pp;
+ nptr = 1;
+ }
+ return pool[nptr++] = ealloc(n);
+}
+
+void
+freeall()
+{
+ void **pp;
+
+ for (;;) {
+ for (pp = &pool[1]; pp < &pool[NPtr]; pp++)
+ free(*pp);
+ pp = pool[0];
+ if (!pp)
+ break;
+ free(pool);
+ pool = pp;
+ nptr = NPtr;
+ }
+ nptr = 1;
+}
+
Blk *
balloc()
{
@@ -87,7 +125,6 @@ bcnt(Bits *b)
void
idup(Ins **pd, Ins *s, ulong n)
{
- free(*pd);
*pd = alloc(n * sizeof(Ins));
memcpy(*pd, s, n * sizeof(Ins));
}
@@ -105,10 +142,10 @@ valloc(ulong len, size_t esz)
ulong cap;
Vec *v;
- v = alloc(len * esz + sizeof(Vec));
- v->mag = VMag;
for (cap=VMin; cap<len; cap*=2)
;
+ v = alloc(cap * esz + sizeof(Vec));
+ v->mag = VMag;
v->cap = cap;
v->esz = esz;
return v + 1;
@@ -126,7 +163,6 @@ vgrow(void *vp, ulong len)
return;
v1 = valloc(len, v->esz);
memcpy(v1, v+1, v->cap * v->esz);
- free(v);
*(Vec **)vp = v1;
}