Aria

A low-level systems programming language
git clone git://git.m21c.me/Aria.git
Log | Files | Refs | README | LICENSE

commit b4df549b3d60fcbb55edcbc926e02b4d23be3447
parent e33fd2345f8a8d0775d761041c65256e4cfc81e0
Author: m21c <ho*******@gmail.com>
Date:   Tue, 16 Jun 2026 23:06:23 +0200

worked on mem management

Diffstat:
Mcompiler.c | 190++++++++++++++++++++++++++++++++++++++++++++-----------------------------------
1 file changed, 106 insertions(+), 84 deletions(-)

diff --git a/compiler.c b/compiler.c @@ -604,6 +604,9 @@ struct Env { bool pending; Env *pendingnext, *pendingprev; + + /* carry on source for memory management*/ + SourceArenas *arenas; }; typedef @@ -643,6 +646,7 @@ struct Source { Node *lastis; /* stack-alloc save state */ + SourceArenas arenas; } Source; struct AnnotParam { @@ -808,7 +812,6 @@ struct Analysis { // @section global-vars {{{ Source testsource; -SourceArenas sourcearenas; SourceArenas *arenas; @@ -1983,10 +1986,10 @@ getunarysuffix(Source *source) Node *poolednodes; int poolednodecount, totalnodecount; -#define tokennode(source, lhs) makenode(&(source)->tok, (lhs)) +#define tokennode(source, lhs) makenode(&(source)->arenas, &(source)->tok, (lhs)) static Node * -makenode(Node *orig, Node *lhs) +makenode(SourceArenas *arenas, Node *orig, Node *lhs) { Node *node; @@ -2063,7 +2066,7 @@ deletenode(Node *node) // @section type-struct {{{ static Type * -maketype(SrcLoc *loc, Type *orig, Type *target) +maketype(SourceArenas *arenas, SrcLoc *loc, Type *orig, Type *target) { Type *ty = myalloc(&arenas->type, Type); @@ -2081,7 +2084,7 @@ maketype(SrcLoc *loc, Type *orig, Type *target) // @section annotation {{{ static Annot * -makeannot(SrcLoc *loc, int key) +makeannot(SourceArenas *arenas, SrcLoc *loc, int key) { Annot *annot = myalloc(&arenas->annot, Annot); @@ -2094,7 +2097,7 @@ makeannot(SrcLoc *loc, int key) } static Docket * -makedocket(Node *node) +makedocket(SourceArenas *arenas, Node *node) { Docket *docket = myalloc(&arenas->docket, Docket); @@ -2183,7 +2186,7 @@ setheadenv(Source *source, EnvKind kind) { /* @note this might only be useful for parameter => function env * translation */ - Env *env = myalloc(&arenas->env, Env); + Env *env = myalloc(&source->arenas.env, Env); env->kind = kind; @@ -2196,6 +2199,7 @@ setheadenv(Source *source, EnvKind kind) env->below = source->currenv; assert(source->headenv == NULL); + env->arenas = &source->arenas; source->currenv = source->headenv = env; return env; @@ -2216,7 +2220,7 @@ pushenv(Source *source, EnvKind kind) return source->currenv; } - env = myalloc(&arenas->env, Env); + env = myalloc(&source->arenas.env, Env); env->kind = kind; /* @todo make sure that source->tok.loc is the correct * source-location. */ @@ -2226,6 +2230,7 @@ pushenv(Source *source, EnvKind kind) env->loc = source->tok.loc; env->below = source->currenv; + env->arenas = &source->arenas; source->currenv = env; return env; @@ -2292,7 +2297,7 @@ deferfuncenv(Source *source, int keydeclinfunc) static Node * wrapenv(Node *node, Env *env) { - Node *aenv = makenode(node, node); + Node *aenv = makenode(env->arenas, node, node); aenv->kind = AENV; aenv->u.env = env; @@ -2385,7 +2390,7 @@ makedecl(Source *source, int key, DeclKind kind) ); } - decl = myalloc(&arenas->decl, Decl); + decl = myalloc(&source->arenas.decl, Decl); decl->kind = kind; /* @todo make sure that source->tok.loc is the correct @@ -2412,7 +2417,7 @@ makebundle(Source *source, int key, Decl *parentbundle) /* assert(currenv); */ - decl = myalloc(&arenas->decl, Decl); + decl = myalloc(&source->arenas.decl, Decl); decl->kind = DBUNDLE; /* @todo make sure that source->tok.loc is the correct @@ -2449,7 +2454,7 @@ makedecl2(SrcLoc *loc, Env *env, int key, DeclKind kind) error(loc, "'%s' already declared", getstring(idents, key)); } - decl = myalloc(&arenas->decl, Decl); + decl = myalloc(&env->arenas->decl, Decl); decl->kind = kind; /* @todo make sure that source->tok.loc is the correct @@ -2478,7 +2483,7 @@ defertypedeclaration(Source *source, int key) /* FIXME(m21c): type may be overwritten, when the declaration * is completed */ - decl->type = maketype(&source->tok.loc, primitive(TVOID), NULL); + decl->type = maketype(&source->arenas, &source->tok.loc, primitive(TVOID), NULL); decl->type->module = decl; source->currenv = savedcurrenv; @@ -2630,7 +2635,7 @@ readannots(Source *source) if (!expect(source, IDENT, "expected annotation-identifier.")) return; - annot = makeannot(&loc, key); + annot = makeannot(&source->arenas, &loc, key); if (getkind(source) == LPARDELIM) { int count; @@ -2659,7 +2664,7 @@ readannots(Source *source) } if (docket == NULL) { - docket = makedocket(NULL); + docket = makedocket(&source->arenas, NULL); /* @todo add docket to source */ } @@ -2872,7 +2877,7 @@ advance: (void) flags; if (getkind(source) == LSQRDELIM) { - Type *tmp = maketype(getloc(source), primitive(TARRAY), basetype); + Type *tmp = maketype(&source->arenas, getloc(source), primitive(TARRAY), basetype); basetype = tmp; gettok(source); @@ -2884,7 +2889,7 @@ advance: } if (getkind(source) == OMUL) { - Type *tmp = maketype(getloc(source), primitive(TPTR), basetype); + Type *tmp = maketype(&source->arenas, getloc(source), primitive(TPTR), basetype); basetype = tmp; gettok(source); @@ -3039,7 +3044,7 @@ redodeclaration: if (selfparam) { param = makedecl(source, auxself, DVAR); - param->type = maketype(&param->loc, + param->type = maketype(&source->arenas, &param->loc, prim + TPTR, module); param->flags |= MSPECIAL; /* @note param doesn't need to be added to @@ -3061,7 +3066,7 @@ redodeclaration: param->kind = DPARAM; } } else if (selfparam) { - Type *selftype = maketype(&decl->loc, + Type *selftype = maketype(&source->arenas, &decl->loc, primitive(TPTR), module); Decl *selfdecl; @@ -3081,7 +3086,7 @@ redodeclaration: "cannot infer return type of function"); } - decl->type = maketype(&decl->loc, primitive(TFUNCTION), paramtype); + decl->type = maketype(&source->arenas, &decl->loc, primitive(TFUNCTION), paramtype); decl->kind = DFUNCTION; decl->type->u.rtarget = ty; ty = decl->type; @@ -3313,7 +3318,7 @@ readrecord(Source *source, bool isunion) if (module->type->module == module) { *module->type = prim[TSTRUCT]; } else { - module->type = maketype(&recordnode->loc, prim + typekind, NULL); + module->type = maketype(&source->arenas, &recordnode->loc, prim + typekind, NULL); } module->type->module = module; @@ -3387,7 +3392,7 @@ readrecordinitfield(Source *source, Type *recordtype) if (getkind(source) == COLONDELIM) { gettok(source); /* @todo associate field name with field in record type */ - fieldinit->lhs = makenode(&savedtok, NULL); + fieldinit->lhs = makenode(&source->arenas, &savedtok, NULL); } else { pushbacktok(source, &savedtok); } @@ -3506,7 +3511,7 @@ readatom(Source *source, int flags) lhs->lhs->kind == TYPE && lhs->rhs->kind == TYPE) { - Type *ty = maketype(&lhs->loc, primitive(TTUPLE), NULL); + Type *ty = maketype(&source->arenas, &lhs->loc, primitive(TTUPLE), NULL); ty->target = lhs->lhs->type; ty->u.rtarget = lhs->rhs->type; deletenode(lhs); @@ -3569,7 +3574,7 @@ readatom(Source *source, int flags) case KNULL: lhs = tokennode(source, NULL); lhs->kind = NUMBER; - lhs->type = maketype(&source->tok.loc, primitive(TPTR), primitive(TVOID)); + lhs->type = maketype(&source->arenas, &source->tok.loc, primitive(TPTR), primitive(TVOID)); lhs->u.u = (uintmax_t) (getkind(source) == KTRUE); gettok(source); break; @@ -3982,7 +3987,7 @@ exprlist(Source *source, bool isparam, Type *paramtype) lhs->lhs->kind == TYPE && lhs->rhs->kind == TYPE) { - lhs->type = maketype(&lhs->loc, primitive(TTUPLE), + lhs->type = maketype(&source->arenas, &lhs->loc, primitive(TTUPLE), lhs->lhs->type); lhs->type->u.rtarget = lhs->rhs->type; @@ -4207,10 +4212,10 @@ convint(int srcsize, bool srcsigned, uintmax_t value) } static Node * -conv(Node *node); +conv(Env *env, Node *node); static Node * -wrap(Type *type, Node *node) +wrap(Env *env, Type *type, Node *node) { Type *nodetype = node->type; @@ -4277,7 +4282,7 @@ wrap(Type *type, Node *node) /* implicit referencing: */ if (type->kind == TPTR && type->target->kind == nodetype->kind) { - node = makenode(node, node); + node = makenode(env->arenas, node, node); node->kind = OADDR; node->type = type->target; @@ -4288,7 +4293,7 @@ wrap(Type *type, Node *node) /* implicit de-referencing: */ if (nodetype->kind == TPTR && nodetype->target->kind == type->kind) { - node = makenode(node, node); + node = makenode(env->arenas, node, node); node->kind = ODEREF; node->type = type; @@ -4297,7 +4302,7 @@ wrap(Type *type, Node *node) } doconversion: - node = makenode(node, node); + node = makenode(env->arenas, node, node); node->kind = ACONV; node->type = type; @@ -4305,17 +4310,17 @@ doconversion: } static Node * -conv(Node *node) +conv(Env *env, Node *node) { Type *ty = node->type; assert(ty); if (ty->kind == TINFER) - return wrap(primitive(TINT), node); + return wrap(env, primitive(TINT), node); if (ty->kind == TUINFER) - return wrap(primitive(TUINT), node); + return wrap(env, primitive(TUINT), node); return node; } @@ -4355,7 +4360,7 @@ arithtuplereorder(Env *env, Node *expr, int numops) expr->lhs->kind = expr->kind; tmp = expr->rhs; - expr->rhs = makenode(expr, expr->lhs->rhs); + expr->rhs = makenode(env->arenas, expr, expr->lhs->rhs); expr->lhs->rhs = tmp; /* @note some unary nodes may have a rhs? */ expr->rhs->rhs = tmp; /* @todo make a copy */ expr->kind = ACOMMA; @@ -4376,10 +4381,10 @@ typecheckdecl(Env *env, Decl *decl) decl->u.content = typecheck(env, decl->u.content); if (decl->type->kind == TINFER) { - decl->u.content = conv(decl->u.content); + decl->u.content = conv(env, decl->u.content); decl->type = decl->u.content->type; } else { - decl->u.content = wrap(decl->type, decl->u.content); + decl->u.content = wrap(env, decl->type, decl->u.content); } } else if (decl->kind == DFUNCTION) { if (!decl->u.content) @@ -4413,7 +4418,7 @@ substitutedispatch(Env *env, Node *expr) expr->type->u.rtarget = expr->lhs->type; return expr; #else - Node *result = makenode(expr, NULL); + Node *result = makenode(env->arenas, expr, NULL); result->kind = ADECLREF; result->u.declref = expr->u.declref; result->type = expr->type; @@ -4447,9 +4452,9 @@ selfdispatchcall(Env *env, Node *expr) assert(self->type); if (self->type->kind == TSTRUCT || self->type->kind == TUNION) { - self = makenode(self, self); + self = makenode(env->arenas, self, self); self->kind = OADDR; - self->type = maketype(&self->loc, primitive(TINT), self->type); + self->type = maketype(env->arenas, &self->loc, primitive(TINT), self->type); } else if (self->type->kind != TPTR) { error(&self->loc, "expected struct or union or pointer type"); } else if (self->type->target->kind != TSTRUCT && @@ -4463,7 +4468,7 @@ selfdispatchcall(Env *env, Node *expr) } if (expr->rhs->kind != ACOMMA) { - insert = makenode(expr->rhs, self); + insert = makenode(env->arenas, expr->rhs, self); insert->kind = ACOMMA; insert->rhs = expr->rhs; expr->rhs = insert; @@ -4475,7 +4480,7 @@ selfdispatchcall(Env *env, Node *expr) while (probe->lhs && probe->lhs->kind == ACOMMA) probe = probe->lhs; - insert = makenode(probe, self); + insert = makenode(env->arenas, probe, self); insert->rhs = probe->lhs; probe->lhs = insert; @@ -4513,7 +4518,7 @@ resolvepending(Env *env, Node *expr) } static Node * -dispatch(Node *expr, Node *parent) +dispatch(Env *env, Node *expr, Node *parent) { Type *type; Decl *field; @@ -4525,7 +4530,7 @@ dispatch(Node *expr, Node *parent) /* @todo maybe do implicit dereference */ if (type->kind == TPTR) { - Node *lhs = makenode(expr->lhs, expr->lhs); + Node *lhs = makenode(env->arenas, expr->lhs, expr->lhs); lhs->kind = ADEREF; lhs->type = type->target; @@ -4574,18 +4579,18 @@ forloop(Env *env, Node *expr, Node *header) error(&it->loc, "for loop variable must be initialized"); return; } - it->u.content = makenode(header, NULL); + it->u.content = makenode(env->arenas, header, NULL); it->u.content->kind = NUMBER; it->u.content->type = it->type; it->u.content->u.u = 0; } - header->lhs = conv(typecheck(env, header->lhs)); + header->lhs = conv(env, typecheck(env, header->lhs)); } /* @todo do proper typechecking */ - header->rhs = wrap(header->lhs->type, typecheck(env, header->rhs)); - header->u.payload = wrap(header->lhs->type, typecheck(env, header->u.payload)); + header->rhs = wrap(env, header->lhs->type, typecheck(env, header->rhs)); + header->u.payload = wrap(env, header->lhs->type, typecheck(env, header->u.payload)); return; } @@ -4594,7 +4599,7 @@ forloop(Env *env, Node *expr, Node *header) return; } - header = expr->u.payload = conv(typecheck(env, header)); + header = expr->u.payload = conv(env, typecheck(env, header)); if (isarithtype(header->type)) { Decl *it; @@ -4604,22 +4609,22 @@ forloop(Env *env, Node *expr, Node *header) it = makedecl2(&header->loc, env, getstringkey(&idents, "it", 2), DVAR); it->type = header->type; - it->u.content = makenode(header, NULL); + it->u.content = makenode(env->arenas, header, NULL); it->u.content->kind = NUMBER; it->u.content->type = header->type; it->u.content->u.u = 0; - forstep = makenode(header, NULL); + forstep = makenode(env->arenas, header, NULL); forstep->kind = AFORSTEP; forstep->type = header->type; - forstep->lhs = makenode(header, NULL); + forstep->lhs = makenode(env->arenas, header, NULL); forstep->lhs->kind = ADECL; forstep->lhs->u.declref = it; forstep->rhs = header; - forstep->u.payload = makenode(header, NULL); + forstep->u.payload = makenode(env->arenas, header, NULL); forstep->u.payload->kind = NUMBER; forstep->u.payload->type = header->type; /* @todo handle negative step when possible @@ -4686,12 +4691,12 @@ typecheck(Env *env, Node *expr) case ODISP: case ASELFDISP: lhs = typecheck(env, lhs); - expr->lhs = conv(lhs); + expr->lhs = conv(env, lhs); if (parenttop > 1) - return dispatch(expr, parentnodes[parenttop - 2]); + return dispatch(env, expr, parentnodes[parenttop - 2]); - return dispatch(expr, NULL); + return dispatch(env, expr, NULL); case OCALL: reporton(lhs->type->kind == TPTR && lhs->type->target->kind != TFUNCTION, @@ -4710,7 +4715,7 @@ typecheck(Env *env, Node *expr) return expr; case OARRAY: - expr->lhs = conv(lhs); + expr->lhs = conv(env, lhs); reporton(lhs->type->kind != TARRAY && lhs->type->kind != TPTR, &expr->loc, "operand is not an array or pointer"); @@ -4720,7 +4725,7 @@ typecheck(Env *env, Node *expr) reporton(!isinttype(rhs->type), &rhs->loc, "array index is not an integer"); - expr->rhs = wrap(primitive(TUSIZE), expr->rhs); + expr->rhs = wrap(env, primitive(TUSIZE), expr->rhs); expr->type = lhs->type->target; return expr; @@ -4729,7 +4734,7 @@ typecheck(Env *env, Node *expr) reporton(!islvalue(lhs), &expr->loc, "operand is not an lvalue"); - expr->lhs = conv(lhs); + expr->lhs = conv(env, lhs); expr->type = lhs->type; return expr; @@ -4746,7 +4751,7 @@ typecheck(Env *env, Node *expr) reporton(!islvalue(lhs), &expr->loc, "operand is not an lvalue"); - expr->type = maketype(&expr->loc, primitive(TPTR), lhs->type); + expr->type = maketype(env->arenas, &expr->loc, primitive(TPTR), lhs->type); return expr; case OPLUS: case OMINUS: @@ -4755,7 +4760,7 @@ typecheck(Env *env, Node *expr) &lhs->loc, "expression is not of arithmetic type"); */ - expr->lhs = conv(lhs); + expr->lhs = conv(env, lhs); expr->type = lhs->type; return expr; @@ -4763,7 +4768,7 @@ typecheck(Env *env, Node *expr) reporton(!isintorbooltype(lhs->type), &lhs->loc, "expression is not of integer type"); - expr->lhs = conv(lhs); + expr->lhs = conv(env, lhs); expr->type = lhs->type; return expr; @@ -4772,7 +4777,7 @@ typecheck(Env *env, Node *expr) &lhs->loc, "expression is not of arithmetic type"); expr->type = primitive(TBOOL); - expr->lhs = conv(lhs); /* cannot be wrap(expr->type, lhs) */ + expr->lhs = conv(env, lhs); /* cannot be wrap(expr->type, lhs) */ return expr; case OCAST: @@ -4798,8 +4803,8 @@ typecheck(Env *env, Node *expr) else expr->type = lhs->type; - expr->lhs = wrap(expr->type, lhs); - expr->rhs = wrap(expr->type, rhs); + expr->lhs = wrap(env, expr->type, lhs); + expr->rhs = wrap(env, expr->type, rhs); return expr; case OBAND: case OBOR: case OXOR: @@ -4812,16 +4817,16 @@ typecheck(Env *env, Node *expr) else expr->type = lhs->type; - expr->lhs = wrap(expr->type, lhs); - expr->rhs = wrap(expr->type, rhs); + expr->lhs = wrap(env, expr->type, lhs); + expr->rhs = wrap(env, expr->type, rhs); return expr; case OLSH: case ORSH: case OARSH: reporton(!isinttype(lhs->type) || !isinttype(rhs->type), &expr->loc, "expression is not of integer type"); - expr->lhs = conv(lhs); - expr->rhs = wrap(primitive(TINT), rhs); + expr->lhs = conv(env, lhs); + expr->rhs = wrap(env, primitive(TINT), rhs); expr->type = lhs->type; return expr; @@ -4831,8 +4836,8 @@ typecheck(Env *env, Node *expr) reporton(!isarithtype(lhs->type) || !isarithtype(rhs->type), &expr->loc, "expression is not of arithmetic type"); - expr->lhs = conv(lhs); - expr->rhs = conv(rhs); + expr->lhs = conv(env, lhs); + expr->rhs = conv(env, rhs); expr->type = primitive(TBOOL); return expr; @@ -4841,8 +4846,8 @@ typecheck(Env *env, Node *expr) &expr->loc, "expression is not of arithmetic type"); expr->type = primitive(TBOOL); - expr->lhs = wrap(expr->type, lhs); - expr->rhs = wrap(expr->type, rhs); + expr->lhs = wrap(env, expr->type, lhs); + expr->rhs = wrap(env, expr->type, rhs); return expr; case OMULA: case ODIVA: case OMODA: @@ -4863,9 +4868,9 @@ typecheck(Env *env, Node *expr) reporton(!islvalue(lhs), &expr->loc, "left-hand-side is not an lvalue"); - expr->lhs = conv(lhs); + expr->lhs = conv(env, lhs); expr->type = lhs->type; - expr->rhs = wrap(expr->type, rhs); + expr->rhs = wrap(env, expr->type, rhs); return expr; case KIF: @@ -4873,7 +4878,7 @@ typecheck(Env *env, Node *expr) case KUNTIL: assert(expr->u.payload); expr->u.payload = typecheck(env, expr->u.payload); - expr->u.payload = wrap(primitive(TBOOL), expr->u.payload); + expr->u.payload = wrap(env, primitive(TBOOL), expr->u.payload); if (lhs) expr->lhs = typecheck(env, lhs); @@ -4939,7 +4944,7 @@ typecheck(Env *env, Node *expr) assert(lhs); lhs = typecheck(env, lhs); - expr->lhs = conv(lhs); + expr->lhs = conv(env, lhs); return expr; case ACOMPOUND: @@ -4982,10 +4987,10 @@ typecheck(Env *env, Node *expr) rhs = typecheck(env, rhs); /* @note converting nodes may be uneccessary */ - expr->lhs = conv(lhs); - expr->rhs = conv(rhs); + expr->lhs = conv(env, lhs); + expr->rhs = conv(env, rhs); - expr->type = maketype(&expr->loc, primitive(TTUPLE), lhs->type); + expr->type = maketype(env->arenas, &expr->loc, primitive(TTUPLE), lhs->type); expr->type->u.rtarget = rhs->type; return expr; @@ -5048,7 +5053,7 @@ typecheck(Env *env, Node *expr) &expr->loc, "expected return value"); if (rhs) - expr->lhs = wrap(expr->type, rhs); + expr->lhs = wrap(env, expr->type, rhs); return expr; @@ -5812,7 +5817,7 @@ substituenfs(Env *env, Node *expr) } if (decl->kind == DFUNCTION && isnestedfunction(decl->contentenv)) { - enlist = makenode(expr, NULL); + enlist = makenode(env->arenas, expr, NULL); expr->kind = ADECLREF; assert(extractedtop < lengthof(extracted)); @@ -8372,7 +8377,8 @@ processfile(Source *source) appendconduct(block, CSCOPE, NULL); intrinsic = makedecl(source, getstringkey(&idents, "printf", 6), DFUNCTION); - intrinsic->type = maketype(&source->tok.loc, primitive(TFUNCTION), NULL); + intrinsic->type = maketype(&source->arenas, &source->tok.loc, + primitive(TFUNCTION), NULL); intrinsic->type->u.rtarget = primitive(TINT); cginit(&cg, source->currenv, fopen("out.c", "wb")); @@ -8416,8 +8422,9 @@ processfile(Source *source) popenv(source); highlight(stdout, HLINFO); - printf("exiting with %u errors and %u warnings ...\x1b[0m\n", + printf("exiting with %u errors and %u warnings ...\n", errorcount, warningcount); + highlight(stdout, HLNONE); fclose(cg.out); } @@ -8426,7 +8433,7 @@ int main(int argc, char **argv) { Source *source = &testsource; - arenas = &sourcearenas; + arenas = &source->arenas; initkeywords(); initstrmap(&idents); @@ -8451,6 +8458,21 @@ main(int argc, char **argv) processfile(source); + highlight(stdout, HLINFO); + printf("number of nodes: % 6zu\n", arenas->node.top); + printf("number of types: % 6zu\n", arenas->type.top); + printf("number of environments: % 6zu\n", arenas->env.top); + printf("number of declarations: % 6zu\n", arenas->decl.top); + printf("number of annotations: % 6zu\n", arenas->annot.top); + printf("number of dockets: % 6zu\n", arenas->docket.top); + printf("number of records: % 6zu\n", arenas->record.top); + printf("number of fields: % 6zu\n", arenas->field.top); + printf("number of blocks: % 6zu\n", arenas->block.top); + printf("number of conducts: % 6zu\n", arenas->conduct.top); + printf("number of gists: % 6zu\n", arenas->gist.top); + highlight(stdout, HLNONE); + printf("\x1b[0m"); + /* fclose(source->filein); */ /* disposestrmap(&strings); */ /* disposestrmap(&idents); */