projects
/
uebersetzerbau-ss10.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
gesamt: variablen und calls 'mitzaehlen'
[uebersetzerbau-ss10.git]
/
gesamt
/
chelper.c
diff --git
a/gesamt/chelper.c
b/gesamt/chelper.c
index b4831a70d19754c9e0ccc6584b418d84ddde7a13..edef8449a52f5522147691e48a72578faa50dd2e 100644
(file)
--- a/
gesamt/chelper.c
+++ b/
gesamt/chelper.c
@@
-14,10
+14,20
@@
static char *regs8l[] = {"al", "r10b", "r11b", "r9b"};
/* ja, dirty.. */
static char *akt_func_name = (char*) NULL;
/* 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.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;
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)
}
char *get_func_name(void)
@@
-27,6
+37,8
@@
char *get_func_name(void)
void func_footer(void)
{
void func_footer(void)
{
+ if(need_stack)
+ printf("\tleave\n");
printf("\tret\n");
}
printf("\tret\n");
}