X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=ir.c;h=d2e1e0f9d612889958fc84385929caec3a63bda6;hb=5e4b8846d1838c6c0244646b2a3f81c94a647b13;hp=4dc791410f415908cca89cdd21e79d6b93c3bd5b;hpb=f9746a59ae2d39df53d1526527297b52121581cf;p=xonotic%2Fgmqcc.git diff --git a/ir.c b/ir.c index 4dc7914..d2e1e0f 100644 --- a/ir.c +++ b/ir.c @@ -919,7 +919,7 @@ bool ir_value_life_merge_into(ir_value *self, const ir_value *other) } if (life->start < entry->start && - life->end >= entry->start) + life->end+1 >= entry->start) { /* starts earlier and overlaps */ entry->start = life->start; @@ -2231,7 +2231,7 @@ static bool ir_block_life_propagate(ir_block *self, ir_block *prev, bool *change * * Breaking conventions is annoying... */ -static bool ir_builder_gen_global(ir_builder *self, ir_value *global); +static bool ir_builder_gen_global(ir_builder *self, ir_value *global, bool islocal); static bool gen_global_field(ir_value *global) { @@ -2576,7 +2576,7 @@ static bool gen_global_function(ir_builder *ir, ir_value *global) local_var_end = fun.firstlocal; for (i = 0; i < irfun->locals_count; ++i) { - if (!ir_builder_gen_global(ir, irfun->locals[i])) { + if (!ir_builder_gen_global(ir, irfun->locals[i], true)) { irerror(irfun->locals[i]->context, "Failed to generate local %s", irfun->locals[i]->name); return false; } @@ -2639,7 +2639,7 @@ static bool gen_global_function_code(ir_builder *ir, ir_value *global) return true; } -static bool ir_builder_gen_global(ir_builder *self, ir_value *global) +static bool ir_builder_gen_global(ir_builder *self, ir_value *global, bool islocal) { size_t i; int32_t *iptr; @@ -2667,8 +2667,9 @@ static bool ir_builder_gen_global(ir_builder *self, ir_value *global) /* I'd argue setting it to 0 is sufficient, but maybe some depend on knowing how far * the system fields actually go? Though the engine knows this anyway... * Maybe this could be an -foption + * fteqcc creates data for end_sys_* - of size 1, so let's do the same */ - ir_value_code_setaddr(global, def.offset); + ir_value_code_setaddr(global, code_globals_add(0)); /* Add the def */ if (code_defs_add(def) < 0) return false; @@ -2685,33 +2686,35 @@ static bool ir_builder_gen_global(ir_builder *self, ir_value *global) /* fall through */ case TYPE_FLOAT: { - if (code_defs_add(def) < 0) - return false; - if (global->isconst) { iptr = (int32_t*)&global->constval.vfloat; ir_value_code_setaddr(global, code_globals_add(*iptr)); - } else + } else { ir_value_code_setaddr(global, code_globals_add(0)); + if (!islocal) + def.type |= DEF_SAVEGLOBAL; + } + if (code_defs_add(def) < 0) + return false; return global->code.globaladdr >= 0; } case TYPE_STRING: { - if (code_defs_add(def) < 0) - return false; if (global->isconst) ir_value_code_setaddr(global, code_globals_add(code_cachedstring(global->constval.vstring))); - else + else { ir_value_code_setaddr(global, code_globals_add(0)); + if (!islocal) + def.type |= DEF_SAVEGLOBAL; + } + if (code_defs_add(def) < 0) + return false; return global->code.globaladdr >= 0; } case TYPE_VECTOR: { size_t d; - if (code_defs_add(def) < 0) - return false; - if (global->isconst) { iptr = (int32_t*)&global->constval.vvec; ir_value_code_setaddr(global, code_globals_add(iptr[0])); @@ -2731,20 +2734,30 @@ static bool ir_builder_gen_global(ir_builder *self, ir_value *global) if (code_globals_add(0) < 0) return false; } + if (!islocal) + def.type |= DEF_SAVEGLOBAL; } + + if (code_defs_add(def) < 0) + return false; return global->code.globaladdr >= 0; } case TYPE_FUNCTION: - if (code_defs_add(def) < 0) - return false; if (!global->isconst) { ir_value_code_setaddr(global, code_globals_add(0)); - return global->code.globaladdr >= 0; + if (global->code.globaladdr < 0) + return false; } else { ir_value_code_setaddr(global, code_globals_elements); code_globals_add(code_functions_elements); - return gen_global_function(self, global); + if (!gen_global_function(self, global)) + return false; + if (!islocal) + def.type |= DEF_SAVEGLOBAL; } + if (code_defs_add(def) < 0) + return false; + return true; case TYPE_VARIANT: /* assume biggest type */ ir_value_code_setaddr(global, code_globals_add(0)); @@ -2836,7 +2849,7 @@ bool ir_builder_generate(ir_builder *self, const char *filename) for (i = 0; i < self->globals_count; ++i) { - if (!ir_builder_gen_global(self, self->globals[i])) { + if (!ir_builder_gen_global(self, self->globals[i], false)) { return false; } } @@ -3096,10 +3109,10 @@ void ir_value_dump(ir_value* v, int (*oprintf)(const char*, ...)) } } -void ir_value_dump_life(ir_value *self, int (*oprintf)(const char*,...)) +void ir_value_dump_life(const ir_value *self, int (*oprintf)(const char*,...)) { size_t i; - oprintf("Life of %s:\n", self->name); + oprintf("Life of %12s:", self->name); for (i = 0; i < self->life_count; ++i) { oprintf(" + [%i, %i]\n", self->life[i].start, self->life[i].end);