summary refs log tree commit diff
diff options
context:
space:
mode:
authorQuentin Carbonneaux <quentin.carbonneaux@yale.edu>2015-07-19 07:03:38 -0400
committerQuentin Carbonneaux <quentin.carbonneaux@yale.edu>2015-09-15 23:01:28 -0400
commita280eb6597da33ea23f8349f74a20416e5519e7e (patch)
treee26aafc90d155950b339c48c298bfe8c2c60b77c
parente5a7482b54f0840d4b9fe37488020410cd67a684 (diff)
downloadroux-a280eb6597da33ea23f8349f74a20416e5519e7e.tar.gz
export error functions
-rw-r--r--lisc/lisc.h21
-rw-r--r--lisc/parse.c31
-rw-r--r--lisc/ssa.c2
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",