[qfcc] Use correct flags for in and uniform

They're not actually constant (in the usual sense), just read-only.
Fixes an internal error when accessing an unsigned array.
This commit is contained in:
Bill Currie 2024-09-01 16:40:47 +09:00
parent a24d1d799f
commit cba28e9421
2 changed files with 36 additions and 59 deletions

View file

@ -93,16 +93,23 @@ typedef struct def_s {
struct daglabel_s *daglabel;///< daglabel for this def
struct flowvar_s *flowvar; ///< flowvar for this def
unsigned offset_reloc:1; ///< use *_def_ofs relocs
unsigned initialized:1; ///< the def has been initialized
unsigned constant:1; ///< stores constant value
unsigned global:1; ///< globally declared def
unsigned external:1; ///< externally declared def
unsigned local:1; ///< function local def
unsigned param:1; ///< function param def
unsigned argument:1; ///< function argument def
unsigned system:1; ///< system def
unsigned nosave:1; ///< don't set DEF_SAVEGLOBAL
union {
struct {
bool offset_reloc:1; ///< use *_def_ofs relocs
bool initialized:1; ///< the def has been initialized
bool constant:1; ///< stores constant value
bool readonly:1;
bool writeonly:1;
bool global:1; ///< globally declared def
bool external:1; ///< externally declared def
bool local:1; ///< function local def
bool param:1; ///< function param def
bool argument:1; ///< function argument def
bool system:1; ///< system def
bool nosave:1; ///< don't set DEF_SAVEGLOBAL
};
unsigned storage_bits;
};
rua_loc_t loc; ///< declaring/defining source location

View file

@ -68,72 +68,42 @@ ALLOC_STATE (def_t, defs);
static void
set_storage_bits (def_t *def, storage_class_t storage)
{
def->storage_bits = 0;
switch (storage) {
case sc_out:
case sc_buffer:
case sc_shared:
def->global = 1;
def->external = 0;
def->local = 0;
def->param = 0;
def->argument = 0;
def->global = true;
break;
case sc_system:
def->system = 1;
def->system = true;
// fall through
case sc_global:
def->global = 1;
def->external = 0;
def->local = 0;
def->param = 0;
def->argument = 0;
def->global = true;
break;
case sc_in:
case sc_uniform:
def->global = 1;
def->constant = 1;
def->external = 0;
def->local = 0;
def->param = 0;
def->argument = 0;
def->global = true;
def->readonly = true;
break;
case sc_extern:
def->global = 1;
def->external = 1;
def->local = 0;
def->param = 0;
def->argument = 0;
def->global = true;
def->external = true;
break;
case sc_static:
def->external = 0;
def->global = 0;
def->local = 0;
def->param = 0;
def->argument = 0;
break;
case sc_local:
def->external = 0;
def->global = 0;
def->local = 1;
def->param = 0;
def->argument = 0;
def->local = true;
break;
case sc_param:
def->external = 0;
def->global = 0;
def->local = 1;
def->param = 1;
def->argument = 0;
def->local = true;
def->param = true;
break;
case sc_argument:
def->external = 0;
def->global = 0;
def->local = 1;
def->param = 0;
def->argument = 1;
def->local = true;
def->argument = true;
break;
}
def->initialized = 0;
}
def_t *
@ -144,12 +114,12 @@ new_def (const char *name, const type_t *type, defspace_t *space,
ALLOC (16384, def_t, defs, def);
def->return_addr = __builtin_return_address (0);
def->name = name ? save_string (name) : 0;
def->type = type;
def->loc = pr.loc;
*def = (def_t) {
.type = type,
.name = name ? save_string (name) : 0,
.loc = pr.loc,
.return_addr = __builtin_return_address (0),
};
set_storage_bits (def, storage);