| #!/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 'had conflicting output from different RUN lines for all functions' 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) |