Tobias Waldekranz.com пре 8 година
родитељ
комит
950f548b5a
2 измењених фајлова са 119 додато и 0 уклоњено
  1. 70 0
      ir.c
  2. 49 0
      ir.h

+ 70 - 0
ir.c

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

+ 49 - 0
ir.h

@@ -0,0 +1,49 @@
1
+#ifndef _PLY_IR_H
2
+#define _PLY_IR_H
3
+
4
+#include <stdint.h>
5
+#include <stdlib.h>
6
+
7
+#include <linux/bpf.h>
8
+
9
+typedef enum vitype {
10
+	VI_INSN,
11
+	VI_LABEL,
12
+	VI_REG_GET,
13
+	VI_REG_PUT,
14
+} vitype_t;
15
+
16
+typedef struct vinsn {
17
+	vitype_t vitype;
18
+
19
+	union {
20
+		struct {
21
+			struct bpf_insn bpf;
22
+			uint16_t dst;
23
+			uint16_t src;
24
+		} insn;
25
+
26
+		int16_t label;
27
+		uint16_t reg;
28
+	};
29
+} vinsn_t;
30
+
31
+typedef struct ir {
32
+	vinsn_t *vi;
33
+	size_t len;
34
+
35
+	int16_t next_label;
36
+	uint16_t next_reg;
37
+} ir_t;
38
+
39
+int16_t  ir_alloc_label   (ir_t *ir);
40
+uint16_t ir_alloc_register(ir_t *ir);
41
+
42
+void ir_emit_insn   (ir_t *ir, struct bpf_insn bpf, uint16_t dst, uint16_t src);
43
+void ir_emit_label  (ir_t *ir, int16_t label);
44
+void ir_emit_reg_get(ir_t *ir, uint16_t reg);
45
+void ir_emit_reg_put(ir_t *ir, uint16_t reg);
46
+
47
+ir_t *ir_new(void);
48
+
49
+#endif	/* _PLY_IR_H */