codea: bissl refactor, TODO(vorerst): stack fuer snafu_03.0 oder mehr refactor?
authorBernhard Urban <lewurm@gmail.com>
Mon, 3 May 2010 23:23:21 +0000 (01:23 +0200)
committerBernhard Urban <lewurm@gmail.com>
Mon, 3 May 2010 23:23:21 +0000 (01:23 +0200)
codea/chelper.c
codea/chelper.h
codea/code.bfe
codea/parser.y
codea/tree.c
codea/tree.h

index 4926b8ac6283fe1c15640b91a8343a0940b25a43..be39f3f3314e3efb312a8bf608e508f29396021c 100644 (file)
@@ -12,6 +12,11 @@ void func_header(char *s)
        printf("\t.globl %1$s\n\t.type %1$s, @function\n%1$s:\n", s);
 }
 
+void func_footer(void)
+{
+       printf("\tret\n");
+}
+
 void move(char *src, char *dst)
 {
        if(strcmp(src,dst) != 0) {
index 9336fd6f37ed100ccb44285b333978a4a3f5703c..9933b3422d2f73dbf5dd0cfd65e5afe234374af9 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef __CHELPER_H
 #define __CHELPER_H
 void func_header(char *s);
+void func_footer(void);
 char *next_reg(char *s, short skip);
 char *param_reg(int num);
 void ret(void);
index 0b14110b88c157699202abd854b284046681e70a..23a3123eb1b04b45d4bd680a586efe10c0089847 100644 (file)
@@ -19,8 +19,8 @@
 
 %%
 
-begin: ret # 0 # printf("// end\n");
-ret: O_RET(expr) # 2 # move(BNR, "rax"); ret();
+begin: ret # 0 # printf("\n");
+ret: O_RET(expr) # 2 # move(BNR, "rax"); func_footer();
 
 expr: O_ID # 1 # if(bnode->param_index > -1) move(param_reg(bnode->param_index), BNR);
 expr: imm # 1 # moveimm(BNV, BNR);
@@ -31,7 +31,7 @@ expr: O_SUB(expr,imm) # 3 # fprintf(stderr, "osub2\n"); moveimm(KIDV(1), BNR); p
 
 expr: O_ADD(expr,expr) # 1 # printf("\taddq %%%s, %%%s\n", KIDR(1), KIDR(0));
 expr: O_ADD(imm,expr) # 1 # printf("\taddq $%li, %%%s\n", KIDV(1), KIDR(0)); move(KIDR(0), BNR);
-expr: O_ADD(expr,imm) # 1 # printf("\taddq $%li, %%%s\n", KIDV(0), KIDR(1)); move(KIDR(1), BNR);
+expr: O_ADD(expr,imm) # 1 # printf("\taddq $%li, %%%s\n", KIDV(1), KIDR(0)); move(KIDR(0), BNR);
 
 
 imm: O_ADD(imm,imm) # 0 # BNV = KIDV(0)+KIDV(1);
index 4bd07bb6b2e232058695a74ac43a78c5a55d7d35..34dadf16ebc3b310f2bd51bce6a7303e3b6f4d79 100644 (file)
@@ -208,14 +208,16 @@ Expr:
 
                @reg {
                        /* TODO */
+                       fprintf(stderr, "at_expr: Minusterm.imm \"%i\", Term.imm \"%i\"\n", @Minusterm.imm@, @Term.imm@);
+                       #if 0
                        if(@Minusterm.imm@) {
                                @Minusterm.node@->reg = @Expr.node@->reg;
                                @Term.node@->reg = next_reg(@Minusterm.node@->reg, @Expr.node@->skip);
                                @Minusterm.node@->skip = 1;
                        } else {
+                       #endif
                                @Term.node@->reg = @Expr.node@->reg;
                                @Minusterm.node@->reg = next_reg(@Term.node@->reg, @Expr.node@->skip);
-                       }
                }
          @}
 
@@ -292,69 +294,49 @@ Term:
          '(' Expr ')'
          @{
            @i @Term.node@ = @Expr.node@;
-           @reg fprintf(stderr, "wtf1\n");
          @}
 
        | NUM
          @{
            @i @Term.node@ = new_number(@NUM.val@);
                @i @Term.imm@ = 1;
-
-           @reg fprintf(stderr, "wtf2\n");
          @}
 
        | '-' NUM
          @{
            @i @Term.node@ = new_number(-1 * (@NUM.val@));
                @i @Term.imm@ = 1;
-
-           @reg fprintf(stderr, "wtf3\n");
          @}
 
        | THIS
          @{
-           @i @Term.node@ = new_node(O_ID, TREENULL, TREENULL); @Term.node@->param_index = 0;
+           @i @Term.node@ = new_param(O_ID, TREENULL, TREENULL, 0);
                @i @Term.imm@ = 0;
-
-           @reg fprintf(stderr, "wtf4\n");
          @}
 
        | IDENT
          @{
            @c check(@Term.s@, @IDENT.name@, S_VAR|S_PARM);
-           @i @Term.node@ = new_node(O_ID, TREENULL, TREENULL); {
-                       struct symbol *tmp;
-                       if((tmp = tab_lookup(@Term.s@, @IDENT.name@, S_PARM)) != TREENULL) {
-                               @Term.node@->param_index = tmp->param_index;
-                       }
-               }
+           @i @Term.node@ = new_param(O_ID, TREENULL, TREENULL, tab_lookup(@Term.s@, @IDENT.name@, S_PARM) == SYMNULL ? -1 : tab_lookup(@Term.s@, @IDENT.name@, S_PARM)->param_index);
                @i @Term.imm@ = 0;
-
-           @reg fprintf(stderr, "wtf5\n");
          @}
 
        | Feld
          @{
            @i @Term.node@ = TREENULL;
                @i @Term.imm@ = 0;
-
-           @reg fprintf(stderr, "wtf6\n");
          @}
 
        | IDENT '(' Exprs ')'
          @{
            @i @Term.node@ = TREENULL;
                @i @Term.imm@ = 0;
-
-           @reg fprintf(stderr, "wtf7\n");
          @}
 
        | Term '.' IDENT '(' Exprs ')'
          @{
            @i @Term.node@ = TREENULL;
                @i @Term.imm@ = 0;
-
-           @reg fprintf(stderr, "wtf8\n");
          @}
 
        ;
index 1490ae6302c0b58891775605fa0977f7a26229f6..b85fe6ac96a859acb4bfd0adca5ee90259d5f109 100644 (file)
@@ -2,7 +2,7 @@
 #include <stdlib.h>
 #include "tree.h"
 
-#if 1
+#if 0
 #define DDTREE
 #endif
 
@@ -33,6 +33,17 @@ struct treenode *new_node(int op, struct treenode *l, struct treenode *r)
        return new;
 }
 
+struct treenode *new_param(int op, struct treenode *l, struct treenode *r, int param_index)
+{
+       struct treenode *new = new_node(op, l, r);
+
+#ifdef DDTREE
+       fprintf(stderr, "new_param: %i (index)\n", param_index);
+#endif
+       new->param_index = param_index;
+       return new;
+}
+
 struct treenode *new_number(long val)
 {
        struct treenode *new = _new_plain(O_NUM);
index b4e6fca76db5a6bbad3a8f699744f3a8cc339393..38347ce289e9d2552fcd8fa2191a296a72159442 100644 (file)
@@ -59,5 +59,6 @@ typedef struct treenode *treenodep;
 
 struct treenode *new_node(int op, struct treenode *l, struct treenode *r);
 struct treenode *new_number(long val);
+struct treenode *new_param(int op, struct treenode *l, struct treenode *r, int param_index);
 
 #endif