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); }
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; } } }