Selaa lähdekoodia

rename base types, start on validation

Tobias Waldekranz.com 8 vuotta sitten
vanhempi
commit
1843f91d53
9 muutettua tiedostoa jossa 138 lisäystä ja 161 poistoa
  1. 33 56
      arch-x86_64.c
  2. 0 12
      arch.h
  3. 2 2
      kprobe.c
  4. 7 4
      node.c
  5. 11 2
      node.h
  6. 31 21
      ply.c
  7. 2 1
      sym.c
  8. 37 34
      type.c
  9. 15 29
      type.h

+ 33 - 56
arch-x86_64.c

@@ -8,53 +8,37 @@
8 8
 		.t = { .tdef = { .name = #_a, .type = _t } },	\
9 9
 	}
10 10
 
11
-#define arch_pointer(_t) {					\
12
-		.ttype = T_POINTER,				\
13
-		.t = { .pointer = { .type = _t } },		\
14
-	}
15
-
16
-type_t t_s8 = arch_typedef(s8, &t_c);
17
-type_t t_s8p = arch_pointer(&t_s8);
18
-type_t t_u8 = arch_typedef(u8, &t_uc);
19
-type_t t_u8p = arch_pointer(&t_u8);
20
-
21
-type_t t_s16 = arch_typedef(s16, &t_s);
22
-type_t t_s16p = arch_pointer(&t_s16);
23
-type_t t_u16 = arch_typedef(u16, &t_us);
24
-type_t t_u16p = arch_pointer(&t_u16);
25
-
26
-type_t t_s32 = arch_typedef(s32, &t_i);
27
-type_t t_s32p = arch_pointer(&t_s32);
28
-type_t t_u32 = arch_typedef(u32, &t_ui);
29
-type_t t_u32p = arch_pointer(&t_u32);
30
-
31
-type_t t_s64 = arch_typedef(s64, &t_l);
32
-type_t t_s64p = arch_pointer(&t_s64);
33
-type_t t_u64 = arch_typedef(u64, &t_ul);
34
-type_t t_u64p = arch_pointer(&t_u64);
11
+type_t t_s8 = arch_typedef(s8, &t_char);
12
+type_t t_u8 = arch_typedef(u8, &t_uchar);
13
+type_t t_s16 = arch_typedef(s16, &t_short);
14
+type_t t_u16 = arch_typedef(u16, &t_ushort);
15
+type_t t_s32 = arch_typedef(s32, &t_int);
16
+type_t t_u32 = arch_typedef(u32, &t_uint);
17
+type_t t_s64 = arch_typedef(s64, &t_long);
18
+type_t t_u64 = arch_typedef(u64, &t_ulong);
35 19
 
36 20
 field_t f_pt_regs_fields[] = {
37
-	{ .name = "r15",      .type = &t_ul },
38
-	{ .name = "r14",      .type = &t_ul },
39
-	{ .name = "r13",      .type = &t_ul },
40
-	{ .name = "r12",      .type = &t_ul },
41
-	{ .name = "rbp",      .type = &t_ul },
42
-	{ .name = "rbx",      .type = &t_ul },
43
-	{ .name = "r11",      .type = &t_ul },
44
-	{ .name = "r10",      .type = &t_ul },
45
-	{ .name = "r9",       .type = &t_ul },
46
-	{ .name = "r8",       .type = &t_ul },
47
-	{ .name = "rax",      .type = &t_ul },
48
-	{ .name = "rcx",      .type = &t_ul },
49
-	{ .name = "rdx",      .type = &t_ul },
50
-	{ .name = "rsi",      .type = &t_ul },
51
-	{ .name = "rdi",      .type = &t_ul },
52
-	{ .name = "orig_rax", .type = &t_ul },
53
-	{ .name = "rip",      .type = &t_ul },
54
-	{ .name = "cs",       .type = &t_ul },
55
-	{ .name = "eflags",   .type = &t_ul },
56
-	{ .name = "rsp",      .type = &t_ul },
57
-	{ .name = "ss",       .type = &t_ul },
21
+	{ .name = "r15",      .type = &t_ulong },
22
+	{ .name = "r14",      .type = &t_ulong },
23
+	{ .name = "r13",      .type = &t_ulong },
24
+	{ .name = "r12",      .type = &t_ulong },
25
+	{ .name = "rbp",      .type = &t_ulong },
26
+	{ .name = "rbx",      .type = &t_ulong },
27
+	{ .name = "r11",      .type = &t_ulong },
28
+	{ .name = "r10",      .type = &t_ulong },
29
+	{ .name = "r9",       .type = &t_ulong },
30
+	{ .name = "r8",       .type = &t_ulong },
31
+	{ .name = "rax",      .type = &t_ulong },
32
+	{ .name = "rcx",      .type = &t_ulong },
33
+	{ .name = "rdx",      .type = &t_ulong },
34
+	{ .name = "rsi",      .type = &t_ulong },
35
+	{ .name = "rdi",      .type = &t_ulong },
36
+	{ .name = "orig_rax", .type = &t_ulong },
37
+	{ .name = "rip",      .type = &t_ulong },
38
+	{ .name = "cs",       .type = &t_ulong },
39
+	{ .name = "eflags",   .type = &t_ulong },
40
+	{ .name = "rsp",      .type = &t_ulong },
41
+	{ .name = "ss",       .type = &t_ulong },
58 42
 
59 43
 	{ .type = NULL }
60 44
 };
@@ -68,18 +52,11 @@ type_t t_pt_regs = {
68 52
 	},
69 53
 };
70 54
 
71
-type_t t_pt_regsp = {
72
-	.ttype = T_POINTER,
73
-	.t.pointer = {
74
-		.type = &t_pt_regs,
75
-	}
76
-};
77
-
78 55
 type_t *arch_types[] = {
79
-	&t_s8, &t_s8p, &t_u8, &t_u8p,
80
-	&t_s16, &t_s16p, &t_u16, &t_u16p,
81
-	&t_s32, &t_s32p, &t_u32, &t_u32p,
82
-	&t_s64, &t_s64p, &t_u64, &t_u64p,
56
+	&t_s8, &t_u8,
57
+	&t_s16, &t_u16,
58
+	&t_s32, &t_u32,
59
+	&t_s64, &t_u64,
83 60
 	&t_pt_regs,
84 61
 
85 62
 	NULL

+ 0 - 12
arch.h

@@ -4,26 +4,14 @@
4 4
 #include "type.h"
5 5
 
6 6
 extern type_t t_s8;
7
-extern type_t t_s8p;
8 7
 extern type_t t_u8;
9
-extern type_t t_u8p;
10
-
11 8
 extern type_t t_s16;
12
-extern type_t t_s16p;
13 9
 extern type_t t_u16;
14
-extern type_t t_u16p;
15
-
16 10
 extern type_t t_s32;
17
-extern type_t t_s32p;
18 11
 extern type_t t_u32;
19
-extern type_t t_u32p;
20
-
21 12
 extern type_t t_s64;
22
-extern type_t t_s64p;
23 13
 extern type_t t_u64;
24
-extern type_t t_u64p;
25 14
 
26 15
 extern type_t t_pt_regs;
27
-extern type_t t_pt_regsp;
28 16
 
29 17
 #endif	/* _PLY_ARCH_H */

+ 2 - 2
kprobe.c

@@ -22,9 +22,9 @@ int kprobe_resolve(prog_t *prog, node_t *n)
22 22
 	type_t *t;
23 23
 
24 24
 	if (is_arg(n->ident))
25
-		t = &t_ul;
25
+		t = &t_ulong;
26 26
 	else if (!strcmp(n->ident, "ctx"))
27
-		t = &t_pt_regsp;
27
+		t = type_ptr_of(&t_pt_regs);
28 28
 	else
29 29
 		return -ENOENT;
30 30
 

+ 7 - 4
node.c

@@ -26,7 +26,9 @@ void node_print(node_t *n, FILE *fp)
26 26
 		break;
27 27
 	case N_KEYWORD:
28 28
 		fputs("\e[31m", fp);
29
-		fputc(n->keyword, fp);
29
+		fputc(n->keyword.class, fp);
30
+		if (n->keyword.op)
31
+			fputc(n->keyword.op, fp);
30 32
 		fputs("\e[0m", fp);
31 33
 		break;
32 34
 	case N_IDENT:
@@ -184,10 +186,11 @@ node_t *node_vlist(node_t *head, ...)
184 186
 	return n;
185 187
 }
186 188
 
187
-node_t *node_keyword(keyword_t keyword)
189
+node_t *node_keyword(kwclass_t class, int op)
188 190
 {
189 191
 	node_t *n = __node(N_KEYWORD);
190
-	n->keyword = keyword;
192
+	n->keyword.class = class;
193
+	n->keyword.op    = op;
191 194
 	return n;
192 195
 }
193 196
 
@@ -214,6 +217,6 @@ node_t *node_string(char *string)
214 217
 	n->string = string;
215 218
 
216 219
 	/* TODO: string type like dtrace? */
217
-	n->type = &t_cp;
220
+	n->type = type_ptr_of(&t_char);
218 221
 	return n;
219 222
 }

+ 11 - 2
node.h

@@ -9,13 +9,22 @@
9 9
 
10 10
 typedef struct node node_t;
11 11
 
12
-typedef enum keyword {
12
+typedef enum kwclass {
13 13
 	KW_SUBSCRIPT = '[',
14 14
 	KW_ASSIGN = '=',
15
+	KW_ARITH = 'a',
16
+} kwclass_t;
17
+
18
+typedef enum kwarith {
15 19
 	KW_ADD = '+',
16 20
 	KW_SUB = '-',
17 21
 	KW_MUL = '*',
18 22
 	KW_DIV = '/',
23
+} kwarith_t;
24
+
25
+typedef struct keyword {
26
+	kwclass_t class;
27
+	int op;
19 28
 } keyword_t;
20 29
 
21 30
 typedef enum ntype {
@@ -54,7 +63,7 @@ int node_walk(node_t *n, walk_fn pre, walk_fn post, void *ctx);
54 63
 node_t *node_list  (node_t *head);
55 64
 node_t *node_vlist (node_t *head, ...);
56 65
 
57
-node_t *node_keyword(keyword_t keyword);
66
+node_t *node_keyword(kwclass_t class, int op);
58 67
 node_t *node_ident  (char *name);
59 68
 node_t *node_num    (int64_t num);
60 69
 node_t *node_string (char *string);

+ 31 - 21
ply.c

@@ -66,12 +66,12 @@ ctx_t *ctx_get(void)
66 66
 	/* { t0 = time(); @reads[pid()] = quantize(arg2) } */
67 67
 	prog->ast =
68 68
 		node_vlist(
69
-			node_vlist(node_keyword('='),
69
+			node_vlist(node_keyword('=', 0),
70 70
 				   node_ident("t0"),
71 71
 				   node_list(node_ident("time")),
72 72
 				   NULL),
73
-			node_vlist(node_keyword('='),
74
-				   node_vlist(node_keyword('['),
73
+			node_vlist(node_keyword('=', 0),
74
+				   node_vlist(node_keyword('[', 0),
75 75
 					      node_ident("@reads"),
76 76
 					      node_list(node_ident("pid")),
77 77
 					      NULL),
@@ -95,13 +95,13 @@ ctx_t *ctx_get(void)
95 95
 	/* { @times[pid()] = quantize(time() - t0) } */
96 96
 	prog->ast =
97 97
 		node_list(
98
-			node_vlist(node_keyword('='),
99
-				   node_vlist(node_keyword('['),
98
+			node_vlist(node_keyword('=', 0),
99
+				   node_vlist(node_keyword('[', 0),
100 100
 					      node_ident("@times"),
101 101
 					      node_list(node_ident("pid")),
102 102
 					      NULL),
103 103
 				   node_vlist(node_ident("quantize"),
104
-					      node_vlist(node_keyword('-'),
104
+					      node_vlist(node_keyword('a', '-'),
105 105
 							 node_list(node_ident("time")),
106 106
 							 node_ident("t0"),
107 107
 							 NULL),
@@ -151,7 +151,7 @@ int infer_type_list(prog_t *prog, node_t *n)
151 151
 
152 152
 	/* list of lists (code block) => void */
153 153
 	if (n->list->ntype == N_LIST) {
154
-		n->type = &t_v;
154
+		n->type = &t_void;
155 155
 		return 0;
156 156
 	}
157 157
 
@@ -173,7 +173,7 @@ int infer_type_keyword(prog_t *prog, node_t *n)
173 173
 {
174 174
 	node_t *dst, *src;
175 175
 
176
-	switch (n->keyword) {
176
+	switch (n->keyword.class) {
177 177
 	case KW_ASSIGN:
178 178
 		dst = node_next(n);
179 179
 		src = node_next(dst);
@@ -184,7 +184,7 @@ int infer_type_keyword(prog_t *prog, node_t *n)
184 184
 
185 185
 		/* TODO: assignment is statement for now. do we need
186 186
 		 * c-style assignment expressions? e.g `a = b = 2;` */
187
-		n->type = &t_v;
187
+		n->type = &t_void;
188 188
 
189 189
 		if (dst->type)
190 190
 			return 0;
@@ -196,10 +196,7 @@ int infer_type_keyword(prog_t *prog, node_t *n)
196 196
 
197 197
 		return sym_add(dst->sym->st, dst->ident, dst->type, NULL);
198 198
 
199
-	case KW_ADD:
200
-	case KW_SUB:
201
-	case KW_MUL:
202
-	case KW_DIV:
199
+	case KW_ARITH:
203 200
 		dst = node_next(n);
204 201
 		src = node_next(dst);
205 202
 		assert(dst && src);
@@ -211,6 +208,7 @@ int infer_type_keyword(prog_t *prog, node_t *n)
211 208
 		return 0;
212 209
 
213 210
 	default:
211
+		n->type = &t_void;
214 212
 		return 0;
215 213
 	}
216 214
 
@@ -238,9 +236,9 @@ int infer_type_sym(prog_t *prog, node_t *n)
238 236
 	 * means the type of the map itself is also known. */
239 237
 	if (parent && parent->type
240 238
 	    && (parent->list->ntype == N_KEYWORD)
241
-	    && (parent->list->keyword == KW_SUBSCRIPT)
239
+	    && (parent->list->keyword.class == KW_SUBSCRIPT)
242 240
 	    && key && key->type) {
243
-		n->type = type_get_map_of(key->type, parent->type);
241
+		n->type = type_map_of(key->type, parent->type);
244 242
 
245 243
 		return sym_add(n->sym->st, n->ident, n->type, NULL);
246 244
 	}
@@ -269,17 +267,29 @@ int pass_infer_types(node_t *n, void *_prog)
269 267
 	return 0;
270 268
 }
271 269
 
272
-/* int pass_walk(pass_t *pass, prog_t *prog) */
273
-/* { */
274
-/* 	return node_walk(prog->ast, pass->pre, pass->post, prog); */
275
-/* } */
270
+int validate_func(node_t *n)
271
+{
272
+	return 0;
273
+}
276 274
 
277 275
 int pass_validate_types(node_t *n, void *_prog)
278 276
 {
279 277
 	prog_t *prog = _prog;
280 278
 
281
-	
282
-	return 0;
279
+	if (!n->type) {
280
+		node_print(n, stderr);
281
+		fputs(": is of unknown type\n", stderr);
282
+		return -EINVAL;
283
+	}
284
+
285
+	if (n->ntype != N_LIST)
286
+		return 0;
287
+
288
+	if (n->list->ntype != N_IDENT)
289
+		return 0;
290
+
291
+	assert(n->list->type->ttype == T_FUNC);
292
+	return validate_func(n->list);
283 293
 }
284 294
 
285 295
 int pass_walk(pass_t *pass, ctx_t *ctx)

+ 2 - 1
sym.c

@@ -50,8 +50,9 @@ found:
50 50
 
51 51
 void sym_dump(sym_t *sym, FILE *fp)
52 52
 {
53
+	fputs("\e[2m", fp);
53 54
 	type_dump(sym->type, fp);
54
-	fputc(' ', fp);
55
+	fputs("\e[0m ", fp);
55 56
 	fputs(sym->name, fp);
56 57
 }
57 58
 

+ 37 - 34
type.c

@@ -10,46 +10,30 @@
10 10
 		.t = { .scalar = { .name = #_t } },	\
11 11
 	}
12 12
 
13
-#define builtin_pointer(_t) {				\
14
-		.ttype = T_POINTER,			\
15
-		.t = { .pointer = { .type = _t } },	\
16
-	}
17
-
18
-type_t t_v    = builtin_scalar(void);
19
-type_t t_vp   = builtin_pointer(&t_v);
13
+type_t t_void = builtin_scalar(void);
20 14
 
21
-type_t t_c    = builtin_scalar(char);
22
-type_t t_cp   = builtin_pointer(&t_c);
23
-type_t t_uc   = builtin_scalar(unsigned char);
24
-type_t t_ucp  = builtin_pointer(&t_uc);
15
+type_t t_char  = builtin_scalar(char);
16
+type_t t_uchar = builtin_scalar(unsigned char);
25 17
 
26
-type_t t_s    = builtin_scalar(short);
27
-type_t t_sp   = builtin_pointer(&t_s);
28
-type_t t_us   = builtin_scalar(unsigned short);
29
-type_t t_usp  = builtin_pointer(&t_us);
18
+type_t t_short  = builtin_scalar(short);
19
+type_t t_ushort = builtin_scalar(unsigned short);
30 20
 
31
-type_t t_i    = builtin_scalar(int);
32
-type_t t_ip   = builtin_pointer(&t_i);
33
-type_t t_ui   = builtin_scalar(unsigned int);
34
-type_t t_uip  = builtin_pointer(&t_ui);
21
+type_t t_int  = builtin_scalar(int);
22
+type_t t_uint = builtin_scalar(unsigned int);
35 23
 
36
-type_t t_l    = builtin_scalar(long);
37
-type_t t_lp   = builtin_pointer(&t_l);
38
-type_t t_ul   = builtin_scalar(unsigned long);
39
-type_t t_ulp  = builtin_pointer(&t_ul);
24
+type_t t_long  = builtin_scalar(long);
25
+type_t t_ulong = builtin_scalar(unsigned long);
40 26
 
41
-type_t t_ll   = builtin_scalar(long long);
42
-type_t t_llp  = builtin_pointer(&t_ll);
43
-type_t t_ull  = builtin_scalar(unsigned long long);
44
-type_t t_ullp = builtin_pointer(&t_ull);
27
+type_t t_llong  = builtin_scalar(long long);
28
+type_t t_ullong = builtin_scalar(unsigned long long);
45 29
 
46 30
 type_t *builtin_types[] = {
47
-	&t_v,  &t_vp,
48
-	&t_c,  &t_cp,  &t_uc,  &t_ucp,
49
-	&t_s,  &t_sp,  &t_us,  &t_usp,
50
-	&t_i,  &t_ip,  &t_ui,  &t_uip,
51
-	&t_l,  &t_lp,  &t_ul,  &t_ulp,
52
-	&t_ll, &t_llp, &t_ull, &t_ullp,
31
+	&t_void,
32
+	&t_char,  &t_uchar,
33
+	&t_short, &t_ushort,
34
+	&t_int,   &t_uint,
35
+	&t_long,  &t_ulong,
36
+	&t_llong, &t_ullong,
53 37
 
54 38
 	NULL
55 39
 };
@@ -174,7 +158,7 @@ void types_dump_cdecl(FILE *fp)
174 158
 	}
175 159
 }
176 160
 
177
-type_t *type_get_map_of(type_t *ktype, type_t *vtype)
161
+type_t *type_map_of(type_t *ktype, type_t *vtype)
178 162
 {
179 163
 	type_t *t;
180 164
 	size_t i;
@@ -195,6 +179,25 @@ type_t *type_get_map_of(type_t *ktype, type_t *vtype)
195 179
 	return t;
196 180
 }
197 181
 
182
+type_t *type_ptr_of(type_t *type)
183
+{
184
+	type_t *t;
185
+	size_t i;
186
+
187
+	for (i = 0; i < types.len; i++) {
188
+		t = types.type[i];
189
+		if ((t->ttype == T_POINTER)
190
+		    && (t->t.pointer.type == type))
191
+			return t;
192
+	}
193
+
194
+	t = calloc(1, sizeof(*t));
195
+	t->ttype = T_POINTER;
196
+	t->t.pointer.type = type;
197
+	type_add(t);
198
+	return t;
199
+}
200
+
198 201
 int type_equal(type_t *a, type_t *b)
199 202
 {
200 203
 	/* TODO */

+ 15 - 29
type.h

@@ -76,35 +76,21 @@ struct type {
76 76
 	} t;
77 77
 };
78 78
 
79
-extern type_t t_v;
80
-extern type_t t_vp;
81
-
82
-extern type_t t_c;
83
-extern type_t t_cp;
84
-extern type_t t_uc;
85
-extern type_t t_ucp;
86
-
87
-extern type_t t_s;
88
-extern type_t t_sp;
89
-extern type_t t_us;
90
-extern type_t t_usp;
91
-
92
-extern type_t t_i;
93
-extern type_t t_ip;
94
-extern type_t t_ui;
95
-extern type_t t_uip;
96
-
97
-extern type_t t_l;
98
-extern type_t t_lp;
99
-extern type_t t_ul;
100
-extern type_t t_ulp;
101
-
102
-extern type_t t_ll;
103
-extern type_t t_llp;
104
-extern type_t t_ull;
105
-extern type_t t_ullp;
106
-
107
-type_t *type_get_map_of(type_t *ktype, type_t *vtype);
79
+extern type_t t_void;
80
+
81
+extern type_t t_char;
82
+extern type_t t_uchar;
83
+extern type_t t_short;
84
+extern type_t t_ushort;
85
+extern type_t t_int;
86
+extern type_t t_uint;
87
+extern type_t t_long;
88
+extern type_t t_ulong;
89
+extern type_t t_llong;
90
+extern type_t t_ullong;
91
+
92
+type_t *type_map_of(type_t *ktype, type_t *vtype);
93
+type_t *type_ptr_of(type_t *type);
108 94
 
109 95
 int type_equal(type_t *a, type_t *b);
110 96
 int type_add(type_t *t);