gesamt: variablen und calls 'mitzaehlen'
[uebersetzerbau-ss10.git] / gesamt / chelper.c
index b4831a70d19754c9e0ccc6584b418d84ddde7a13..edef8449a52f5522147691e48a72578faa50dd2e 100644 (file)
@@ -14,10 +14,20 @@ static char *regs8l[] = {"al", "r10b", "r11b", "r9b"};
 
 /* ja, dirty.. */
 static char *akt_func_name = (char*) NULL;
-void func_header(char *s)
+static char need_stack = 0;
+
+void func_header(char *s, int vars, int parms, int call)
 {
        printf("\t.globl %1$s\n\t.type %1$s, @function\n%1$s:\n", s);
+       printf("\t//vars: %i, parms: %i, call(bool): %i\n", vars, parms, call);
        akt_func_name = s;
+
+       need_stack = (vars || parms) && call;
+       if(need_stack) {
+               printf("\tpushq %%rbp\n"
+                               "\tmovq %%rsp, %%rbp\n",
+                               "\tsubq $%d, %%rsp\n", 8*(vars+parms));
+       }
 }
 
 char *get_func_name(void)
@@ -27,6 +37,8 @@ char *get_func_name(void)
 
 void func_footer(void)
 {
+       if(need_stack)
+               printf("\tleave\n");
        printf("\tret\n");
 }