Example #1
0
void gen_stmt_if(const stmt *s, out_ctx *octx)
{
	out_blk *blk_true = out_blk_new(octx, "if_true");
	out_blk *blk_false = out_blk_new(octx, "if_false");
	out_blk *blk_fi = out_blk_new(octx, "fi");
	struct out_dbg_lbl *el[2][2];
	const out_val *cond;

	flow_gen(s->flow, s->symtab, el, octx);
	cond = gen_expr(s->expr, octx);

	out_ctrl_branch(octx, cond, blk_true, blk_false);

	out_current_blk(octx, blk_true);
	{
		gen_stmt(s->lhs, octx);
		out_ctrl_transfer(octx, blk_fi, NULL, NULL);
	}

	out_current_blk(octx, blk_false);
	{
		if(s->rhs)
			gen_stmt(s->rhs, octx);
		out_ctrl_transfer(octx, blk_fi, NULL, NULL);
	}

	out_current_blk(octx, blk_fi);
	flow_end(s->flow, s->symtab, el, octx);
}
Example #2
0
void style_stmt_if(const stmt *s, out_ctx *octx)
{
	stylef("if(");
	IGNORE_PRINTGEN(gen_expr(s->expr, octx));
	stylef(")\n");
	gen_stmt(s->lhs, octx);

	if(s->rhs){
		stylef("else\n");
		gen_stmt(s->rhs, octx);
	}
}
Example #3
0
void gen_stmt_for(stmt *s)
{
	char *lbl_test = asm_label_flow("for_test");

	/* don't else-if, possible to have both (comma-exp for init) */
	if(s->flow->for_init){
		gen_expr(s->flow->for_init, s->flow->for_init_symtab);
		asm_temp(1, "pop rax ; unused for init");
	}

	asm_label(lbl_test);
	if(s->flow->for_while){
		gen_expr(s->flow->for_while, s->flow->for_init_symtab);

		asm_temp(1, "pop rax");
		asm_temp(1, "test rax, rax");
		asm_temp(1, "jz %s", s->lbl_break);
	}

	gen_stmt(s->lhs);
	asm_label(s->lbl_continue);
	if(s->flow->for_inc){
		gen_expr(s->flow->for_inc, s->flow->for_init_symtab);
		asm_temp(1, "pop rax ; unused for inc");
	}

	asm_temp(1, "jmp %s", lbl_test);

	asm_label(s->lbl_break);

	free(lbl_test);
}
Example #4
0
const out_val *gen_expr_style_stmt(const expr *e, out_ctx *octx)
{
	stylef("({\n");
	gen_stmt(e->code, octx);
	stylef("\n})");
	return NULL;
}
void style_stmt_case_range(stmt *s)
{
	stylef("\ncase %ld ... %ld: ",
			(long)const_fold_val_i(s->expr),
			(long)const_fold_val_i(s->expr2));

	gen_stmt(s->lhs);
}
Example #6
0
void gen_stmt_label(const stmt *s, out_ctx *octx)
{
	out_blk *thisblk = label_getblk(s->bits.lbl.label, octx);

	if(s->bits.lbl.label->mustgen_spel)
		out_blk_mustgen(octx, thisblk, s->bits.lbl.label->mustgen_spel);

	/* explicit fall through */
	out_ctrl_transfer_make_current(octx, thisblk);
	gen_stmt(s->lhs, octx); /* the code-part of the compound statement */
}
Example #7
0
void gen_stmt_if(stmt *s)
{
	char *lbl_else = asm_label_code("else");
	char *lbl_fi   = asm_label_code("fi");

	gen_expr(s->expr, s->symtab);
	asm_temp(1, "pop rax");

	asm_temp(1, "test rax, rax");
	asm_temp(1, "jz %s", lbl_else);
	gen_stmt(s->lhs);
	asm_temp(1, "jmp %s", lbl_fi);
	asm_label(lbl_else);
	if(s->rhs)
		gen_stmt(s->rhs);
	asm_label(lbl_fi);

	free(lbl_else);
	free(lbl_fi);
}
Example #8
0
void gen_stmt_for(const stmt *s, out_ctx *octx)
{
	struct out_dbg_lbl *el[2][2];
	out_blk *blk_test = out_blk_new(octx, "for_test"),
	        *blk_body = out_blk_new(octx, "for_body"),
	        *blk_end = out_blk_new(octx, "for_end"),
	        *blk_inc = out_blk_new(octx, "for_inc");

	flow_gen(s->flow, s->flow->for_init_symtab, el, octx);

	/* don't else-if, possible to have both (comma-exp for init) */
	if(s->flow->for_init){
		out_val_consume(octx, gen_expr(s->flow->for_init, octx));

		out_comment(octx, "for-init");
	}

	out_ctrl_transfer_make_current(octx, blk_test);
	if(s->flow->for_while){
		const out_val *for_cond;

		for_cond = gen_expr(s->flow->for_while, octx);

		out_ctrl_branch(octx, for_cond, blk_body, blk_end);
	}else{
		out_ctrl_transfer(octx, blk_body, NULL, NULL);
	}

	stmt_init_blks(s, blk_inc, blk_end);

	out_current_blk(octx, blk_body);
	{
		gen_stmt(s->lhs, octx);
		out_ctrl_transfer(octx, blk_inc, NULL, NULL);
	}

	out_current_blk(octx, blk_inc);
	{
		if(s->flow->for_inc)
			out_val_consume(octx, gen_expr(s->flow->for_inc, octx));
		out_ctrl_transfer(octx, blk_test, NULL, NULL);
	}

	out_current_blk(octx, blk_end);
	flow_end(s->flow, s->flow->for_init_symtab, el, octx);
}
Example #9
0
void gen_stmt_do(stmt *s)
{
	char *begin = asm_label_flow("do_start");

	asm_label(begin);
	gen_stmt(s->lhs);

	asm_label(s->lbl_continue);
	gen_expr(s->expr, s->symtab);

	asm_temp(1, "pop rax");
	asm_temp(1, "test rax, rax");
	asm_temp(1, "jnz %s", begin);

	asm_label(s->lbl_break);

	free(begin);
}
Example #10
0
void style_stmt_for(const stmt *s, out_ctx *octx)
{
	stylef("for(");
	if(s->flow->for_init)
		IGNORE_PRINTGEN(gen_expr(s->flow->for_init, octx));

	stylef("; ");
	if(s->flow->for_while)
		IGNORE_PRINTGEN(gen_expr(s->flow->for_while, octx));

	stylef("; ");
	if(s->flow->for_inc)
		IGNORE_PRINTGEN(gen_expr(s->flow->for_inc, octx));

	stylef(")\n");

	gen_stmt(s->lhs, octx);
}
Example #11
0
void style_stmt_label(const stmt *s, out_ctx *octx)
{
	stylef("\n%s: ", s->bits.lbl.spel);
	gen_stmt(s->lhs, octx);
}
Example #12
0
void style_stmt_default(stmt *s)
{
	stylef("\ndefault: ");
	gen_stmt(s->lhs);
}
Example #13
0
void gen_stmt_default(stmt *s)
{
	out_label(s->bits.case_lbl);
	gen_stmt(s->lhs);
}
Example #14
0
void gen_stmt_label(stmt *s)
{
	asm_label(s->expr->spel);
	gen_stmt(s->lhs); /* the code-part of the compound stmtement */
}
void gen_stmt_case_range(stmt *s)
{
	out_label(s->bits.case_lbl);
	gen_stmt(s->lhs);
}