A dynamic tracer for Linux

ir.c 989B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #include <assert.h>
  2. #include "ir.h"
  3. const uint16_t vreg_base = 0x8000;
  4. static void ir_emit(ir_t *ir, vinsn_t *vi)
  5. {
  6. ir->vi = realloc(ir->vi, ++ir->len);
  7. assert(ir->vi);
  8. ir->vi[ir->len - 1] = *vi;
  9. }
  10. void ir_emit_insn(ir_t *ir, struct bpf_insn bpf, uint16_t dst, uint16_t src)
  11. {
  12. vinsn_t vi;
  13. vi.vitype = VI_INSN;
  14. vi.insn.bpf = bpf;
  15. vi.insn.dst = dst;
  16. vi.insn.src = src;
  17. ir_emit(ir, &vi);
  18. }
  19. void ir_emit_label (ir_t *ir, int16_t label)
  20. {
  21. vinsn_t vi;
  22. vi.vitype = VI_LABEL;
  23. vi.label = label;
  24. }
  25. void ir_emit_reg_get(ir_t *ir, uint16_t reg)
  26. {
  27. vinsn_t vi;
  28. vi.vitype = VI_REG_GET;
  29. vi.reg = reg;
  30. }
  31. void ir_emit_reg_put(ir_t *ir, uint16_t reg)
  32. {
  33. vinsn_t vi;
  34. vi.vitype = VI_REG_PUT;
  35. vi.reg = reg;
  36. }
  37. int16_t ir_alloc_label (ir_t *ir)
  38. {
  39. return ir->next_label--;
  40. }
  41. uint16_t ir_alloc_register(ir_t *ir)
  42. {
  43. return ir->next_reg++;
  44. }
  45. ir_t *ir_new(void)
  46. {
  47. ir_t *ir;
  48. ir = calloc(1, sizeof(*ir));
  49. assert(ir);
  50. ir->next_reg = vreg_base;
  51. ir->next_label = -1;
  52. return ir;
  53. }