glsl: Add validations for ir_call.

This patch extends ir_validate.cpp to check the following
characteristics of each ir_call:

- The number of actual parameters must match the number of formal
  parameters in the signature.

- The type of each actual parameter must match the type of the
  corresponding formal parameter in the signature.

- Each "out" or "inout" actual parameter must be an lvalue.

Reviewed-by: Chad Versace <chad@chad-versace.us>
This commit is contained in:
Paul Berry 2011-08-02 15:44:39 -07:00
parent a52b53b56e
commit 303e05cc24
1 changed files with 36 additions and 0 deletions

View File

@ -541,7 +541,43 @@ ir_validate::visit_enter(ir_call *ir)
abort();
}
const exec_node *formal_param_node = callee->parameters.head;
const exec_node *actual_param_node = ir->actual_parameters.head;
while (true) {
if (formal_param_node->is_tail_sentinel()
!= actual_param_node->is_tail_sentinel()) {
printf("ir_call has the wrong number of parameters:\n");
goto dump_ir;
}
if (formal_param_node->is_tail_sentinel()) {
break;
}
const ir_variable *formal_param
= (const ir_variable *) formal_param_node;
const ir_rvalue *actual_param
= (const ir_rvalue *) actual_param_node;
if (formal_param->type != actual_param->type) {
printf("ir_call parameter type mismatch:\n");
goto dump_ir;
}
if (formal_param->mode == ir_var_out
|| formal_param->mode == ir_var_inout) {
if (!actual_param->is_lvalue()) {
printf("ir_call out/inout parameters must be lvalues:\n");
goto dump_ir;
}
}
formal_param_node = formal_param_node->next;
actual_param_node = actual_param_node->next;
}
return visit_continue;
dump_ir:
ir->print();
printf("callee:\n");
callee->print();
abort();
}
void