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

2011-08-02 Thread Paul Berry
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


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

2011-08-02 Thread Ian Romanick
-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-
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev