llvm/llvm/utils/add_argument_names.py

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