Compiler projects using llvm
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,
               global_vars_seen_dict, is_filtered):
  # Label format is based on iSel string.
  check_label_format = '{} %s-LABEL: %s%s%s'.format(comment_marker)
  return common.add_checks(output_lines, comment_marker, prefix_list, func_dict,
                           func_name, check_label_format, True, False,
                           global_vars_seen_dict, is_filtered=is_filtered)