mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 12:12:47 +01:00
03a62f3073
Two RUN lines produce outputs that, each, have some common parts and some different parts. The common parts are checked under label A. The differing parts are associated to a function and checked under labels B and C, respectivelly. When build_function_body_dictionary is called for the first RUN line, it will attribute the function body to labels A and C. When the second RUN is passed to build_function_body_dictionary, it sees that the function body under A is different from what it has. If in this second RUN line, A were at the end of the prefixes list, A's body is still kept associated with the first run's function. When we output the function body (i.e. add_checks), we stop after emitting for the first prefix matching that function. So we end up with the wrong function body (first RUN's A-association). There is no reason to special-case the last label in the prefixes list, and the fix is to always clear a label association if we find a RUN line where the body is different. Differential Revision: https://reviews.llvm.org/D93078
65 lines
2.3 KiB
Python
Executable File
65 lines
2.3 KiB
Python
Executable File
#!/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)
|