]> git.xonotic.org Git - xonotic/gmqcc.git/blob - ir.c
macros, strdup->util_strdup, malloc->mem_a
[xonotic/gmqcc.git] / ir.c
1 #include <stdlib.h>
2 #include <string.h>
3 #include "ir.h"
4
5 ir_builder* ir_builder_new(const char *modulename)
6 {
7         ir_builder* self;
8
9         self = (ir_builder*)mem_a(sizeof(*self));
10         MEM_VECTOR_INIT(self, functions);
11         MEM_VECTOR_INIT(self, globals);
12         self->name = NULL;
13         ir_builder_set_name(self, modulename);
14
15         /* globals which always exist */
16
17         /* for now we give it a vector size */
18         ir_builder_create_global(self, "OFS_RETURN", qc_variant);
19
20         return self;
21 }
22
23 MEM_VEC_FUNCTIONS(ir_builder, ir_value*, globals)
24 MEM_VECTOR_FUNCTIONS(ir_builder, ir_function*, functions)
25
26 void ir_builder_delete(ir_builder* self)
27 {
28         size_t i;
29         mem_d((void*)self->name);
30         for (i = 0; i != self->functions_count; ++i) {
31                 ir_function_delete(self->functions[i]);
32         }
33         VEC_CLEAR(self, functions);
34         for (i = 0; i != self->globals_count; ++i) {
35                 ir_value_delete(self->globals[i]);
36         }
37         VEC_CLEAR(self, globals);
38         mem_d(self);
39 }
40
41 void ir_builder_set_name(ir_builder *self, const char *name)
42 {
43         if (self->name)
44                 mem_d((void*)self->name);
45         self->name = util_strdup(name);
46 }
47
48 ir_function* ir_builder_get_function(ir_builder *self, const char *name)
49 {
50         size_t i;
51         for (i = 0; i < self->functions_count; ++i) {
52                 if (!strcmp(name, self->functions[i]->name))
53                         return self->functions[i];
54         }
55         return NULL;
56 }
57
58 ir_function* ir_builder_create_function(ir_builder *self, const char *name)
59 {
60         ir_function *fn = ir_builder_get_function(self, name);
61         if (fn) {
62                 return NULL;
63         }
64
65         fn = ir_function_new(self);
66         ir_function_set_name(fn, name);
67         ir_builder_functions_add(self, fn);
68         return fn;
69 }
70
71 ir_value* ir_builder_get_global(ir_builder *self, const char *name)
72 {
73         size_t i;
74         for (i = 0; i < self->globals_count; ++i) {
75                 if (!strcmp(self->globals[i]->name, name))
76                         return self->globals[i];
77         }
78         return NULL;
79 }
80
81 ir_value* ir_builder_create_global(ir_builder *self, const char *name, ir_type_t vtype)
82 {
83         ir_value *ve = ir_builder_get_global(self, name);
84         if (ve) {
85                 return NULL;
86         }
87
88         ve = ir_value_var(name, qc_global, vtype);
89         ir_builder_globals_add(self, ve);
90         return ve;
91 }