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