[qfcc] Mark symbols as being lvalue or not

This simplifies things a lot and fstrianglest.vert compiles again
(albeit incorrectly).
This commit is contained in:
Bill Currie 2024-09-21 22:08:51 +09:00
parent 753e21f56a
commit 6e4812f914
6 changed files with 9 additions and 27 deletions

View file

@ -68,6 +68,7 @@ typedef struct symbol_s {
const struct type_s *type; ///< type of object to which symbol refers
struct param_s *params; ///< the parameters if a function
bool no_auto_init:1; ///< skip for non-designated initializers
bool lvalue;
union {
int offset; ///< sy_offset
struct def_s *def; ///< sy_def

View file

@ -602,6 +602,7 @@ initialize_def (symbol_t *sym, const expr_t *init, defspace_t *space,
sym->def = new_def (sym->name, sym->type, space, storage);
reloc_attach_relocs (relocs, &sym->def->relocs);
}
sym->lvalue = !sym->def->readonly;
if (is_vector(sym->type) && options.code.vector_components)
init_vector_components (sym, 0, symtab);
if (sym->type->type == ev_field && storage != sc_local

View file

@ -88,32 +88,7 @@ is_lvalue (const expr_t *expr)
case ex_def:
return !expr->def->constant;
case ex_symbol:
switch (expr->symbol->sy_type) {
case sy_name:
case sy_offset:
break;
case sy_def:
return !expr->symbol->def->readonly;
case sy_const:
break;
case sy_type:
case sy_type_param:
break;
case sy_expr:
break;
case sy_func:
break;
case sy_class:
break;
case sy_convert:
break;
case sy_macro:
case sy_namespace:
case sy_list:
case sy_num_types:
break;
}
break;
return expr->symbol->lvalue;
case ex_temp:
return 1;
case ex_expr:

View file

@ -1043,6 +1043,7 @@ create_param (symtab_t *parameters, symbol_t *param)
def->type = param->type;
param->def = def;
param->sy_type = sy_def;
param->lvalue = !def->readonly;
symtab_addsymbol (parameters, param);
if (is_vector(param->type) && options.code.vector_components)
init_vector_components (param, 0, parameters);

View file

@ -124,6 +124,7 @@ glsl_create_block (specifier_t spec, symbol_t *block_sym)
def->type = sym->type;
sym->sy_type = sy_def;
sym->def = def;
sym->lvalue = true;
}
return block;
}
@ -134,9 +135,11 @@ glsl_finish_block (glsl_block_t *block, specifier_t spec)
spec.sym = block->name;
glsl_apply_attributes (block->attributes, spec);
for (auto sym = block->members->symbols; sym; sym = sym->next) {
if (sym->sy_type == sy_def) {
if (sym->sy_type == sy_offset) {
//FIXME sc_extern isn't correct (problem with unsized arrays)
sym->def = new_def (sym->name, sym->type, block->space, sc_extern);
sym->sy_type = sy_def;
sym->lvalue = !sym->def->readonly;
}
}
}

View file

@ -240,6 +240,7 @@ make_symbol (const char *name, const type_t *type, defspace_t *space,
reloc_attach_relocs (relocs, &sym->def->relocs);
}
sym->sy_type = sy_def;
sym->lvalue = !sym->def->readonly;
return sym;
}