diff --git a/tools/qfcc/source/obj_file.c b/tools/qfcc/source/obj_file.c index 10ca126f9..e0b6c668f 100644 --- a/tools/qfcc/source/obj_file.c +++ b/tools/qfcc/source/obj_file.c @@ -795,6 +795,14 @@ qfo_relocate_refs (qfo_t *qfo) } } +static unsigned +align_globals_size (unsigned size) +{ + if (options.code.progsversion == PROG_ID_VERSION) + return size; + return RUP (size, 16 / sizeof (pr_type_t)); +} + dprograms_t * qfo_to_progs (qfo_t *qfo, int *size) { @@ -811,6 +819,7 @@ qfo_to_progs (qfo_t *qfo, int *size) dprograms_t *progs; qfo_def_t *types_def = 0; unsigned i, j; + unsigned near_data_size = 0; unsigned locals_size = 0; int locals_start; unsigned big_locals = 0; @@ -827,9 +836,8 @@ qfo_to_progs (qfo_t *qfo, int *size) progs->numfunctions = qfo->num_funcs + 1; progs->numstrings = qfo->spaces[qfo_strings_space].data_size; progs->numglobals = qfo->spaces[qfo_near_data_space].data_size; - progs->numglobals += qfo->spaces[qfo_far_data_space].data_size; - progs->numglobals += qfo->spaces[qfo_type_space].data_size; - locals_start = qfo->spaces[qfo_near_data_space].data_size; + progs->numglobals = align_globals_size (progs->numglobals); + locals_start = progs->numglobals; for (i = qfo_num_spaces; i < qfo->num_spaces; i++) { if (options.code.local_merging) { if (locals_size < qfo->spaces[i].data_size) { @@ -837,11 +845,14 @@ qfo_to_progs (qfo_t *qfo, int *size) big_locals = i; } } else { - locals_size += qfo->spaces[i].data_size; + locals_size += align_globals_size (qfo->spaces[i].data_size); } } progs->numglobals += locals_size; + near_data_size = progs->numglobals; progs->numglobals = RUP (progs->numglobals, 16 / sizeof (pr_type_t)); + progs->numglobals += qfo->spaces[qfo_far_data_space].data_size; + progs->numglobals += qfo->spaces[qfo_type_space].data_size; progs->entityfields = qfo->spaces[qfo_entity_space].data_size; *size += progs->numstatements * sizeof (dstatement_t); *size += progs->numglobaldefs * sizeof (ddef_t); @@ -902,7 +913,7 @@ qfo_to_progs (qfo_t *qfo, int *size) for (j = 0; j < space->num_defs; j++) space->defs[j].offset += locals_start; if (!options.code.local_merging) - locals_start += df->locals; + locals_start += align_globals_size (df->locals); df->profile = 0; df->s_name = qf->name; df->s_file = qf->file; @@ -978,8 +989,7 @@ qfo_to_progs (qfo_t *qfo, int *size) printf ("%6i global defs\n", progs->numglobaldefs); printf ("%6i fielddefs\n", progs->numfielddefs); printf ("%6i globals\n", progs->numglobals); - printf (" %6i near globals\n", - qfo->spaces[qfo_near_data_space].data_size + locals_size); + printf (" %6i near globals\n", near_data_size); printf (" %6i locals size%s\n", locals_size, big_function); printf (" %6i far globals\n", qfo->spaces[qfo_far_data_space].data_size);