]> git.xonotic.org Git - xonotic/gmqcc.git/commitdiff
importing from ir_builder.c -> ir.c
authorWolfgang (Blub) Bumiller <blub@speed.at>
Wed, 25 Apr 2012 12:43:23 +0000 (14:43 +0200)
committerWolfgang (Blub) Bumiller <blub@speed.at>
Wed, 25 Apr 2012 15:27:47 +0000 (17:27 +0200)
ir.c [new file with mode: 0644]

diff --git a/ir.c b/ir.c
new file mode 100644 (file)
index 0000000..c6e148a
--- /dev/null
+++ b/ir.c
@@ -0,0 +1,91 @@
+#include <stdlib.h>
+#include <string.h>
+#include "ir.h"
+
+ir_builder* ir_builder_new(const char *modulename)
+{
+       ir_builder* self;
+
+       self = (ir_builder*)malloc(sizeof(*self));
+       VEC_INIT(self, functions);
+       VEC_INIT(self, globals);
+       self->_name = NULL;
+       ir_builder_set_name(self, modulename);
+
+       /* globals which always exist */
+
+       /* for now we give it a vector size */
+       ir_builder_create_global(self, "OFS_RETURN", qc_variant);
+
+       return self;
+}
+
+MAKE_VEC_ADD(ir_builder, ir_value*, globals)
+MAKE_VEC_ADD(ir_builder, ir_function*, functions)
+
+void ir_builder_delete(ir_builder* self)
+{
+       size_t i;
+       free((void*)self->_name);
+       for (i = 0; i != self->functions_count; ++i) {
+               ir_function_delete(self->functions[i]);
+       }
+       VEC_CLEAR(self, functions);
+       for (i = 0; i != self->globals_count; ++i) {
+               ir_value_delete(self->globals[i]);
+       }
+       VEC_CLEAR(self, globals);
+       free(self);
+}
+
+void ir_builder_set_name(ir_builder *self, const char *name)
+{
+       if (self->_name)
+               free((void*)self->_name);
+       self->_name = strdup(name);
+}
+
+ir_function* ir_builder_get_function(ir_builder *self, const char *name)
+{
+       size_t i;
+       for (i = 0; i < self->functions_count; ++i) {
+               if (!strcmp(name, self->functions[i]->_name))
+                       return self->functions[i];
+       }
+       return NULL;
+}
+
+ir_function* ir_builder_create_function(ir_builder *self, const char *name)
+{
+       ir_function *fn = ir_builder_get_function(self, name);
+       if (fn) {
+               return NULL;
+       }
+
+       fn = ir_function_new(self);
+       ir_function_set_name(fn, name);
+       ir_builder_functions_add(self, fn);
+       return fn;
+}
+
+ir_value* ir_builder_get_global(ir_builder *self, const char *name)
+{
+       size_t i;
+       for (i = 0; i < self->globals_count; ++i) {
+               if (!strcmp(self->globals[i]->_name, name))
+                       return self->globals[i];
+       }
+       return NULL;
+}
+
+ir_value* ir_builder_create_global(ir_builder *self, const char *name, ir_type_t vtype)
+{
+       ir_value *ve = ir_builder_get_global(self, name);
+       if (ve) {
+               return NULL;
+       }
+
+       ve = ir_value_var(name, qc_global, vtype);
+       ir_builder_globals_add(self, ve);
+       return ve;
+}