From a280eb6597da33ea23f8349f74a20416e5519e7e Mon Sep 17 00:00:00 2001 From: Quentin Carbonneaux Date: Sun, 19 Jul 2015 07:03:38 -0400 Subject: export error functions --- lisc/lisc.h | 21 +++++++++++++++++++++ lisc/parse.c | 31 ++++++++++++++++++++++--------- 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 @@ -15,6 +15,25 @@ typedef struct Blk Blk; 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; isym = realloc(f->sym, f->ntmp * sizeof f->sym[0]); if (!f->sym) - abort(); + diag("ssafix: out of memory"); for (t1=t0; t0ntmp; t0++) { f->sym[t0].type = STmp; snprintf(f->sym[t0].name, NString, "%s%d", -- cgit 1.4.1