コード例 #1
0
ファイル: expr_if.c プロジェクト: guoguocat/ucc-c-compiler
void gen_expr_if(expr *e)
{
	char *lblfin;

	lblfin = out_label_code("ifexp_fi");

	gen_expr(e->expr);

	if(e->lhs){
		char *lblelse = out_label_code("ifexp_else");

		out_jfalse(lblelse);

		gen_expr(e->lhs);

		out_push_lbl(lblfin, 0);
		out_jmp();

		out_label(lblelse);
		free(lblelse);

	}else{
		out_dup();

		out_jtrue(lblfin);
	}

	out_pop();

	gen_expr(e->rhs);
	out_label(lblfin);

	free(lblfin);
}
コード例 #2
0
ファイル: expr_addr.c プロジェクト: 8l/ucc-c-compiler
static void const_expr_addr(expr *e, consty *k)
{
	if(e->bits.lbl.spel){
		int static_ctx = e->bits.lbl.static_ctx; /* global or static */

		/*k->sym_lbl = e->bits.lbl.spel;*/
		CONST_FOLD_LEAF(k);
		k->type = CONST_ADDR;
		k->offset = 0;
		k->bits.addr.is_lbl = 1;

		if(static_ctx){
			e->bits.lbl.label->mustgen_spel = out_label_code("goto");

			k->bits.addr.bits.lbl = e->bits.lbl.label->mustgen_spel;
		}else{
			k->bits.addr.bits.lbl = e->bits.lbl.label->spel;
		}

	}else{
		const_fold(e->lhs, k);

		switch(k->type){
			case CONST_NEED_ADDR:
				/* it's a->b, a symbol, etc */
				k->type = CONST_ADDR; /* addr is const but with no value */
				break;

			case CONST_STRK:
			case CONST_ADDR:
				/* int x[]; int *p = &x;
				 * already addr, just roll with it.
				 * lvalue/etc checks are done in fold
				 */
				break;

			default:
				k->type = CONST_NO;
				break;
		}
	}
}