ir_validate: Validate that varibles are declared before used in IR

This commit is contained in:
Ian Romanick
2010-07-12 13:55:32 -07:00
parent 3fb878722e
commit 8baf21b1a4

View File

@@ -58,6 +58,7 @@ public:
} }
virtual ir_visitor_status visit(ir_variable *v); virtual ir_visitor_status visit(ir_variable *v);
virtual ir_visitor_status visit(ir_dereference_variable *ir);
virtual ir_visitor_status visit_enter(ir_function *ir); virtual ir_visitor_status visit_enter(ir_function *ir);
virtual ir_visitor_status visit_leave(ir_function *ir); virtual ir_visitor_status visit_leave(ir_function *ir);
@@ -70,6 +71,27 @@ public:
struct hash_table *ht; struct hash_table *ht;
}; };
ir_visitor_status
ir_validate::visit(ir_dereference_variable *ir)
{
if ((ir->var == NULL) || (ir->var->as_variable() == NULL)) {
printf("ir_dereference_variable @ %p does not specify a variable %p\n",
ir, ir->var);
abort();
}
if (hash_table_find(ht, ir->var) == NULL) {
printf("ir_dereference_variable @ %p specifies undeclared variable "
"`%s' @ %p\n",
ir, ir->var->name, ir->var);
abort();
}
return visit_continue;
}
ir_visitor_status ir_visitor_status
ir_validate::visit_enter(ir_function *ir) ir_validate::visit_enter(ir_function *ir)
{ {
@@ -126,9 +148,11 @@ ir_visitor_status
ir_validate::visit(ir_variable *ir) ir_validate::visit(ir_variable *ir)
{ {
/* An ir_variable is the one thing that can (and will) appear multiple times /* An ir_variable is the one thing that can (and will) appear multiple times
* in an IR tree. * in an IR tree. It is added to the hashtable so that it can be used
* in the ir_dereference_variable handler to ensure that a variable is
* declared before it is dereferenced.
*/ */
(void) ir; hash_table_insert(ht, ir, ir);
return visit_continue; return visit_continue;
} }