1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-18 18:42:46 +02:00
llvm-mirror/utils/update_test_prefix.py
Mircea Trofin 03a62f3073 [utils] Fix UpdateTestChecks case where 2 runs differ for last label
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
2020-12-15 07:16:54 -08:00

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)