+static bool gen_function_locals(ir_builder *ir, ir_value *global)
+{
+ prog_section_function *def;
+ ir_function *irfun;
+ size_t i;
+ uint32_t firstlocal;
+
+ irfun = global->constval.vfunc;
+ def = code_functions + irfun->code_function_def;
+
+ if (opts.g || (irfun->flags & IR_FLAG_MASK_NO_OVERLAP))
+ firstlocal = def->firstlocal = vec_size(code_globals);
+ else
+ firstlocal = def->firstlocal = ir->first_common_local;
+
+ for (i = vec_size(code_globals); i < firstlocal + irfun->allocated_locals; ++i)
+ vec_push(code_globals, 0);
+ for (i = 0; i < vec_size(irfun->locals); ++i) {
+ ir_value_code_setaddr(irfun->locals[i], firstlocal + irfun->locals[i]->code.local);
+ if (!ir_builder_gen_global(ir, irfun->locals[i], true, true)) {
+ irerror(irfun->locals[i]->context, "failed to generate local %s", irfun->locals[i]->name);
+ return false;
+ }
+ }
+ for (i = 0; i < vec_size(irfun->values); ++i)
+ {
+ ir_value *v = irfun->values[i];
+ ir_value_code_setaddr(v, firstlocal + v->code.local);
+ }
+ return true;
+}
+