]> de.git.xonotic.org Git - xonotic/gmqcc.git/commitdiff
Adding from astcodegen.c
authorWolfgang (Blub) Bumiller <blub@speed.at>
Wed, 25 Apr 2012 11:24:25 +0000 (13:24 +0200)
committerWolfgang (Blub) Bumiller <blub@speed.at>
Wed, 25 Apr 2012 15:27:47 +0000 (17:27 +0200)
ast.c

diff --git a/ast.c b/ast.c
index 26389cab89b14bec8406648e9ffa859d7785489a..ef550e0195110aa587321cd0876b6c9fef83f361 100644 (file)
--- a/ast.c
+++ b/ast.c
@@ -153,3 +153,77 @@ void ast_function_delete(ast_function *self)
     MEM_VECTOR_CLEAR(self, blocks);
     mem_d(self);
 }
+
+/*********************************************************************/
+/* AST codegen aprt
+ */
+
+static qbool ast_value_gen_global(ir_builder *ir, ast_value *self, ir_value **out)
+{
+       ir_value *v;
+       *out = NULL;
+
+       /* Generate functions */
+       if (self->vtype == qc_function && self->has_constval)
+       {
+               /* Without has_constval it would be invalid... function pointers actually have
+                * type qc_pointer and next with type qc_function
+                */
+               ast_function *func = self->cvalue.vfunc;
+               (void)func;
+               if (!ast_function_codegen(func, ir))
+                       return ifalse;
+
+               /* Here we do return NULL anyway */
+               return itrue;
+       }
+       else if (self->vtype == qc_function && !self->has_constval) {
+               fprintf(stderr,
+               "!v->has_constval <- qc_function body missing - FIXME: remove when implementing prototypes\n");
+               fprintf(stderr, "Value: %s\n", self->_name);
+               abort();
+       }
+
+       v = ir_builder_create_global(ir, self->_name, self->vtype);
+       self->ir_v = v;
+
+       *out = v;
+       return itrue;
+}
+
+qbool ast_value_codegen(ast_value *self, ast_function *func, ir_value **out)
+{
+       if (!func)
+               return ast_value_gen_global(parser.ir, self, out);
+       return ifalse;
+}
+
+qbool ast_function_codegen(ast_function *self, ir_builder *builder)
+{
+       size_t i;
+       for (i = 0; i < self->blocks_count; ++i)
+       {
+               ast_expression *expr;
+               ir_value *out;
+
+               expr = (ast_expression*)self->blocks[i];
+
+               if (!(expr->expression.codegen)(expr, self, &out))
+               {
+                       /* there was an error while building this expression... */
+                       return ifalse;
+               }
+               (void)out;
+       }
+       return itrue;
+}
+
+qbool ast_block_codegen(ast_block *self, ir_function *func, ir_value **out)
+{
+       return ifalse;
+}
+
+qbool ast_bin_store_codegen(ast_binary *self, ir_function *func, ir_value **out)
+{
+       return ifalse;
+}