| #!/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) |