blob: 2860dd4b90bcb5bce70654d7137485a929ceeb0f [file] [log] [blame]
#!/usr/bin/env python3
import re, sys
def fix_string(s):
TYPE = re.compile(
'\s*(i[0-9]+|float|double|x86_fp80|fp128|ppc_fp128|\[\[.*?\]\]|\[2 x \[\[[A-Z_0-9]+\]\]\]|<.*?>|{.*?}|\[[0-9]+ x .*?\]|%["a-z:A-Z0-9._]+({{.*?}})?|%{{.*?}}|{{.*?}}|\[\[.*?\]\])(\s*(\*|addrspace\(.*?\)|dereferenceable\(.*?\)|byval\(.*?\)|sret|zeroext|inreg|returned|signext|nocapture|align \d+|swiftself|swifterror|readonly|noalias|inalloca|nocapture))*\s*'
)
counter = 0
if "i32{{.*}}" in s:
counter = 1
at_pos = s.find("@")
if at_pos == -1:
at_pos = 0
annoying_pos = s.find("{{[^(]+}}")
if annoying_pos != -1:
at_pos = annoying_pos + 9
paren_pos = s.find("(", at_pos)
if paren_pos == -1:
return s
res = s[: paren_pos + 1]
s = s[paren_pos + 1 :]
m = TYPE.match(s)
while m:
res += m.group()
s = s[m.end() :]
if s.startswith(",") or s.startswith(")"):
res += f" %{counter}"
counter += 1
next_arg = s.find(",")
if next_arg == -1:
break
res += s[: next_arg + 1]
s = s[next_arg + 1 :]
m = TYPE.match(s)
return res + s
def process_file(contents):
PREFIX = re.compile(r"check-prefix(es)?(=|\s+)([a-zA-Z0-9,]+)")
check_prefixes = ["CHECK"]
result = ""
for line in contents.split("\n"):
if "FileCheck" in line:
m = PREFIX.search(line)
if m:
check_prefixes.extend(m.group(3).split(","))
found_check = False
for prefix in check_prefixes:
if prefix in line:
found_check = True
break
if not found_check or "define" not in line:
result += line + "\n"
continue
# We have a check for a function definition. Number the args.
line = fix_string(line)
result += line + "\n"
return result
def main():
print(f"Processing {sys.argv[1]}")
f = open(sys.argv[1])
content = f.read()
f.close()
content = process_file(content)
f = open(sys.argv[1], "w")
f.write(content)
f.close()
if __name__ == "__main__":
main()