Mesa (master): nir/algebraic: Do better error reporting of bad expressions

Jason Ekstrand jekstrand at kemper.freedesktop.org
Wed Apr 27 18:21:11 UTC 2016


Module: Mesa
Branch: master
Commit: 736ee0bef7ec71370185395aeba443e12b6d3813
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=736ee0bef7ec71370185395aeba443e12b6d3813

Author: Jason Ekstrand <jason.ekstrand at intel.com>
Date:   Mon Apr 25 11:36:08 2016 -0700

nir/algebraic: Do better error reporting of bad expressions

Previously, if an exception was encountered anywhere, nir_algebraic would
just die in a fire with no indication whatsoever as to where the actual bug
is.  This commit makes it print out the particular search-and-replace
expression that is causing problems along with the exception.  Also, it
will now report all of the errors it finds and then exit at the end like a
standard C compiler would do.

Reviewed-by: Dylan Baker <dylan at pnwbakers.com>
Reviewed-by: Iago Toral Quiroga <itoral at igalia.com>

---

 src/compiler/nir/nir_algebraic.py | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/src/compiler/nir/nir_algebraic.py b/src/compiler/nir/nir_algebraic.py
index 7697171..921d32b 100644
--- a/src/compiler/nir/nir_algebraic.py
+++ b/src/compiler/nir/nir_algebraic.py
@@ -24,11 +24,13 @@
 # Authors:
 #    Jason Ekstrand (jason at jlekstrand.net)
 
+from __future__ import print_function
 import itertools
 import struct
 import sys
 import mako.template
 import re
+import traceback
 
 # Represents a set of variables, each with a unique id
 class VarSet(object):
@@ -311,15 +313,28 @@ class AlgebraicPass(object):
       self.xform_dict = {}
       self.pass_name = pass_name
 
+      error = False
+
       for xform in transforms:
          if not isinstance(xform, SearchAndReplace):
-            xform = SearchAndReplace(xform)
+            try:
+               xform = SearchAndReplace(xform)
+            except:
+               print("Failed to parse transformation:", file=sys.stderr)
+               print("  " + str(xform), file=sys.stderr)
+               traceback.print_exc(file=sys.stderr)
+               print('', file=sys.stderr)
+               error = True
+               continue
 
          if xform.search.opcode not in self.xform_dict:
             self.xform_dict[xform.search.opcode] = []
 
          self.xform_dict[xform.search.opcode].append(xform)
 
+      if error:
+         sys.exit(1)
+
    def render(self):
       return _algebraic_pass_template.render(pass_name=self.pass_name,
                                              xform_dict=self.xform_dict,




More information about the mesa-commit mailing list