#include #include "ir.h" const uint16_t vreg_base = 0x8000; static void ir_emit(ir_t *ir, vinsn_t *vi) { ir->vi = realloc(ir->vi, ++ir->len); assert(ir->vi); ir->vi[ir->len - 1] = *vi; } void ir_emit_insn(ir_t *ir, struct bpf_insn bpf, uint16_t dst, uint16_t src) { vinsn_t vi; vi.vitype = VI_INSN; vi.insn.bpf = bpf; vi.insn.dst = dst; vi.insn.src = src; ir_emit(ir, &vi); } void ir_emit_label (ir_t *ir, int16_t label) { vinsn_t vi; vi.vitype = VI_LABEL; vi.label = label; } void ir_emit_reg_get(ir_t *ir, uint16_t reg) { vinsn_t vi; vi.vitype = VI_REG_GET; vi.reg = reg; } void ir_emit_reg_put(ir_t *ir, uint16_t reg) { vinsn_t vi; vi.vitype = VI_REG_PUT; vi.reg = reg; } int16_t ir_alloc_label (ir_t *ir) { return ir->next_label--; } uint16_t ir_alloc_register(ir_t *ir) { return ir->next_reg++; } ir_t *ir_new(void) { ir_t *ir; ir = calloc(1, sizeof(*ir)); assert(ir); ir->next_reg = vreg_base; ir->next_label = -1; return ir; }