glsl: Add several function / call related validations

The signature list in a function must contain only ir_function_signature nodes.

The target of an ir_call must be an ir_function_signature.

These were added while trying to debug Mesa bugzilla #34203.
This commit is contained in:
Ian Romanick 2011-03-07 15:13:06 -08:00
parent 2df56b002d
commit 8bbfbb14ee
1 changed files with 27 additions and 0 deletions

View File

@ -70,6 +70,7 @@ public:
virtual ir_visitor_status visit_leave(ir_swizzle *ir);
virtual ir_visitor_status visit_enter(ir_assignment *ir);
virtual ir_visitor_status visit_enter(ir_call *ir);
static void validate_ir(ir_instruction *ir, void *data);
@ -173,6 +174,19 @@ ir_validate::visit_enter(ir_function *ir)
this->validate_ir(ir, this->data);
/* Verify that all of the things stored in the list of signatures are,
* in fact, function signatures.
*/
foreach_list(node, &ir->signatures) {
ir_instruction *sig = (ir_instruction *) node;
if (sig->ir_type != ir_type_function_signature) {
printf("Non-signature in signature list of function `%s'\n",
ir->name);
abort();
}
}
return visit_continue;
}
@ -494,6 +508,19 @@ ir_validate::visit_enter(ir_assignment *ir)
return visit_continue;
}
ir_visitor_status
ir_validate::visit_enter(ir_call *ir)
{
ir_function_signature *const callee = ir->get_callee();
if (callee->ir_type != ir_type_function_signature) {
printf("IR called by ir_call is not ir_function_signature!\n");
abort();
}
return visit_continue;
}
void
ir_validate::validate_ir(ir_instruction *ir, void *data)
{