]> git.xonotic.org Git - xonotic/gmqcc.git/blobdiff - ast.c
don't _move_ values out of immediates, it causes NULL strings to be code-generated
[xonotic/gmqcc.git] / ast.c
diff --git a/ast.c b/ast.c
index 8bbce8f9ace654057a0f54ba98d143b9a24b612e..50b6e872dd540342c94037460174b3e74546db3d 100644 (file)
--- a/ast.c
+++ b/ast.c
@@ -776,6 +776,7 @@ bool ast_global_codegen(ast_value *self, ir_builder *ir)
         ir_function *func = ir_builder_create_function(ir, self->name, self->expression.next->expression.vtype);
         if (!func)
             return false;
+        func->context = ast_ctx(self);
 
         self->constval.vfunc->ir_func = func;
         self->ir_v = func->value;
@@ -787,6 +788,7 @@ bool ast_global_codegen(ast_value *self, ir_builder *ir)
         v = ir_builder_create_field(ir, self->name, self->expression.next->expression.vtype);
         if (!v)
             return false;
+        v->context = ast_ctx(self);
         if (self->isconst) {
             asterror(ast_ctx(self), "TODO: constant field pointers with value\n");
             goto error;
@@ -800,6 +802,7 @@ bool ast_global_codegen(ast_value *self, ir_builder *ir)
         asterror(ast_ctx(self), "ir_builder_create_global failed\n");
         return false;
     }
+    v->context = ast_ctx(self);
 
     if (self->isconst) {
         switch (self->expression.vtype)
@@ -851,6 +854,7 @@ bool ast_local_codegen(ast_value *self, ir_function *func, bool param)
     v = ir_function_create_local(func, self->name, self->expression.vtype, param);
     if (!v)
         return false;
+    v->context = ast_ctx(self);
 
     /* A constant local... hmmm...
      * I suppose the IR will have to deal with this
@@ -933,6 +937,9 @@ bool ast_function_codegen(ast_function *self, ir_builder *ir)
     /* TODO: check return types */
     if (!self->curblock->is_return)
     {
+        return ir_block_create_return(self->curblock, NULL);
+        /* From now on the parser has to handle this situation */
+#if 0
         if (!self->vtype->expression.next ||
             self->vtype->expression.next->expression.vtype == TYPE_VOID)
         {
@@ -944,6 +951,7 @@ bool ast_function_codegen(ast_function *self, ir_builder *ir)
             asterror(ast_ctx(self), "function `%s` missing return value", self->name);
             return false;
         }
+#endif
     }
     return true;
 }
@@ -1332,9 +1340,9 @@ bool ast_ifthen_codegen(ast_ifthen *self, ast_function *func, bool lvalue, ir_va
         return false;
 
     /* add jumps ot the merge block */
-    if (ontrue && !ir_block_create_jump(ontrue, merge))
+    if (ontrue && !ontrue->final && !ir_block_create_jump(ontrue, merge))
         return false;
-    if (onfalse && !ir_block_create_jump(onfalse, merge))
+    if (onfalse && !onfalse->final && !ir_block_create_jump(onfalse, merge))
         return false;
 
     /* we create the if here, that way all blocks are ordered :)
@@ -1652,7 +1660,7 @@ bool ast_loop_codegen(ast_loop *self, ast_function *func, bool lvalue, ir_value
         else if (bpostcond)  tmpblock = bpostcond;
         else if (bprecond)   tmpblock = bprecond;
         else                 tmpblock = bout;
-        if (!ir_block_create_jump(end_bbody, tmpblock))
+        if (!end_bbody->final && !ir_block_create_jump(end_bbody, tmpblock))
             return false;
     }