llvm/llvm/utils/UpdateTestChecks/isel.py

import re
from . import common
import sys

if sys.version_info[0] > 2:

    class string:
        expandtabs = str.expandtabs

else:
    import string

# Support of isel debug checks
# RegEx: this is where the magic happens.

##### iSel parser

# TODO: add function prefix
ISEL_FUNCTION_DEFAULT_RE = re.compile(
    r"Selected[\s]*selection[\s]*DAG:[\s]*%bb.0[\s]*\'(?P<func>.*?):[^\']*\'*\n"
    r"(?P<body>.*?)\n"
    r"Total[\s]*amount[\s]*of[\s]*phi[\s]*nodes[\s]*to[\s]*update:[\s]*[0-9]+",
    flags=(re.M | re.S),
)


def scrub_isel_default(isel, args):
    # Scrub runs of whitespace out of the iSel debug output, but leave the leading
    # whitespace in place.
    isel = common.SCRUB_WHITESPACE_RE.sub(r" ", isel)
    # Expand the tabs used for indentation.
    isel = string.expandtabs(isel, 2)
    # Strip trailing whitespace.
    isel = common.SCRUB_TRAILING_WHITESPACE_RE.sub(r"", isel)
    return isel


def get_run_handler(triple):
    target_handlers = {}
    handler = None
    best_prefix = ""
    for prefix, s in target_handlers.items():
        if triple.startswith(prefix) and len(prefix) > len(best_prefix):
            handler = s
            best_prefix = prefix

    if handler is None:
        common.debug("Using default handler.")
        handler = (scrub_isel_default, ISEL_FUNCTION_DEFAULT_RE)

    return handler


##### Generator of iSel CHECK lines


def add_checks(
    output_lines,
    comment_marker,
    prefix_list,
    func_dict,
    func_name,
    ginfo: common.GeneralizerInfo,
    global_vars_seen_dict,
    is_filtered,
):
    # Label format is based on iSel string.
    check_label_format = "{} %s-LABEL: %s%s%s%s".format(comment_marker)
    return common.add_checks(
        output_lines,
        comment_marker,
        prefix_list,
        func_dict,
        func_name,
        check_label_format,
        ginfo,
        global_vars_seen_dict,
        is_filtered=is_filtered,
    )