From 0b896148b2f89bc42079c40ea8ce43d73d4a2c36 Mon Sep 17 00:00:00 2001 From: Bernhard Urban Date: Tue, 4 May 2010 18:57:17 +0200 Subject: [PATCH] codea: mehr debug code --- codea/chelper.c | 2 +- codea/code.bfe | 6 +++--- codea/parser.y | 29 ++++++++++++++++------------- codea/tree.c | 14 ++++++++++++-- codea/tree.h | 2 +- 5 files changed, 33 insertions(+), 20 deletions(-) diff --git a/codea/chelper.c b/codea/chelper.c index 7b76626..9f5032c 100644 --- a/codea/chelper.c +++ b/codea/chelper.c @@ -3,7 +3,7 @@ #include "chelper.h" #include "tree.h" -#if 1 +#if 0 #define DDCHELP #endif diff --git a/codea/code.bfe b/codea/code.bfe index 23a3123..5c0b606 100644 --- a/codea/code.bfe +++ b/codea/code.bfe @@ -25,9 +25,9 @@ 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); -expr: O_SUB(expr,expr) # 1 # fprintf(stderr, "osub0\n"); printf("\tsubq %%%s, %%%s\n", KIDR(0), KIDR(1)); -expr: O_SUB(imm,expr) # 2 # fprintf(stderr, "osub1\n"); printf("\tsubq $%li, %%%s\n", KIDV(0), KIDR(1)); move(KIDR(1), BNR); -expr: O_SUB(expr,imm) # 3 # fprintf(stderr, "osub2\n"); moveimm(KIDV(1), BNR); printf("\tsubq %%%s, %%%s\n", KIDR(0), BNR); +expr: O_SUB(expr,expr) # 1 # printf("\tsubq %%%s, %%%s\n", KIDR(0), KIDR(1)); +expr: O_SUB(imm,expr) # 2 # printf("\tsubq $%li, %%%s\n", KIDV(0), KIDR(1)); move(KIDR(1), BNR); +expr: O_SUB(expr,imm) # 3 # moveimm(KIDV(1), BNR); printf("\tsubq %%%s, %%%s\n", KIDR(0), BNR); 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); diff --git a/codea/parser.y b/codea/parser.y index e5a7dd2..5fc5c8e 100644 --- a/codea/parser.y +++ b/codea/parser.y @@ -193,22 +193,23 @@ Expr: Term @{ @reg @Term.node@->reg = @Expr.node@->reg; + @i @Expr.exprcount@ = 1 + @Term.exprcount@; fprintf(stderr, "(Expr)- Term\n"); @} | NOT Term @{ @i @Expr.node@ = TREENULL; + @i @Expr.exprcount@ = 1 + @Term.exprcount@; fprintf(stderr, "(Expr)- NOT Term\n"); @} | Term Minusterm @{ - @i @Expr.exprcount@ = @Term.exprcount@ + @Minusterm.exprcount@; + @i @Expr.exprcount@ = 1 + @Term.exprcount@ + @Minusterm.exprcount@; fprintf(stderr, "(Expr)- Term Minusterm\n"); @i @Expr.node@ = new_node(O_SUB, @Minusterm.node@, @Term.node@, @Expr.exprcount@); @i @Expr.imm@ = @Term.imm@ && @Minusterm.imm@; @reg { /* TODO */ - fprintf(stderr, "at_expr: Minusterm.imm \"%i\", Term.imm \"%i\"\n", @Minusterm.imm@, @Term.imm@); @Term.node@->reg = @Expr.node@->reg; @Term.node@->skip = 1; @Minusterm.node@->reg = next_reg(@Term.node@->reg, @Expr.node@->skip); @@ -218,32 +219,34 @@ Expr: | Term Multerm @{ @i @Expr.node@ = TREENULL; + @i @Expr.exprcount@ = 1 + @Term.exprcount@; fprintf(stderr, "(Expr)- Term Multerm\n"); @} | Term Orterm @{ @i @Expr.node@ = TREENULL; + @i @Expr.exprcount@ = 1 + @Term.exprcount@; fprintf(stderr, "(Expr)- Term OrTerm\n"); @} | Term '<' Term @{ @i @Expr.node@ = TREENULL; /* das is bloedsinn atm */ @i @Expr.imm@ = @Term.0.imm@ && @Term.1.imm@; - /* das is bloedsinn atm */ @i @Expr.exprcount@ = 0; + @i @Expr.exprcount@ = 1 + @Term.0.exprcount@ + @Term.1.exprcount@; fprintf(stderr, "(Expr)- Term < Term\n"); @} | Term '=' Term @{ @i @Expr.node@ = TREENULL; /* das is bloedsinn atm */ @i @Expr.imm@ = @Term.0.imm@ && @Term.1.imm@; - /* das is bloedsinn atm */ @i @Expr.exprcount@ = 0; + @i @Expr.exprcount@ = 1 + @Term.0.exprcount@ + @Term.1.exprcount@; fprintf(stderr, "(Expr)- Term = Term\n"); @} ; Minusterm: '-' Term Minusterm @{ - @i @Minusterm.0.exprcount@ = @Term.exprcount@ + @Minusterm.1.exprcount@; + @i @Minusterm.0.exprcount@ = 1 + @Term.exprcount@ + @Minusterm.1.exprcount@; fprintf(stderr, "(Minusterm)- - Term Minusterm\n"); @i @Minusterm.node@ = new_node(O_ADD, @Minusterm.1.node@, @Term.node@, @Minusterm.0.exprcount@); @i @Minusterm.imm@ = @Term.imm@ && @Minusterm.1.imm@; @@ -255,7 +258,7 @@ Minusterm: | '-' Term @{ - @i @Minusterm.exprcount@ = @Term.exprcount@; + @i @Minusterm.exprcount@ = 1 + @Term.exprcount@; fprintf(stderr, "(Minusterm)- - Term\n"); @reg @Term.node@->reg = @Minusterm.node@->reg; @} ; @@ -288,35 +291,35 @@ Term: '(' Expr ')' @{ @i @Term.node@ = @Expr.node@; - @i @Term.exprcount@ = @Expr.exprcount@ + 1; + @i @Term.exprcount@ = @Expr.exprcount@ + 1; fprintf(stderr, "(Term)- ( Expr )\n"); @} | NUM @{ - @i @Term.exprcount@ = 1; + @i @Term.exprcount@ = 1; fprintf(stderr, "(Term)- NUM\n"); @i @Term.node@ = new_number(@NUM.val@, @Term.exprcount@); @i @Term.imm@ = 1; @} | '-' NUM @{ - @i @Term.exprcount@ = 1; + @i @Term.exprcount@ = 1; fprintf(stderr, "(Term)- - NUM\n"); @i @Term.node@ = new_number(-1 * (@NUM.val@), @Term.exprcount@); @i @Term.imm@ = 1; @} | THIS @{ - @i @Term.exprcount@ = 1; - @i @Term.node@ = new_param(O_ID, TREENULL, TREENULL, 0, @Term.exprcount@); + @i @Term.exprcount@ = 1; fprintf(stderr, "(Term)- THIS\n"); + @i @Term.node@ = new_param(O_ID, strdup("this"), TREENULL, TREENULL, 0, @Term.exprcount@); @i @Term.imm@ = 0; @} | IDENT @{ @c check(@Term.s@, @IDENT.name@, S_VAR|S_PARM); - @i @Term.exprcount@ = 1; - @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, @Term.exprcount@); + @i @Term.exprcount@ = 1; fprintf(stderr, "(Term)- IDENT\n"); + @i @Term.node@ = new_param(O_ID, @IDENT.name@, TREENULL, TREENULL, tab_lookup(@Term.s@, @IDENT.name@, S_PARM) == SYMNULL ? -1 : tab_lookup(@Term.s@, @IDENT.name@, S_PARM)->param_index, @Term.exprcount@); @i @Term.imm@ = 0; @} diff --git a/codea/tree.c b/codea/tree.c index 19d750c..9ee0b47 100644 --- a/codea/tree.c +++ b/codea/tree.c @@ -1,5 +1,6 @@ #include #include +#include #include "tree.h" #if 0 @@ -34,7 +35,7 @@ struct treenode *new_node(int op, struct treenode *l, struct treenode *r, int ex return new; } -struct treenode *new_param(int op, struct treenode *l, struct treenode *r, int param_index, int exprcount) +struct treenode *new_param(int op, char *name, struct treenode *l, struct treenode *r, int param_index, int exprcount) { struct treenode *new = new_node(op, l, r, exprcount); @@ -42,17 +43,26 @@ struct treenode *new_param(int op, struct treenode *l, struct treenode *r, int p fprintf(stderr, "new_param: %i (index)\n", param_index); #endif new->param_index = param_index; + new->name = name; return new; } struct treenode *new_number(long val, int exprcount) { struct treenode *new = _new_plain(O_NUM); + /* TODO: maximal groesse? */ +#define BUFMAX 40 + char *t = (char*) malloc(BUFMAX); + #ifdef DDTREE fprintf(stderr, "new_number: %i\n", val); #endif new->val = val; new->exprcount = exprcount; + memset(t, 0, BUFMAX); + sprintf(t, "%li", val); + new->name = t; + return new; } @@ -67,7 +77,7 @@ static void write_indent(int i) void write_tree(struct treenode *node, int indent) { write_indent(indent); - fprintf(stderr, "%s @ %%%s (%i)\n", o_names[node->op], node->reg, node->exprcount); + fprintf(stderr, "%s @ %%%s (%i). \"%s\"\n", o_names[node->op], node->reg, node->exprcount, node->name == (char*) NULL ? "" : node->name); if(node->kids[0] != TREENULL) { write_tree(node->kids[0], indent+1); } diff --git a/codea/tree.h b/codea/tree.h index 27a9942..7e8beb5 100644 --- a/codea/tree.h +++ b/codea/tree.h @@ -60,7 +60,7 @@ typedef struct treenode *treenodep; struct treenode *new_node(int op, struct treenode *l, struct treenode *r, int exprcount); struct treenode *new_number(long val, int exprcount); -struct treenode *new_param(int op, struct treenode *l, struct treenode *r, int param_index, int exprcount); +struct treenode *new_param(int op, char *name, struct treenode *l, struct treenode *r, int param_index, int exprcount); void write_tree(struct treenode *node, int ident); #endif -- 2.25.1