void gen_expr_str(expr *e) { stringlit *strl = e->bits.strlit.lit_at.lit; stringlit_use(strl); out_push_lbl(strl->lbl, 1); out_set_lvalue(); }
static void static_val(enum section_type sec, type *ty, expr *e) { consty k; memset(&k, 0, sizeof k); const_fold(e, &k); switch(k.type){ case CONST_NEED_ADDR: case CONST_NO: ICE("non-constant expr-%s const=%d%s", e->f_str(), k.type, k.type == CONST_NEED_ADDR ? " (needs addr)" : ""); break; case CONST_NUM: if(K_FLOATING(k.bits.num)){ /* asm fp const */ asm_out_fp(sec, ty, k.bits.num.val.f); }else{ char buf[INTEGRAL_BUF_SIZ]; asm_declare_init_type(sec, ty); integral_str(buf, sizeof buf, k.bits.num.val.i, e->tree_type); asm_out_section(sec, "%s", buf); } break; case CONST_ADDR: asm_declare_init_type(sec, ty); if(k.bits.addr.is_lbl) asm_out_section(sec, "%s", k.bits.addr.bits.lbl); else asm_out_section(sec, "%ld", k.bits.addr.bits.memaddr); break; case CONST_STRK: stringlit_use(k.bits.str->lit); /* must be before the label access */ asm_declare_init_type(sec, ty); asm_out_section(sec, "%s", k.bits.str->lit->lbl); break; } /* offset in bytes, no mul needed */ if(k.offset) asm_out_section(sec, " + %ld", k.offset); asm_out_section(sec, "\n"); }