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. --- src/glsl/ir_validate.cpp | 35 +++++++++++++++++++++++++++++++++++ 1 files changed, 35 insertions(+), 0 deletions(-) diff --git a/src/glsl/ir_validate.cpp b/src/glsl/ir_validate.cpp index f3fceb2..72e4faf 100644 --- a/src/glsl/ir_validate.cpp +++ b/src/glsl/ir_validate.cpp @@ -541,7 +541,42 @@ ir_validate::visit_enter(ir_call *ir) abort(); } + exec_list_iterator formal_param_iter = callee->parameters.iterator(); + exec_list_iterator actual_param_iter = ir->actual_parameters.iterator(); + while (true) { + if (formal_param_iter.has_next() != actual_param_iter.has_next()) { + printf("ir_call has the wrong number of parameters:\n"); + goto dump_ir; + } + if (!formal_param_iter.has_next()) { + break; + } + const ir_variable *formal_param + = (const ir_variable *) formal_param_iter.get(); + const ir_rvalue *actual_param + = (const ir_rvalue *) actual_param_iter.get(); + 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_iter.next(); + actual_param_iter.next(); + } + return visit_continue; + +dump_ir: + ir->print(); + printf("callee:\n"); + callee->print(); + abort(); } void -- 1.7.6 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev