mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-02-26 13:41:21 +00:00
Convert complex types to a suitable low-level type.
This takes care of moving structures etc around.
This commit is contained in:
parent
b629c12b31
commit
ef2ad46f7a
3 changed files with 24 additions and 8 deletions
|
@ -116,6 +116,7 @@ extern struct symtab_s *quaternion_struct;
|
||||||
|
|
||||||
struct dstring_s;
|
struct dstring_s;
|
||||||
|
|
||||||
|
etype_t low_level_type (type_t *type);
|
||||||
type_t *new_type (void);
|
type_t *new_type (void);
|
||||||
void free_type (type_t *type);
|
void free_type (type_t *type);
|
||||||
void chain_type (type_t *type);
|
void chain_type (type_t *type);
|
||||||
|
|
|
@ -420,7 +420,7 @@ expr_deref (sblock_t *sblock, expr_t *e, operand_t **op)
|
||||||
if (e->type == ex_uexpr && e->e.expr.op == '&'
|
if (e->type == ex_uexpr && e->e.expr.op == '&'
|
||||||
&& e->e.expr.e1->type == ex_symbol) {
|
&& e->e.expr.e1->type == ex_symbol) {
|
||||||
*op = new_operand (op_symbol);
|
*op = new_operand (op_symbol);
|
||||||
(*op)->type = type->type;
|
(*op)->type = low_level_type (type);
|
||||||
(*op)->o.symbol = e->e.expr.e1->e.symbol;
|
(*op)->o.symbol = e->e.expr.e1->e.symbol;
|
||||||
}
|
}
|
||||||
return sblock;
|
return sblock;
|
||||||
|
@ -455,7 +455,7 @@ expr_expr (sblock_t *sblock, expr_t *e, operand_t **op)
|
||||||
sblock = statement_subexpr (sblock, e->e.expr.e2, &s->opb);
|
sblock = statement_subexpr (sblock, e->e.expr.e2, &s->opb);
|
||||||
if (!*op) {
|
if (!*op) {
|
||||||
*op = new_operand (op_temp);
|
*op = new_operand (op_temp);
|
||||||
(*op)->type = e->e.expr.type->type;
|
(*op)->type = low_level_type (e->e.expr.type);
|
||||||
}
|
}
|
||||||
s->opc = *op;
|
s->opc = *op;
|
||||||
sblock_add_statement (sblock, s);
|
sblock_add_statement (sblock, s);
|
||||||
|
@ -469,7 +469,7 @@ expr_cast (sblock_t *sblock, expr_t *e, operand_t **op)
|
||||||
{
|
{
|
||||||
if (!*op) {
|
if (!*op) {
|
||||||
(*op) = new_operand (op_temp);
|
(*op) = new_operand (op_temp);
|
||||||
(*op)->type = e->e.expr.type->type;
|
(*op)->type = low_level_type (e->e.expr.type);
|
||||||
}
|
}
|
||||||
sblock = statement_subexpr (sblock, e->e.expr.e1, op);
|
sblock = statement_subexpr (sblock, e->e.expr.e1, op);
|
||||||
return sblock;
|
return sblock;
|
||||||
|
@ -498,10 +498,7 @@ static sblock_t *
|
||||||
expr_symbol (sblock_t *sblock, expr_t *e, operand_t **op)
|
expr_symbol (sblock_t *sblock, expr_t *e, operand_t **op)
|
||||||
{
|
{
|
||||||
*op = new_operand (op_symbol);
|
*op = new_operand (op_symbol);
|
||||||
if (is_enum (e->e.symbol->type))
|
(*op)->type = low_level_type (e->e.symbol->type);
|
||||||
(*op)->type = type_default->type;
|
|
||||||
else
|
|
||||||
(*op)->type = e->e.symbol->type->type;
|
|
||||||
(*op)->o.symbol = e->e.symbol;
|
(*op)->o.symbol = e->e.symbol;
|
||||||
return sblock;
|
return sblock;
|
||||||
}
|
}
|
||||||
|
@ -511,7 +508,7 @@ expr_temp (sblock_t *sblock, expr_t *e, operand_t **op)
|
||||||
{
|
{
|
||||||
if (!e->e.temp.op) {
|
if (!e->e.temp.op) {
|
||||||
e->e.temp.op = new_operand (op_temp);
|
e->e.temp.op = new_operand (op_temp);
|
||||||
e->e.temp.op->type = e->e.temp.type->type;
|
e->e.temp.op->type = low_level_type (e->e.temp.type);
|
||||||
}
|
}
|
||||||
*op = e->e.temp.op;
|
*op = e->e.temp.op;
|
||||||
return sblock;
|
return sblock;
|
||||||
|
|
|
@ -88,6 +88,24 @@ type_t type_floatfield = { ev_field, ".float", ty_none, {{&type_float}} };
|
||||||
|
|
||||||
static type_t *free_types;
|
static type_t *free_types;
|
||||||
|
|
||||||
|
etype_t
|
||||||
|
low_level_type (type_t *type)
|
||||||
|
{
|
||||||
|
if (type->type < 0 || type->type >= ev_type_count)
|
||||||
|
internal_error (0, "invalid type");
|
||||||
|
if (type->type == ev_type_count)
|
||||||
|
internal_error (0, "found 'type count' type");
|
||||||
|
if (type->type < ev_invalid)
|
||||||
|
return type->type;
|
||||||
|
if (is_enum (type))
|
||||||
|
return type_default->type;
|
||||||
|
if (is_struct (type) || is_class (type))
|
||||||
|
return ev_void;
|
||||||
|
if (is_array (type))
|
||||||
|
return ev_void;
|
||||||
|
internal_error (0, "invalid complex type");
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
chain_type (type_t *type)
|
chain_type (type_t *type)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue