diff options
author | Quentin Carbonneaux <quentin.carbonneaux@yale.edu> | 2015-07-19 07:03:38 -0400 |
---|---|---|
committer | Quentin Carbonneaux <quentin.carbonneaux@yale.edu> | 2015-09-15 23:01:28 -0400 |
commit | a280eb6597da33ea23f8349f74a20416e5519e7e (patch) | |
tree | e26aafc90d155950b339c48c298bfe8c2c60b77c | |
parent | e5a7482b54f0840d4b9fe37488020410cd67a684 (diff) | |
download | roux-a280eb6597da33ea23f8349f74a20416e5519e7e.tar.gz |
export error functions
-rw-r--r-- | lisc/lisc.h | 21 | ||||
-rw-r--r-- | lisc/parse.c | 31 | ||||
-rw-r--r-- | lisc/ssa.c | 2 |
3 files changed, 44 insertions, 10 deletions
diff --git a/lisc/lisc.h b/lisc/lisc.h index 66f12ad..bc22a41 100644 --- a/lisc/lisc.h +++ b/lisc/lisc.h @@ -16,6 +16,25 @@ typedef struct Sym Sym; typedef struct Fn Fn; enum { + RAX = 1, + RCX, + RDX, + RBX, + RSP, + RBP, + RSI, + RDI, + R8, + R9, + R10, + R11, + R12, + R13, + R14, + R15, +}; + +enum { NReg = 32, Tmp0 = NReg+1, @@ -65,6 +84,7 @@ enum { ORem, /* reserved instructions */ OCopy, + OXCltd, OXDiv, OLast }; @@ -136,6 +156,7 @@ struct Fn { /* parse.c */ extern OpDesc opdesc[]; +void diag(char *); void *alloc(size_t); Fn *parsefn(FILE *); void printfn(Fn *, FILE *); diff --git a/lisc/parse.c b/lisc/parse.c index 6f5a030..168da6d 100644 --- a/lisc/parse.c +++ b/lisc/parse.c @@ -9,6 +9,8 @@ enum { NSym = 256, }; +Ins insb[NIns]; + OpDesc opdesc[OLast] = { [OAdd] = { 2, 1, "add" }, [OSub] = { 2, 0, "sub" }, @@ -59,8 +61,8 @@ static int lnum; static Sym sym[NSym]; static int ntmp; -static Ins ins[NIns], *curi; static Phi **plink; +static Ins *curi; static Blk *bmap[NBlk+1]; static Blk *curb; static Blk **blink; @@ -72,18 +74,29 @@ alloc(size_t n) { void *p; + /* todo, export in util.c */ p = calloc(1, n); if (!p) abort(); return p; } +void +diag(char *s) +{ + /* todo, export in util.c */ + fputs(s, stderr); + fputc('\n', stderr); + abort(); +} + static void err(char *s) { - /* todo, export the error handling in util.c */ - fprintf(stderr, "parse error: %s (line %d)\n", s, lnum); - exit(1); + char buf[100]; + + snprintf(buf, sizeof buf, "parse: %s (line %d)", s, lnum); + diag(buf); } static Token @@ -287,11 +300,11 @@ expect(Token t) static void closeblk() { - curb->nins = curi - ins; + curb->nins = curi - insb; curb->ins = alloc(curb->nins * sizeof(Ins)); - memcpy(curb->ins, ins, curb->nins * sizeof(Ins)); + memcpy(curb->ins, insb, curb->nins * sizeof(Ins)); blink = &curb->link; - curi = ins; + curi = insb; } static PState @@ -407,7 +420,7 @@ parseline(PState ps) if (op != -1 && i != opdesc[op].arity) err("invalid arity"); if (op != -1) { - if (curi - ins >= NIns) + if (curi - insb >= NIns) err("too many instructions in block"); curi->op = op; curi->to = r; @@ -440,7 +453,7 @@ parsefn(FILE *f) for (i=Tmp0; i<NSym; i++) sym[i] = (Sym){.type = SUndef}; ntmp = Tmp0; - curi = ins; + curi = insb; curb = 0; lnum = 1; nblk = 0; diff --git a/lisc/ssa.c b/lisc/ssa.c index 2ad1755..5546190 100644 --- a/lisc/ssa.c +++ b/lisc/ssa.c @@ -189,7 +189,7 @@ ssafix(Fn *f, int t) /* add new symbols */ f->sym = realloc(f->sym, f->ntmp * sizeof f->sym[0]); if (!f->sym) - abort(); + diag("ssafix: out of memory"); for (t1=t0; t0<f->ntmp; t0++) { f->sym[t0].type = STmp; snprintf(f->sym[t0].name, NString, "%s%d", |