void ssa_block_add(SsaBlock* blk, SsaNode* stmt);
SsaNode* ssa_if(Parser* p, SsaNode* cond, SsaBlock* br1, SsaBlock* br2);
-SsaNode* ssa_return(SsaNode* expr);
+SsaNode* ssa_return(Parser* p, SsaNode* expr);
SsaNode* ssa_call(SsaNode* func);
void ssa_call_add(SsaBlock* call, SsaNode* arg);
p->curr_join = p->curr_join->next;
expect(p, END);
}
-// else if (accept(p, END))
-// {
-// /* this is an empty block?? */
-// break;
-// }
else /* assignments/expressions */
{
SsaNode* expr = expression(p);
var_decl(p);
}
+ expect(p, BEGIN);
+ SsaBlock* block = ssa_block(p);
+ p->curr_join = ssa_block(p);
+ block->links[1] = p->curr_join;
+
+ if (!matches(p, RETURN) && !matches(p, END))
+ {
+ block->links[0] = statement_seq(p);
+ }
+ else
+ {
+ block->links[0] = ssa_block(p);
+ p->curr_block = block->links[0];
+ }
+
+ if (proctype->base != &VoidType)
+ {
+ expect(p, RETURN);
+ SsaNode* retval = expression(p);
+ check_type(p, proctype->base, retval);
+ expect(p, ';');
+ ssa_return(p, retval);
+ }
+ expect(p, END);
+ ssa_print_graph(p, block);
+
// /* parse the body of the procedure */
// expect(p, BEGIN);
// proc->value = ast_block();
return node;
}
-SsaNode* ssa_return(SsaNode* expr);
+SsaNode* ssa_return(Parser* p, SsaNode* expr)
+{
+ load(p, expr);
+ SsaNode* node = ssa_node(RETURN, MODE_CONTROL);
+ node->type = expr->type;
+ node = load(p, node);
+ node->dest = expr->dest;
+ return node;
+}
SsaNode* ssa_call(SsaNode* func);
void ssa_call_add(SsaBlock* call, SsaNode* arg);