From: Michael D. Lowis Date: Tue, 8 Mar 2022 16:21:06 +0000 (-0500) Subject: fixed null pointer issues but code generation is still wrong X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=3dc4db16603e1c1ff60c54d6e4ca911e2a7f085e;p=proto%2Fobnc.git fixed null pointer issues but code generation is still wrong --- diff --git a/cerise/backend/ssa/codegen.c b/cerise/backend/ssa/codegen.c index cd427b6..da2486d 100644 --- a/cerise/backend/ssa/codegen.c +++ b/cerise/backend/ssa/codegen.c @@ -293,8 +293,11 @@ void print_op(Parser* p, SsaNode* expr) { printf(" ret "); emit_type(expr->ret_type); - printf(" "); - print_ident(p, &(expr->dest)); + if (expr->ret_type->form != FORM_VOID) + { + printf(" "); + print_ident(p, &(expr->dest)); + } puts(""); } break; @@ -323,7 +326,7 @@ void print_op(Parser* p, SsaNode* expr) printf(" = %s ", binop_name(expr)); emit_type(expr->ret_type); printf(" "); - print_const(expr->ret_type, &(expr->left)); + print_const(expr->arg_type, &(expr->left)); printf(", "); print_ident(p, &(expr->right.var)); printf("\n"); @@ -337,7 +340,7 @@ void print_op(Parser* p, SsaNode* expr) printf(" "); print_ident(p, &(expr->left.var)); printf(", "); - print_const(expr->ret_type, &(expr->right)); + print_const(expr->arg_type, &(expr->right)); printf("\n"); break; diff --git a/cerise/src/ssa.c b/cerise/src/ssa.c index 0ae1aff..23aa3f1 100644 --- a/cerise/src/ssa.c +++ b/cerise/src/ssa.c @@ -137,6 +137,7 @@ SsaNode* ssa_ident(Parser* p, long long index) { node = ssa_node(IDENT, MODE_VAR); node->ret_type = sym->type; + node->arg_type = sym->type; node->loaded = !sym->global; node->dest.symid = index; node->dest.symver = sym->version; @@ -151,6 +152,7 @@ SsaNode* ssa_bool(Parser* p, bool val) (void)p; SsaNode* node = ssa_node(BOOL, MODE_CONST); node->ret_type = &BoolType; + node->arg_type = &BoolType; node->left.val.i = val; return node; } @@ -160,6 +162,7 @@ SsaNode* ssa_int(Parser* p, long long val) (void)p; SsaNode* node = ssa_node(INT, MODE_CONST); node->ret_type = &IntType; + node->arg_type = &IntType; node->left.val.i = val; return node; } @@ -169,6 +172,7 @@ SsaNode* ssa_real(Parser* p, double val) (void)p; SsaNode* node = ssa_node(REAL, MODE_CONST); node->ret_type = &RealType; + node->arg_type = &RealType; node->left.val.f = val; return node; } @@ -185,6 +189,7 @@ SsaNode* ssa_store(Parser* p, SsaNode* dest, SsaNode* value) load(p, value); SsaNode* node = ssa_node(STORE, MODE_MEMORY); node->ret_type = dest->ret_type; + node->arg_type = dest->ret_type; node->dest = dest->left.var; node->left.var = value->dest; node->dest.symver = phi_add(p, node->dest); @@ -234,6 +239,7 @@ SsaNode* ssa_if(Parser* p, SsaNode* cond, SsaBlock* br1, SsaBlock* br2) cond = load(p, cond); SsaNode* node = ssa_node(IF, MODE_CONTROL); node->ret_type = &VoidType; + node->arg_type = &BoolType; node->left.block = br1; node->right.block = br2; node = load(p, node); @@ -248,12 +254,14 @@ SsaNode* ssa_return(Parser* p, SsaNode* expr) { load(p, expr); node->ret_type = expr->ret_type; + node->arg_type = expr->ret_type; node = load(p, node); node->dest = expr->dest; } else { node->ret_type = &VoidType; + node->arg_type = &VoidType; node = load(p, node); } return node; @@ -325,6 +333,7 @@ static SsaNode* unop(Parser* p, int op, SsaNode* operand) operand = load(p, operand); node = ssa_node(op, MODE_UNOP); node->ret_type = operand->ret_type; + node->arg_type = operand->ret_type; node->left.var = operand->dest; } return node; @@ -428,6 +437,8 @@ static SsaNode* const_binop(int op, SsaNode* a, SsaNode* b) { assert(!"not a left.valid form"); } + + a->arg_type = a->ret_type; return a; } diff --git a/cerise/tests/Module.m b/cerise/tests/Module.m index 3111238..46e2024 100644 --- a/cerise/tests/Module.m +++ b/cerise/tests/Module.m @@ -98,14 +98,28 @@ begin # # Comparison ops a = b == 1; + a = 1 == b; +# a = b == b; + # a = b != 1; +# a = 1 != b; +# a = b != b; +# # a = b < 1; +# a = 1 < b; +# a = b < b; +# # a = b > 1; +# a = 1 > b; +# a = b > b; +# # a = b <= 1; +# a = 1 <= b; +# a = b <= b; +# # a = b >= 1; - - - +# a = 1 >= b; +# a = b >= b; # b = 1; # if c == b then