]> git.xonotic.org Git - xonotic/gmqcc.git/blobdiff - ir.c
entity setter array subscript needs to get a correct field type
[xonotic/gmqcc.git] / ir.c
diff --git a/ir.c b/ir.c
index bd8f12fb20f79a1d2a72ec4ec6b6d9aea981fb13..05f21d5c700365ad2e03183b23c627752e5dfa72 100644 (file)
--- a/ir.c
+++ b/ir.c
@@ -2204,7 +2204,7 @@ bool ir_function_allocate_locals(ir_function *self)
     for (i = 0; i < vec_size(self->locals); ++i)
     {
         v = self->locals[i];
-        if (!OPTS_OPTIMIZATION(OPTIM_LOCAL_TEMPS)) {
+        if ((self->flags & IR_FLAG_MASK_NO_LOCAL_TEMPS) || !OPTS_OPTIMIZATION(OPTIM_LOCAL_TEMPS)) {
             v->locked      = true;
             v->unique_life = true;
         }
@@ -3176,6 +3176,42 @@ static bool gen_function_extparam_copy(ir_function *self)
     return true;
 }
 
+static bool gen_function_varargs_copy(ir_function *self)
+{
+    size_t i, ext, numparams, maxparams;
+
+    ir_builder *ir = self->owner;
+    ir_value   *ep;
+    prog_section_statement stmt;
+
+    numparams = vec_size(self->params);
+    if (!numparams)
+        return true;
+
+    stmt.opcode = INSTR_STORE_V;
+    stmt.o3.s1 = 0;
+    maxparams = numparams + self->max_varargs;
+    for (i = numparams; i < maxparams; ++i) {
+        if (i <= 8) {
+            stmt.o1.u1 = OFS_PARM0 + 3*i;
+            stmt.o2.u1 = ir_value_code_addr(self->locals[i]);
+            code_push_statement(&stmt, self->context.line);
+            continue;
+        }
+        ext = i - 8;
+        if (ext >= vec_size(ir->extparams))
+            ir_gen_extparam(ir);
+
+        ep = ir->extparams[ext];
+
+        stmt.o1.u1 = ir_value_code_addr(ep);
+        stmt.o2.u1 = ir_value_code_addr(self->locals[i]);
+        code_push_statement(&stmt, self->context.line);
+    }
+
+    return true;
+}
+
 static bool gen_function_locals(ir_builder *ir, ir_value *global)
 {
     prog_section_function *def;
@@ -3257,6 +3293,10 @@ static bool gen_global_function_code(ir_builder *ir, ir_value *global)
         irerror(irfun->context, "Failed to generate extparam-copy code for function %s", irfun->name);
         return false;
     }
+    if (irfun->max_varargs && !gen_function_varargs_copy(irfun)) {
+        irerror(irfun->context, "Failed to generate vararg-copy code for function %s", irfun->name);
+        return false;
+    }
     if (!gen_function_code(irfun)) {
         irerror(irfun->context, "Failed to generate code for function %s", irfun->name);
         return false;