contrib/ * check_passes.py: New. --- contrib/check_passes.py | 58 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 contrib/check_passes.py
diff --git a/contrib/check_passes.py b/contrib/check_passes.py new file mode 100755 index 0000000..34d18b7 --- /dev/null +++ b/contrib/check_passes.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python +# Script to verify passes.def and print statistics about it +# Requires Python 2.7+ (for collections.Counter) + +from collections import Counter +import re +import sys + +num_errors = 0 + +def validate(filename): + with open(filename) as f: + linenum = 1 + def error(msg): + print('%s:%i: %s' % (filename, linenum, msg)) + global num_errors + num_errors += 1 + singles = set() + count = Counter() + for line in f: + m = re.match(r'^\s+NEXT_PASS \((.+)\);$', line) + if m: + name = m.group(1) + if ',' in name: + error('malformed NEXT_PASS: %s' % name) + if name in count or name in singles: + error('duplicate pass: %s' % name) + singles.add(name) + m = re.match(r'^\s+NEXT_PASS_NUM \((.+), (.+)\);$', line) + if m: + name, num = m.group(1), int(m.group(2)) + count[name] += 1 + if count[name] != num: + error('bad index for %s' % name) + linenum += 1 + + for name in count: + if count[name] == 1: + error('only one instance of %s' % name) + + def line(): + print('-' * 72) + def heading(text): + line() + print(text) + line() + + heading('Single-instanced passes (%i)' % len(singles)) + for name in sorted(singles): + print(name) + + heading('Multi-instanced passes (%i)' % len(count)) + for name in sorted(count): + print('%s %i' % (name, count[name])) + +validate('../gcc/passes.def') +if num_errors > 0: + sys.exit(1) -- 1.7.11.7