#!/usr/bin/env python3 import os import re import sys from concurrent.futures import ThreadPoolExecutor, as_completed def remove_prefix(i, d=0): if d == 100: return 2 s = os.popen('llvm-lit -a ' + i).read() r = re.search('no check strings found with (?:prefix|prefixes) \'([^:]+)', s) with open(i, 'r+') as f: s = f.read() if r: p = r.group(1) s = re.sub('=' + p + ',', '=', s) s = re.sub(',' + p + '([, \n])', '\\1', s) s = re.sub('\s+-?-check-prefix=' + p + '([ \n])', '\\1', s) else: s = re.sub('-?-check-prefixes=([\w-]+)(\Z|[ \t\n])', '--check-prefix=\\1\\2', s) t = re.search('-?-check-(?:prefix|prefixes)=([^ ]+)\s+-?-check-(?:prefix|prefixes)=([^ ]+)', s) while t: s = re.sub(t.group(), '--check-prefixes=' + t.group(1) + ',' + t.group(2), s) t = re.search('-?-check-(?:prefix|prefixes)=([^ ]+)\s+-?-check-(?:prefix|prefixes)=([^ ]+)', s) s = re.sub('\s+-?-check-prefix=CHECK[ \t]*\n', '\n', s) f.truncate(0) f.seek(0) f.write(s) if not r: t = re.search('Assertions have been autogenerated by (.*)', s) if t: s = os.popen('llvm/' + t.group(1) + ' ' + i + ' 2>&1').read() if 'Found conflicting' in s: return -1 s = os.popen('git diff ' + i).read() if re.search('\n(?:-+)\n', s) or re.search('\n[+-].*(?<!RUN):', s): return 1 return 0 return remove_prefix(i, d+1) with ThreadPoolExecutor(max_workers=32) as e: f = [] c = [] a = [] t = { e.submit(remove_prefix, i): i for i in sys.argv[1:] } for i in as_completed(t): if i.result() == 0: print('DONE:', end=' ') elif i.result() == -1: print('FAIL:', end=' ') f.append(t[i]) elif i.result() == 1: print('CHANGE:', end=' ') c.append(t[i]) else: print('ABORT:', end=' ') a.append(t[i]) print(t[i]) for i in [ (f, 'Failed'), (c, 'Changed'), (a, 'Aborted') ]: if i[0]: print('********************\n%s Tests (%d):' % (i[1], len(i[0]))) for j in i[0]: print(' ' + j)