| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- #include <assert.h>
- #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;
- }
|