[Mesa-dev] [PATCH 2/3] glsl: Add validations for ir_call.

Ian Romanick idr at freedesktop.org
Tue Aug 2 18:15:57 PDT 2011


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 08/02/2011 05:38 PM, Paul Berry wrote:
> 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();

We stopped making new uses of the iterators a long time ago.  As
implemented, they're a giant pile of fail.  For what you're trying to do
here, just use node->next and node->is_tail_sentinel().  Note that
is_tail_sentinel tells you if you're at the first "node" *past* the end
of the list.

> +   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
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org/

iEYEARECAAYFAk44oUwACgkQX1gOwKyEAw/o0gCggVpcUJ69HnlMKo2XScpNNd7Z
IHcAn0aA476Sras2dJYHBq08mLc+H/ql
=voyu
-----END PGP SIGNATURE-----


More information about the mesa-dev mailing list