From: Wolfgang (Blub) Bumiller Date: Wed, 25 Apr 2012 12:43:23 +0000 (+0200) Subject: importing from ir_builder.c -> ir.c X-Git-Tag: 0.1-rc1~615 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=1cc0cfdceca61ad2a8b2a4a116b3e2f933677cb4;p=xonotic%2Fgmqcc.git importing from ir_builder.c -> ir.c --- diff --git a/ir.c b/ir.c new file mode 100644 index 0000000..c6e148a --- /dev/null +++ b/ir.c @@ -0,0 +1,91 @@ +#include +#include +#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; +}