mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-02-25 21:21:14 +00:00
[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:
parent
753e21f56a
commit
6e4812f914
6 changed files with 9 additions and 27 deletions
|
@ -68,6 +68,7 @@ typedef struct symbol_s {
|
||||||
const struct type_s *type; ///< type of object to which symbol refers
|
const struct type_s *type; ///< type of object to which symbol refers
|
||||||
struct param_s *params; ///< the parameters if a function
|
struct param_s *params; ///< the parameters if a function
|
||||||
bool no_auto_init:1; ///< skip for non-designated initializers
|
bool no_auto_init:1; ///< skip for non-designated initializers
|
||||||
|
bool lvalue;
|
||||||
union {
|
union {
|
||||||
int offset; ///< sy_offset
|
int offset; ///< sy_offset
|
||||||
struct def_s *def; ///< sy_def
|
struct def_s *def; ///< sy_def
|
||||||
|
|
|
@ -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);
|
sym->def = new_def (sym->name, sym->type, space, storage);
|
||||||
reloc_attach_relocs (relocs, &sym->def->relocs);
|
reloc_attach_relocs (relocs, &sym->def->relocs);
|
||||||
}
|
}
|
||||||
|
sym->lvalue = !sym->def->readonly;
|
||||||
if (is_vector(sym->type) && options.code.vector_components)
|
if (is_vector(sym->type) && options.code.vector_components)
|
||||||
init_vector_components (sym, 0, symtab);
|
init_vector_components (sym, 0, symtab);
|
||||||
if (sym->type->type == ev_field && storage != sc_local
|
if (sym->type->type == ev_field && storage != sc_local
|
||||||
|
|
|
@ -88,32 +88,7 @@ is_lvalue (const expr_t *expr)
|
||||||
case ex_def:
|
case ex_def:
|
||||||
return !expr->def->constant;
|
return !expr->def->constant;
|
||||||
case ex_symbol:
|
case ex_symbol:
|
||||||
switch (expr->symbol->sy_type) {
|
return expr->symbol->lvalue;
|
||||||
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;
|
|
||||||
case ex_temp:
|
case ex_temp:
|
||||||
return 1;
|
return 1;
|
||||||
case ex_expr:
|
case ex_expr:
|
||||||
|
|
|
@ -1043,6 +1043,7 @@ create_param (symtab_t *parameters, symbol_t *param)
|
||||||
def->type = param->type;
|
def->type = param->type;
|
||||||
param->def = def;
|
param->def = def;
|
||||||
param->sy_type = sy_def;
|
param->sy_type = sy_def;
|
||||||
|
param->lvalue = !def->readonly;
|
||||||
symtab_addsymbol (parameters, param);
|
symtab_addsymbol (parameters, param);
|
||||||
if (is_vector(param->type) && options.code.vector_components)
|
if (is_vector(param->type) && options.code.vector_components)
|
||||||
init_vector_components (param, 0, parameters);
|
init_vector_components (param, 0, parameters);
|
||||||
|
|
|
@ -124,6 +124,7 @@ glsl_create_block (specifier_t spec, symbol_t *block_sym)
|
||||||
def->type = sym->type;
|
def->type = sym->type;
|
||||||
sym->sy_type = sy_def;
|
sym->sy_type = sy_def;
|
||||||
sym->def = def;
|
sym->def = def;
|
||||||
|
sym->lvalue = true;
|
||||||
}
|
}
|
||||||
return block;
|
return block;
|
||||||
}
|
}
|
||||||
|
@ -134,9 +135,11 @@ glsl_finish_block (glsl_block_t *block, specifier_t spec)
|
||||||
spec.sym = block->name;
|
spec.sym = block->name;
|
||||||
glsl_apply_attributes (block->attributes, spec);
|
glsl_apply_attributes (block->attributes, spec);
|
||||||
for (auto sym = block->members->symbols; sym; sym = sym->next) {
|
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)
|
//FIXME sc_extern isn't correct (problem with unsized arrays)
|
||||||
sym->def = new_def (sym->name, sym->type, block->space, sc_extern);
|
sym->def = new_def (sym->name, sym->type, block->space, sc_extern);
|
||||||
|
sym->sy_type = sy_def;
|
||||||
|
sym->lvalue = !sym->def->readonly;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -240,6 +240,7 @@ make_symbol (const char *name, const type_t *type, defspace_t *space,
|
||||||
reloc_attach_relocs (relocs, &sym->def->relocs);
|
reloc_attach_relocs (relocs, &sym->def->relocs);
|
||||||
}
|
}
|
||||||
sym->sy_type = sy_def;
|
sym->sy_type = sy_def;
|
||||||
|
sym->lvalue = !sym->def->readonly;
|
||||||
return sym;
|
return sym;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue