| 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, |
| ) |