5 ir_builder* ir_builder_new(const char *modulename)
9 self = (ir_builder*)malloc(sizeof(*self));
10 VEC_INIT(self, functions);
11 VEC_INIT(self, globals);
13 ir_builder_set_name(self, modulename);
15 /* globals which always exist */
17 /* for now we give it a vector size */
18 ir_builder_create_global(self, "OFS_RETURN", qc_variant);
23 MAKE_VEC_ADD(ir_builder, ir_value*, globals)
24 MAKE_VEC_ADD(ir_builder, ir_function*, functions)
26 void ir_builder_delete(ir_builder* self)
29 free((void*)self->_name);
30 for (i = 0; i != self->functions_count; ++i) {
31 ir_function_delete(self->functions[i]);
33 VEC_CLEAR(self, functions);
34 for (i = 0; i != self->globals_count; ++i) {
35 ir_value_delete(self->globals[i]);
37 VEC_CLEAR(self, globals);
41 void ir_builder_set_name(ir_builder *self, const char *name)
44 free((void*)self->_name);
45 self->_name = strdup(name);
48 ir_function* ir_builder_get_function(ir_builder *self, const char *name)
51 for (i = 0; i < self->functions_count; ++i) {
52 if (!strcmp(name, self->functions[i]->_name))
53 return self->functions[i];
58 ir_function* ir_builder_create_function(ir_builder *self, const char *name)
60 ir_function *fn = ir_builder_get_function(self, name);
65 fn = ir_function_new(self);
66 ir_function_set_name(fn, name);
67 ir_builder_functions_add(self, fn);
71 ir_value* ir_builder_get_global(ir_builder *self, const char *name)
74 for (i = 0; i < self->globals_count; ++i) {
75 if (!strcmp(self->globals[i]->_name, name))
76 return self->globals[i];
81 ir_value* ir_builder_create_global(ir_builder *self, const char *name, ir_type_t vtype)
83 ir_value *ve = ir_builder_get_global(self, name);
88 ve = ir_value_var(name, qc_global, vtype);
89 ir_builder_globals_add(self, ve);