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

Reply via email to