Browse Source

rename base types, start on validation

Tobias Waldekranz.com 8 years ago
parent
commit
1843f91d53
9 changed files with 138 additions and 161 deletions
  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
 		.t = { .tdef = { .name = #_a, .type = _t } },	\
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
 field_t f_pt_regs_fields[] = {
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
 	{ .type = NULL }
43
 	{ .type = NULL }
60
 };
44
 };
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
 type_t *arch_types[] = {
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
 	&t_pt_regs,
60
 	&t_pt_regs,
84
 
61
 
85
 	NULL
62
 	NULL

+ 0 - 12
arch.h

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

+ 2 - 2
kprobe.c

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

+ 7 - 4
node.c

26
 		break;
26
 		break;
27
 	case N_KEYWORD:
27
 	case N_KEYWORD:
28
 		fputs("\e[31m", fp);
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
 		fputs("\e[0m", fp);
32
 		fputs("\e[0m", fp);
31
 		break;
33
 		break;
32
 	case N_IDENT:
34
 	case N_IDENT:
184
 	return n;
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
 	node_t *n = __node(N_KEYWORD);
191
 	node_t *n = __node(N_KEYWORD);
190
-	n->keyword = keyword;
192
+	n->keyword.class = class;
193
+	n->keyword.op    = op;
191
 	return n;
194
 	return n;
192
 }
195
 }
193
 
196
 
214
 	n->string = string;
217
 	n->string = string;
215
 
218
 
216
 	/* TODO: string type like dtrace? */
219
 	/* TODO: string type like dtrace? */
217
-	n->type = &t_cp;
220
+	n->type = type_ptr_of(&t_char);
218
 	return n;
221
 	return n;
219
 }
222
 }

+ 11 - 2
node.h

9
 
9
 
10
 typedef struct node node_t;
10
 typedef struct node node_t;
11
 
11
 
12
-typedef enum keyword {
12
+typedef enum kwclass {
13
 	KW_SUBSCRIPT = '[',
13
 	KW_SUBSCRIPT = '[',
14
 	KW_ASSIGN = '=',
14
 	KW_ASSIGN = '=',
15
+	KW_ARITH = 'a',
16
+} kwclass_t;
17
+
18
+typedef enum kwarith {
15
 	KW_ADD = '+',
19
 	KW_ADD = '+',
16
 	KW_SUB = '-',
20
 	KW_SUB = '-',
17
 	KW_MUL = '*',
21
 	KW_MUL = '*',
18
 	KW_DIV = '/',
22
 	KW_DIV = '/',
23
+} kwarith_t;
24
+
25
+typedef struct keyword {
26
+	kwclass_t class;
27
+	int op;
19
 } keyword_t;
28
 } keyword_t;
20
 
29
 
21
 typedef enum ntype {
30
 typedef enum ntype {
54
 node_t *node_list  (node_t *head);
63
 node_t *node_list  (node_t *head);
55
 node_t *node_vlist (node_t *head, ...);
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
 node_t *node_ident  (char *name);
67
 node_t *node_ident  (char *name);
59
 node_t *node_num    (int64_t num);
68
 node_t *node_num    (int64_t num);
60
 node_t *node_string (char *string);
69
 node_t *node_string (char *string);

+ 31 - 21
ply.c

66
 	/* { t0 = time(); @reads[pid()] = quantize(arg2) } */
66
 	/* { t0 = time(); @reads[pid()] = quantize(arg2) } */
67
 	prog->ast =
67
 	prog->ast =
68
 		node_vlist(
68
 		node_vlist(
69
-			node_vlist(node_keyword('='),
69
+			node_vlist(node_keyword('=', 0),
70
 				   node_ident("t0"),
70
 				   node_ident("t0"),
71
 				   node_list(node_ident("time")),
71
 				   node_list(node_ident("time")),
72
 				   NULL),
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
 					      node_ident("@reads"),
75
 					      node_ident("@reads"),
76
 					      node_list(node_ident("pid")),
76
 					      node_list(node_ident("pid")),
77
 					      NULL),
77
 					      NULL),
95
 	/* { @times[pid()] = quantize(time() - t0) } */
95
 	/* { @times[pid()] = quantize(time() - t0) } */
96
 	prog->ast =
96
 	prog->ast =
97
 		node_list(
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
 					      node_ident("@times"),
100
 					      node_ident("@times"),
101
 					      node_list(node_ident("pid")),
101
 					      node_list(node_ident("pid")),
102
 					      NULL),
102
 					      NULL),
103
 				   node_vlist(node_ident("quantize"),
103
 				   node_vlist(node_ident("quantize"),
104
-					      node_vlist(node_keyword('-'),
104
+					      node_vlist(node_keyword('a', '-'),
105
 							 node_list(node_ident("time")),
105
 							 node_list(node_ident("time")),
106
 							 node_ident("t0"),
106
 							 node_ident("t0"),
107
 							 NULL),
107
 							 NULL),
151
 
151
 
152
 	/* list of lists (code block) => void */
152
 	/* list of lists (code block) => void */
153
 	if (n->list->ntype == N_LIST) {
153
 	if (n->list->ntype == N_LIST) {
154
-		n->type = &t_v;
154
+		n->type = &t_void;
155
 		return 0;
155
 		return 0;
156
 	}
156
 	}
157
 
157
 
173
 {
173
 {
174
 	node_t *dst, *src;
174
 	node_t *dst, *src;
175
 
175
 
176
-	switch (n->keyword) {
176
+	switch (n->keyword.class) {
177
 	case KW_ASSIGN:
177
 	case KW_ASSIGN:
178
 		dst = node_next(n);
178
 		dst = node_next(n);
179
 		src = node_next(dst);
179
 		src = node_next(dst);
184
 
184
 
185
 		/* TODO: assignment is statement for now. do we need
185
 		/* TODO: assignment is statement for now. do we need
186
 		 * c-style assignment expressions? e.g `a = b = 2;` */
186
 		 * c-style assignment expressions? e.g `a = b = 2;` */
187
-		n->type = &t_v;
187
+		n->type = &t_void;
188
 
188
 
189
 		if (dst->type)
189
 		if (dst->type)
190
 			return 0;
190
 			return 0;
196
 
196
 
197
 		return sym_add(dst->sym->st, dst->ident, dst->type, NULL);
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
 		dst = node_next(n);
200
 		dst = node_next(n);
204
 		src = node_next(dst);
201
 		src = node_next(dst);
205
 		assert(dst && src);
202
 		assert(dst && src);
211
 		return 0;
208
 		return 0;
212
 
209
 
213
 	default:
210
 	default:
211
+		n->type = &t_void;
214
 		return 0;
212
 		return 0;
215
 	}
213
 	}
216
 
214
 
238
 	 * means the type of the map itself is also known. */
236
 	 * means the type of the map itself is also known. */
239
 	if (parent && parent->type
237
 	if (parent && parent->type
240
 	    && (parent->list->ntype == N_KEYWORD)
238
 	    && (parent->list->ntype == N_KEYWORD)
241
-	    && (parent->list->keyword == KW_SUBSCRIPT)
239
+	    && (parent->list->keyword.class == KW_SUBSCRIPT)
242
 	    && key && key->type) {
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
 		return sym_add(n->sym->st, n->ident, n->type, NULL);
243
 		return sym_add(n->sym->st, n->ident, n->type, NULL);
246
 	}
244
 	}
269
 	return 0;
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
 int pass_validate_types(node_t *n, void *_prog)
275
 int pass_validate_types(node_t *n, void *_prog)
278
 {
276
 {
279
 	prog_t *prog = _prog;
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
 int pass_walk(pass_t *pass, ctx_t *ctx)
295
 int pass_walk(pass_t *pass, ctx_t *ctx)

+ 2 - 1
sym.c

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

+ 37 - 34
type.c

10
 		.t = { .scalar = { .name = #_t } },	\
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
 type_t *builtin_types[] = {
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
 	NULL
38
 	NULL
55
 };
39
 };
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
 	type_t *t;
163
 	type_t *t;
180
 	size_t i;
164
 	size_t i;
195
 	return t;
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
 int type_equal(type_t *a, type_t *b)
201
 int type_equal(type_t *a, type_t *b)
199
 {
202
 {
200
 	/* TODO */
203
 	/* TODO */

+ 15 - 29
type.h

76
 	} t;
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
 int type_equal(type_t *a, type_t *b);
95
 int type_equal(type_t *a, type_t *b);
110
 int type_add(type_t *t);
96
 int type_add(type_t *t);