nooc

nooc programming language compiler
git clone git://git.nihaljere.xyz/nooc
Log | Files | Refs | LICENSE

commit bb848388ac86ca2155a7b06cca844612df96d8c3
parent 85e2a35cc5e7483d7c0535de9a1b1a2a62d2ef74
Author: Nihal Jere <nihal@nihaljere.xyz>
Date:   Mon, 17 Jan 2022 23:20:18 -0600

ir: add bumplabel wrapper

This lets us save label locations

Diffstat:
Mir.c | 13+++++++++++--
Mir.h | 5+++++
2 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/ir.c b/ir.c @@ -141,6 +141,13 @@ putins(struct iproc *out, int op, uint64_t val, int valtype) array_add(out, ins); } +static uint64_t +bumplabel(struct iproc *out) +{ + array_add((&out->labels), curi); + return labeli++; +} + static size_t assign(struct iproc *out, uint8_t size) { @@ -300,8 +307,8 @@ genexpr(struct iproc *out, size_t expri, uint64_t *val) case EXPR_COND: { uint64_t condtmp; int valtype = genexpr(out, expr->d.cond.cond, &condtmp); - size_t elselabel = labeli++; - size_t endlabel = labeli++; + size_t elselabel = bumplabel(out); + size_t endlabel = bumplabel(out); STARTINS(IR_CONDJUMP, elselabel, VT_LABEL); putins(out, IR_EXTRA, condtmp, valtype); genblock(out, &expr->d.cond.bif); @@ -428,6 +435,8 @@ genproc(struct decl *decl, struct proc *proc) // put a blank interval, since tmpi starts at 1 array_add((&iproc.temps), interval); + array_add((&iproc.labels), labeli); + size_t i = 0; for (size_t j = 0; j < proc->in.len; j++, i++) { diff --git a/ir.h b/ir.h @@ -60,6 +60,11 @@ struct iproc { size_t cap; struct temp *data; } temps; + struct { + size_t len; + size_t cap; + uint64_t *data; // instruction offset in function + } labels; }; struct iprocs {