Mark alias def chains as a bug.

This commit is contained in:
Bill Currie 2012-05-03 13:27:30 +09:00
parent 5f676c367f
commit ec98e3e206
3 changed files with 24 additions and 0 deletions

View file

@ -139,11 +139,20 @@ alias_def (def_t *def, type_t *type)
{ {
def_t *alias; def_t *alias;
if (def->alias) {
expr_t e;
e.file = def->file;
e.line = def->line;
bug (&e, "aliasing an alias def");
}
ALLOC (16384, def_t, defs, alias); ALLOC (16384, def_t, defs, alias);
alias->return_addr = __builtin_return_address (0); alias->return_addr = __builtin_return_address (0);
alias->offset = def->offset; alias->offset = def->offset;
alias->type = type; alias->type = type;
alias->alias = def; alias->alias = def;
alias->line = pr.source_line;
alias->file = pr.source_file;
return alias; return alias;
} }

View file

@ -132,8 +132,15 @@ add_statement_def_ref (def_t *def, dstatement_t *st, int field)
if (def) { if (def) {
int st_ofs = st - pr.code->code; int st_ofs = st - pr.code->code;
int offset_reloc = 0; int offset_reloc = 0;
int alias_depth = 0;
expr_t alias_depth_expr;
while (def->alias) { while (def->alias) {
if (!alias_depth) {
alias_depth_expr.file = def->file;
alias_depth_expr.line = def->line;
}
alias_depth++;
//FIXME it seems there is a bug somewhere creating chains //FIXME it seems there is a bug somewhere creating chains
//of aliases //of aliases
def_t *a = def; def_t *a = def;
@ -141,6 +148,10 @@ add_statement_def_ref (def_t *def, dstatement_t *st, int field)
def = def->alias; def = def->alias;
free_def (a); free_def (a);
} }
if (alias_depth > 1) {
bug (&alias_depth_expr, "alias chain detected: %d %s",
alias_depth, def->name);
}
if (offset_reloc) if (offset_reloc)
reloc_op_def_ofs (def, st_ofs, field); reloc_op_def_ofs (def, st_ofs, field);
else else

View file

@ -870,6 +870,10 @@ new_alias_expr (type_t *type, expr_t *expr)
alias = new_unary_expr ('A', expr); alias = new_unary_expr ('A', expr);
alias->e.expr.type = type; alias->e.expr.type = type;
if (expr->type == ex_uexpr && expr->e.expr.op == 'A')
bug (alias, "aliasing an alias expression");
alias->file = expr->file;
alias->line = expr->line;
return alias; return alias;
} }