shithub: scc

Download patch

ref: 277d04a458bad76df8427891e3b8bfb694a7c238
parent: c301d4451f6034fc462c8b852c1ba2e397a7892c
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Fri Aug 8 15:00:09 EDT 2014

Emit function preambule

This is a first step in the code generation direction. It is
ugly, but we can test with it.

--- a/cc2/cc2.h
+++ b/cc2/cc2.h
@@ -19,6 +19,7 @@
 		} l;
 		struct {
 			char *name;
+			short stack;
 			struct symbol *pars;
 			struct symbol *vars;
 		} f;
@@ -66,3 +67,4 @@
 extern void error(unsigned nerror, ...);
 extern void genaddable(Node *list[]);
 extern void cgen(Symbol *sym, Node *list[]);
+extern void genstack(Symbol *fun);
\ No newline at end of file
--- a/cc2/cgen.c
+++ b/cc2/cgen.c
@@ -7,14 +7,32 @@
 
 #include <stdio.h>
 
+void
+genstack(Symbol *fun)
+{
+	Symbol *p;
+	short siz;
 
+	for (siz = 0, p = fun->u.f.vars; p; p = p->next)
+		siz += p->u.v.type->size;
+	fun->u.f.stack = siz;
+}
+
 static void
 emit(char what, void *data)
 {
+	Symbol *sym, *p;
+
 	switch (what) {
 	case FUN:
-		printf("%s:\n", data);
-		break;
+		sym = data;
+		printf("%s:\n"
+		       "\tPUSH\tIX\n"
+		       "\tLD\tIX,SP\n"
+		       "\tLD\tHL,%d\n"
+		       "\tADD\tHL,SP\n"
+		       "\tLD\tSP,HL\n", sym->u.f.name, -sym->u.f.stack);
+		return;
 	default:
 		fputs("internal error: incorrect emit\n", stderr);
 		abort();
@@ -24,7 +42,7 @@
 void
 cgen(Symbol *sym, Node *list[])
 {
-	emit(FUN, sym->u.f.name);
+	emit(FUN, sym);
 }
 
 /*
--- a/cc2/parser.c
+++ b/cc2/parser.c
@@ -305,6 +305,7 @@
 {
 	funbody = 0;
 	listp = NULL;
+	genstack(curfun);
 	genaddable(listexp);
 	cgen(curfun, listexp);
 }
--