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@pnwbakers.com>
Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
This commit is contained in:
Jason Ekstrand 2016-04-25 11:36:08 -07:00
parent b1dcedf393
commit 736ee0bef7

View file

@ -24,11 +24,13 @@
# Authors:
# Jason Ekstrand (jason@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,