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:
@@ -70,6 +70,7 @@ public:
|
|||||||
virtual ir_visitor_status visit_leave(ir_swizzle *ir);
|
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_assignment *ir);
|
||||||
|
virtual ir_visitor_status visit_enter(ir_call *ir);
|
||||||
|
|
||||||
static void validate_ir(ir_instruction *ir, void *data);
|
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);
|
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;
|
return visit_continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -494,6 +508,19 @@ ir_validate::visit_enter(ir_assignment *ir)
|
|||||||
return visit_continue;
|
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
|
void
|
||||||
ir_validate::validate_ir(ir_instruction *ir, void *data)
|
ir_validate::validate_ir(ir_instruction *ir, void *data)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user