示例#1
0
tr_expr_t tr_if_expr(tr_expr_t cond, tr_expr_t then, tr_expr_t else_)
{
    tmp_label_t t = tmp_label();
    tmp_label_t f = tmp_label();
    tmp_label_t done = tmp_label();
    cx_t cx = un_cx(cond);
    ir_expr_t result = ir_tmp_expr(temp());

    fill_patch(cx.trues, t);
    fill_patch(cx.falses, f);
    if (else_)
    {
        return tr_ex(ir_eseq_expr(ir_seq_stmt(vlist(
                7,
                cx.stmt,
                ir_label_stmt(t),
                ir_move_stmt(ir_mem_expr(result), un_ex(then)),
                ir_jump_stmt(ir_name_expr(done), list(done, NULL)),
                ir_label_stmt(f),
                ir_move_stmt(ir_mem_expr(result), un_ex(else_)),
                ir_label_stmt(done))),
            result));
    }
    else
    {
        return tr_nx(ir_seq_stmt(vlist(
              4,
              cx.stmt,
              ir_label_stmt(t),
              un_nx(then),
              ir_label_stmt(f))));
    }
    return NULL;
}
示例#2
0
tr_expr_t tr_string_expr(string_t str)
{
    tmp_label_t label = tmp_label();
    fr_frag_t frag = fr_string_frag(label, str);
    fr_add_frag(frag);
    return tr_ex(ir_name_expr(label));
}
示例#3
0
tr_expr_t tr_call_expr(tr_level_t level, tmp_label_t label, list_t args)
{
    ir_expr_t func = ir_name_expr(label);
    ir_expr_t fp = ir_const_expr(fr_offset(
        tr_static_link(level)->access));
    list_t l_args = list(fp, NULL);
    list_t l_next = l_args;
    for (; args; args = args->next)
        l_next = l_next->next = list(un_ex(args->data), NULL);
    return tr_ex(ir_call_expr(func, l_args));
}
示例#4
0
tr_expr_t tr_while_expr(tr_expr_t cond, tr_expr_t body)
{
    tmp_label_t start = tmp_label();
    tmp_label_t loop = tmp_label();
    tmp_label_t done = tmp_label();
    cx_t cx = un_cx(cond);

    fill_patch(cx.trues, loop);
    fill_patch(cx.falses, done);
    return tr_nx(ir_seq_stmt(vlist(
          6,
          ir_label_stmt(start),
          cx.stmt,
          ir_label_stmt(loop),
          un_nx(body),
          ir_jump_stmt(ir_name_expr(start), list(start, NULL)),
          ir_label_stmt(done))));
}
示例#5
0
ir_expr_t fr_external_call(string_t name, list_t args)
{
    return ir_call_expr(ir_name_expr(tmp_named_label(name)), args);
}