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);
}
--
⑨