from __future__ import print_function
import re
import sys

from . import common

if sys.version_info[0] > 2:

    class string:
        expandtabs = str.expandtabs

else:
    import string

# RegEx: this is where the magic happens.

##### Assembly parser
#
# The set of per-arch regular expressions define several groups.
# The required groups are "func" (function name) and "body" (body of the function).
# Although some backends require some additional groups like: "directives"
# and "func_name_separator"

ASM_FUNCTION_X86_RE = re.compile(
    r'^_?(?P<func>[^:]+):[ \t]*#+[ \t]*(@"?(?P=func)"?| -- Begin function (?P=func))\n(?:\s*\.?Lfunc_begin[^:\n]*:\n)?'
    r"(?:\.L(?P=func)\$local:\n)?"  # drop .L<func>$local:
    r"(?:\s*\.type\s+\.L(?P=func)\$local,@function\n)?"  # drop .type .L<func>$local
    r"(?:[ \t]*(?:\.cfi_startproc|\.cfi_personality|\.cfi_lsda|\.seh_proc|\.seh_handler)\b[^\n]*\n)*"  # drop optional cfi
    r"(?P<body>^##?[ \t]+[^:]+:.*?)\s*"
    r"^\s*(?:[^:\n]+?:\s*\n\s*\.size|\.cfi_endproc|\.globl|\.comm|\.(?:sub)?section|#+ -- End function)",
    flags=(re.M | re.S),
)

ASM_FUNCTION_ARM_RE = re.compile(
    r'^(?P<func>[0-9a-zA-Z_$]+):[ \t]*(@+[ \t]*@"?(?P=func)"?)?\n'  # f: (name of function)
    r"(?:\.L(?P=func)\$local:\n)?"  # drop .L<func>$local:
    r"(?:\s*\.type\s+\.L(?P=func)\$local,@function\n)?"  # drop .type .L<func>$local
    r"\s+\.fnstart\n"  # .fnstart
    r"(?P<body>.*?)"  # (body of the function)
    r"^.Lfunc_end[0-9]+:",  # .Lfunc_end0: or # -- End function
    flags=(re.M | re.S),
)

ASM_FUNCTION_AARCH64_RE = re.compile(
    r'^(?P<func>_?[a-zA-Z][^:]*):[ \t]*(\/\/[ \t]*@"?(?P=func)"?)?( (Function|Tail Call))?\n'
    r"(?:[ \t]+.cfi_startproc\n)?"  # drop optional cfi noise
    r"(?P<body>.*?)"
    # This list is incomplete
    r"^\s*(\.Lfunc_end[0-9]+:|// -- End function)",
    flags=(re.M | re.S),
)

ASM_FUNCTION_AMDGPU_RE = re.compile(
    r"\.type\s+_?(?P<func>[^,\n]+),@function\n"
    r"(^\s*\.amdgpu_hsa_kernel (?P=func)\n)?"
    r'^_?(?P=func):(?:[ \t]*;+[ \t]*@"?(?P=func)"?)?\n'
    r"(?P<body>.*?)\n"  # (body of the function)
    # This list is incomplete
    r"^\s*(\.Lfunc_end[0-9]+:\n|\.section)",
    flags=(re.M | re.S),
)

ASM_FUNCTION_BPF_RE = re.compile(
    r'^_?(?P<func>[^:]+):[ \t]*#+[ \t]*@"?(?P=func)"?\n'
    r"(?:[ \t]+.cfi_startproc\n|.seh_proc[^\n]+\n)?"  # drop optional cfi
    r"(?P<body>.*?)\s*"
    r".Lfunc_end[0-9]+:\n",
    flags=(re.M | re.S),
)

ASM_FUNCTION_HEXAGON_RE = re.compile(
    r'^_?(?P<func>[^:]+):[ \t]*//[ \t]*@"?(?P=func)"?\n[^:]*?'
    r"(?P<body>.*?)\n"  # (body of the function)
    # This list is incomplete
    r".Lfunc_end[0-9]+:\n",
    flags=(re.M | re.S),
)

ASM_FUNCTION_M68K_RE = re.compile(
    r'^_?(?P<func>[^:]+):[ \t]*;[ \t]*@"?(?P=func)"?\n'
    r'(?:\.L(?P=func)\$local:\n)?'  # drop .L<func>$local:
    r'(?:[ \t]+\.type[ \t]+\.L(?P=func)\$local,@function\n)?' # drop .type .L<func>$local,@function
    r'(?P<body>.*?)\s*' # (body of the function)
    r'.Lfunc_end[0-9]+:\n',
    flags=(re.M | re.S))

ASM_FUNCTION_MIPS_RE = re.compile(
    r'^_?(?P<func>[^:]+):[ \t]*#+[ \t]*@"?(?P=func)"?\n[^:]*?'  # f: (name of func)
    r"(?:\s*\.?Ltmp[^:\n]*:\n)?[^:]*?"  # optional .Ltmp<N> for EH
    r"(?:^[ \t]+\.(frame|f?mask|set).*?\n)+"  # Mips+LLVM standard asm prologue
    r"(?P<body>.*?)\n"  # (body of the function)
    # Mips+LLVM standard asm epilogue
    r"(?:(^[ \t]+\.set[^\n]*?\n)*^[ \t]+\.end.*?\n)"
    r"(\$|\.L)func_end[0-9]+:\n",  # $func_end0: (mips32 - O32) or
    # .Lfunc_end0: (mips64 - NewABI)
    flags=(re.M | re.S),
)

ASM_FUNCTION_MSP430_RE = re.compile(
    r'^_?(?P<func>[^:]+):[ \t]*;+[ \t]*@"?(?P=func)"?\n[^:]*?'
    r"(?P<body>.*?)\n"
    r"(\$|\.L)func_end[0-9]+:\n",  # $func_end0:
    flags=(re.M | re.S),
)

ASM_FUNCTION_AVR_RE = re.compile(
    r'^_?(?P<func>[^:]+):[ \t]*;+[ \t]*@"?(?P=func)"?\n[^:]*?'
    r"(?P<body>.*?)\n"
    r".Lfunc_end[0-9]+:\n",
    flags=(re.M | re.S),
)

ASM_FUNCTION_PPC_RE = re.compile(
    r"#[ \-\t]*Begin function (?P<func>[^.:]+)\n"
    r".*?"
    r'^[_.]?(?P=func):(?:[ \t]*#+[ \t]*@"?(?P=func)"?)?\n'
    r"(?:^[^#]*\n)*"
    r"(?P<body>.*?)\n"
    # This list is incomplete
    r"(?:^[ \t]*(?:\.(?:long|quad|v?byte)[ \t]+[^\n]+)\n)*"
    r"(?:\.Lfunc_end|L\.\.(?P=func))[0-9]+:\n",
    flags=(re.M | re.S),
)

ASM_FUNCTION_RISCV_RE = re.compile(
    r'^_?(?P<func>[^:]+):[ \t]*#+[ \t]*@"?(?P=func)"?\n'
    r"(?:\s*\.?L(?P=func)\$local:\n)?"  # optional .L<func>$local: due to -fno-semantic-interposition
    r"(?:\s*\.type\s+\.?L(?P=func)\$local,@function\n)?"  # optional .type .L<func>$local
    r"(?:\s*\.?Lfunc_begin[^:\n]*:\n)?[^:]*?"
    r"(?P<body>^##?[ \t]+[^:]+:.*?)\s*"
    r".Lfunc_end[0-9]+:\n",
    flags=(re.M | re.S),
)

ASM_FUNCTION_LANAI_RE = re.compile(
    r'^_?(?P<func>[^:]+):[ \t]*!+[ \t]*@"?(?P=func)"?\n'
    r"(?:[ \t]+.cfi_startproc\n)?"  # drop optional cfi noise
    r"(?P<body>.*?)\s*"
    r".Lfunc_end[0-9]+:\n",
    flags=(re.M | re.S),
)

ASM_FUNCTION_SPARC_RE = re.compile(
    r'^_?(?P<func>[^:]+):[ \t]*!+[ \t]*@"?(?P=func)"?\n'
    r"(?P<body>.*?)\s*"
    r".Lfunc_end[0-9]+:\n",
    flags=(re.M | re.S),
)

ASM_FUNCTION_SYSTEMZ_RE = re.compile(
    r'^_?(?P<func>[^:]+):[ \t]*#+[ \t]*@"?(?P=func)"?\n'
    r"(?:[ \t]+.cfi_startproc\n)?"
    r"(?P<body>.*?)\n"
    r".Lfunc_end[0-9]+:\n",
    flags=(re.M | re.S),
)

ASM_FUNCTION_AARCH64_DARWIN_RE = re.compile(
    r'^_(?P<func>[^:]+):[ \t]*;[ \t]@"?(?P=func)"?\n'
    r"([ \t]*.cfi_startproc\n[\s]*)?"
    r"(?P<body>.*?)"
    r"([ \t]*.cfi_endproc\n[\s]*)?"
    r"^[ \t]*;[ \t]--[ \t]End[ \t]function",
    flags=(re.M | re.S),
)

ASM_FUNCTION_ARM_DARWIN_RE = re.compile(
    r"^[ \t]*\.globl[ \t]*_(?P<func>[^ \t]+)[ \t]*\@[ \t]*--[ \t]Begin[ \t]function[ \t](?P=func)\n"
    r"(?P<directives>.*?)"
    r"^_(?P=func):.*?\n"
    r"(?P<body>.*?)(?=^[ \t]*@[ \t]--[ \t]End[ \t]function)",
    flags=(re.M | re.S),
)

ASM_FUNCTION_ARM_MACHO_RE = re.compile(
    r'^_(?P<func>[^:]+):[ \t]*(@[ \t]@"?(?P=func)"?)?\n'
    r"([ \t]*.cfi_startproc\n[ \t]*)?"
    r"(?P<body>.*?)\n"
    r"[ \t]*\.cfi_endproc\n",
    flags=(re.M | re.S),
)

ASM_FUNCTION_THUMBS_DARWIN_RE = re.compile(
    r'^_(?P<func>[^:]+):[ \t]*(@[ \t]@"?(?P=func)"?)?\n'
    r"(?P<body>.*?)\n"
    r"[ \t]*\.data_region\n",
    flags=(re.M | re.S),
)

ASM_FUNCTION_THUMB_DARWIN_RE = re.compile(
    r'^_(?P<func>[^:]+):[ \t]*(@[ \t]@"?(?P=func)"?)?\n'
    r"(?P<body>.*?)\n"
    r"^[ \t]*@[ \t]--[ \t]End[ \t]function",
    flags=(re.M | re.S),
)

ASM_FUNCTION_ARM_IOS_RE = re.compile(
    r'^_(?P<func>[^:]+):[ \t]*(@[ \t]@"?(?P=func)"?)?\n'
    r"(?P<body>.*?)"
    r"^[ \t]*@[ \t]--[ \t]End[ \t]function",
    flags=(re.M | re.S),
)

ASM_FUNCTION_WASM_RE = re.compile(
    r'^_?(?P<func>[^:]+):[ \t]*#+[ \t]*@"?(?P=func)"?\n'
    r"(?P<body>.*?)\n"
    r"^\s*(\.Lfunc_end[0-9]+:\n|end_function)",
    flags=(re.M | re.S),
)

# We parse the function name from OpName, and grab the variable name 'var'
# for this function. Then we match that when the variable is assigned with
# OpFunction and match its body.
ASM_FUNCTION_SPIRV_RE = re.compile(
    r'OpName (?P<var>%[0-9]+) "(?P<func>[^"]+)(?P<func_name_separator>)".*(?P<body>(?P=var) = OpFunction.+?OpFunctionEnd)',
    flags=(re.M | re.S),
)

ASM_FUNCTION_VE_RE = re.compile(
    r"^_?(?P<func>[^:]+):[ \t]*#+[ \t]*@(?P=func)\n"
    r"(?:\s*\.?L(?P=func)\$local:\n)?"  # optional .L<func>$local: due to -fno-semantic-interposition
    r"(?:\s*\.type\s+\.?L(?P=func)\$local,@function\n)?"  # optional .type .L<func>$local
    r"(?:\s*\.?Lfunc_begin[^:\n]*:\n)?[^:]*?"
    r"(?P<body>^##?[ \t]+[^:]+:.*?)\s*"
    r".Lfunc_end[0-9]+:\n",
    flags=(re.M | re.S),
)

ASM_FUNCTION_XTENSA_RE = re.compile(
    r"^(?P<func>[^:]+): +# @(?P=func)\n(?P<body>.*?)\n\.Lfunc_end\d+:\n",
    flags=(re.M | re.S),
)

ASM_FUNCTION_CSKY_RE = re.compile(
    r"^_?(?P<func>[^:]+):[ \t]*#+[ \t]*@(?P=func)\n(?:\s*\.?Lfunc_begin[^:\n]*:\n)?[^:]*?"
    r"(?P<body>^##?[ \t]+[^:]+:.*?)\s*"
    r".Lfunc_end[0-9]+:\n",
    flags=(re.M | re.S),
)

ASM_FUNCTION_NVPTX_RE = re.compile(
    # function attributes and retval
    # .visible .func (.param .align 16 .b8 func_retval0[32])
    # r'^(\.visible\s+)?\.func\s+(\([^\)]*\)\s*)?'
    r"^(\.(func|visible|weak|entry|noreturn|extern)\s+)+(\([^\)]*\)\s*)?"
    # function name
    r"(?P<func>[^\(\n]+)"
    # function name separator (opening brace)
    r"(?P<func_name_separator>\()"
    # function parameters
    # (
    #   .param .align 16 .b8 callee_St8x4_param_0[32]
    # ) // -- Begin function callee_St8x4
    r"[^\)]*\)(\s*//[^\n]*)?\n"
    # function body
    r"(?P<body>.*?)\n"
    # function body end marker
    r"\s*// -- End function",
    flags=(re.M | re.S),
)

ASM_FUNCTION_LOONGARCH_RE = re.compile(
    r'^_?(?P<func>[^:]+):[ \t]*#+[ \t]*@"?(?P=func)"?\n'
    r"(?:\s*\.?Lfunc_begin[^:\n]*:\n)?[^:]*?"
    r"(?P<body>^##?[ \t]+[^:]+:.*?)\s*"
    r".Lfunc_end[0-9]+:\n",
    flags=(re.M | re.S),
)

SCRUB_X86_SHUFFLES_RE = re.compile(
    r"^(\s*\w+) [^#\n]+#+ ((?:[xyz]mm\d+|mem)( \{%k\d+\}( \{z\})?)? = .*)$", flags=re.M
)

SCRUB_X86_SHUFFLES_NO_MEM_RE = re.compile(
    r"^(\s*\w+) [^#\n]+#+ ((?:[xyz]mm\d+|mem)( \{%k\d+\}( \{z\})?)? = (?!.*(?:mem)).*)$",
    flags=re.M,
)

SCRUB_X86_SPILL_RELOAD_RE = re.compile(
    r"-?\d+\(%([er])[sb]p\)(.*(?:Spill|Reload))$", flags=re.M
)
SCRUB_X86_SP_RE = re.compile(r"\d+\(%(esp|rsp)\)")
SCRUB_X86_RIP_RE = re.compile(r"[.\w]+\(%rip\)")
SCRUB_X86_LCP_RE = re.compile(r"\.?LCPI[0-9]+_[0-9]+")
SCRUB_X86_RET_RE = re.compile(r"ret[l|q]")


def scrub_asm_x86(asm, args):
    # Scrub runs of whitespace out of the assembly, but leave the leading
    # whitespace in place.
    asm = common.SCRUB_WHITESPACE_RE.sub(r" ", asm)
    # Expand the tabs used for indentation.
    asm = string.expandtabs(asm, 2)

    # Detect shuffle asm comments and hide the operands in favor of the comments.
    if getattr(args, "no_x86_scrub_mem_shuffle", True):
        asm = SCRUB_X86_SHUFFLES_NO_MEM_RE.sub(r"\1 {{.*#+}} \2", asm)
    else:
        asm = SCRUB_X86_SHUFFLES_RE.sub(r"\1 {{.*#+}} \2", asm)

    # Detect stack spills and reloads and hide their exact offset and whether
    # they used the stack pointer or frame pointer.
    asm = SCRUB_X86_SPILL_RELOAD_RE.sub(r"{{[-0-9]+}}(%\1{{[sb]}}p)\2", asm)
    if getattr(args, "x86_scrub_sp", True):
        # Generically match the stack offset of a memory operand.
        asm = SCRUB_X86_SP_RE.sub(r"{{[0-9]+}}(%\1)", asm)
    if getattr(args, "x86_scrub_rip", False):
        # Generically match a RIP-relative memory operand.
        asm = SCRUB_X86_RIP_RE.sub(r"{{.*}}(%rip)", asm)
    # Generically match a LCP symbol.
    asm = SCRUB_X86_LCP_RE.sub(r"{{\.?LCPI[0-9]+_[0-9]+}}", asm)
    if getattr(args, "extra_scrub", False):
        # Avoid generating different checks for 32- and 64-bit because of 'retl' vs 'retq'.
        asm = SCRUB_X86_RET_RE.sub(r"ret{{[l|q]}}", asm)
    # Strip kill operands inserted into the asm.
    asm = common.SCRUB_KILL_COMMENT_RE.sub("", asm)
    # Strip trailing whitespace.
    asm = common.SCRUB_TRAILING_WHITESPACE_RE.sub(r"", asm)
    return asm


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


def scrub_asm_arm_eabi(asm, args):
    # Scrub runs of whitespace out of the assembly, but leave the leading
    # whitespace in place.
    asm = common.SCRUB_WHITESPACE_RE.sub(r" ", asm)
    # Expand the tabs used for indentation.
    asm = string.expandtabs(asm, 2)
    # Strip kill operands inserted into the asm.
    asm = common.SCRUB_KILL_COMMENT_RE.sub("", asm)
    # Strip trailing whitespace.
    asm = common.SCRUB_TRAILING_WHITESPACE_RE.sub(r"", asm)
    return asm


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


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


def scrub_asm_powerpc(asm, args):
    # Scrub runs of whitespace out of the assembly, but leave the leading
    # whitespace in place.
    asm = common.SCRUB_WHITESPACE_RE.sub(r" ", asm)
    # Expand the tabs used for indentation.
    asm = string.expandtabs(asm, 2)
    # Strip unimportant comments, but leave the token '#' in place.
    asm = common.SCRUB_LOOP_COMMENT_RE.sub(r"#", asm)
    # Strip trailing whitespace.
    asm = common.SCRUB_TRAILING_WHITESPACE_RE.sub(r"", asm)
    # Strip the tailing token '#', except the line only has token '#'.
    asm = common.SCRUB_TAILING_COMMENT_TOKEN_RE.sub(r"", asm)
    return asm


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


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


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


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


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


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


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


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


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


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


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


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


def scrub_asm_csky(asm, args):
    # Scrub runs of whitespace out of the assembly, but leave the leading
    # whitespace in place.
    asm = common.SCRUB_WHITESPACE_RE.sub(r" ", asm)
    # Expand the tabs used for indentation.
    asm = string.expandtabs(asm, 2)
    # Strip kill operands inserted into the asm.
    asm = common.SCRUB_KILL_COMMENT_RE.sub("", asm)
    # Strip trailing whitespace.
    asm = common.SCRUB_TRAILING_WHITESPACE_RE.sub(r"", asm)
    return asm


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


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


# Returns a tuple of a scrub function and a function regex. Scrub function is
# used to alter function body in some way, for example, remove trailing spaces.
# Function regex is used to match function name, body, etc. in raw llc output.
def get_run_handler(triple):
    target_handlers = {
        "i686": (scrub_asm_x86, ASM_FUNCTION_X86_RE),
        "x86": (scrub_asm_x86, ASM_FUNCTION_X86_RE),
        "i386": (scrub_asm_x86, ASM_FUNCTION_X86_RE),
        "arm64_32": (scrub_asm_arm_eabi, ASM_FUNCTION_AARCH64_DARWIN_RE),
        "aarch64": (scrub_asm_arm_eabi, ASM_FUNCTION_AARCH64_RE),
        "aarch64-apple-darwin": (scrub_asm_arm_eabi, ASM_FUNCTION_AARCH64_DARWIN_RE),
        "aarch64-apple-ios": (scrub_asm_arm_eabi, ASM_FUNCTION_AARCH64_DARWIN_RE),
        "aarch64-apple-macosx": (scrub_asm_arm_eabi, ASM_FUNCTION_AARCH64_DARWIN_RE),
        "bpf": (scrub_asm_bpf, ASM_FUNCTION_BPF_RE),
        "bpfel": (scrub_asm_bpf, ASM_FUNCTION_BPF_RE),
        "bpfeb": (scrub_asm_bpf, ASM_FUNCTION_BPF_RE),
        "hexagon": (scrub_asm_hexagon, ASM_FUNCTION_HEXAGON_RE),
        "r600": (scrub_asm_amdgpu, ASM_FUNCTION_AMDGPU_RE),
        "amdgcn": (scrub_asm_amdgpu, ASM_FUNCTION_AMDGPU_RE),
        "arm": (scrub_asm_arm_eabi, ASM_FUNCTION_ARM_RE),
        "arm64": (scrub_asm_arm_eabi, ASM_FUNCTION_AARCH64_RE),
        "arm64e": (scrub_asm_arm_eabi, ASM_FUNCTION_AARCH64_DARWIN_RE),
        "arm64ec": (scrub_asm_arm_eabi, ASM_FUNCTION_AARCH64_RE),
        "arm64-apple-ios": (scrub_asm_arm_eabi, ASM_FUNCTION_AARCH64_DARWIN_RE),
        "arm64-apple-macosx": (scrub_asm_arm_eabi, ASM_FUNCTION_AARCH64_DARWIN_RE),
        "armv7-apple-ios": (scrub_asm_arm_eabi, ASM_FUNCTION_ARM_IOS_RE),
        "armv7-apple-darwin": (scrub_asm_arm_eabi, ASM_FUNCTION_ARM_DARWIN_RE),
        "armv7k-apple-watchos": (scrub_asm_arm_eabi, ASM_FUNCTION_ARM_DARWIN_RE),
        "thumb": (scrub_asm_arm_eabi, ASM_FUNCTION_ARM_RE),
        "thumb-macho": (scrub_asm_arm_eabi, ASM_FUNCTION_ARM_MACHO_RE),
        "thumbv5-macho": (scrub_asm_arm_eabi, ASM_FUNCTION_ARM_MACHO_RE),
        "thumbv7s-apple-darwin": (scrub_asm_arm_eabi, ASM_FUNCTION_THUMBS_DARWIN_RE),
        "thumbv7-apple-darwin": (scrub_asm_arm_eabi, ASM_FUNCTION_THUMB_DARWIN_RE),
        "thumbv7-apple-ios": (scrub_asm_arm_eabi, ASM_FUNCTION_ARM_IOS_RE),
        "m68k": (scrub_asm_m68k, ASM_FUNCTION_M68K_RE),
        "mips": (scrub_asm_mips, ASM_FUNCTION_MIPS_RE),
        "msp430": (scrub_asm_msp430, ASM_FUNCTION_MSP430_RE),
        "avr": (scrub_asm_avr, ASM_FUNCTION_AVR_RE),
        "ppc32": (scrub_asm_powerpc, ASM_FUNCTION_PPC_RE),
        "ppc64": (scrub_asm_powerpc, ASM_FUNCTION_PPC_RE),
        "powerpc": (scrub_asm_powerpc, ASM_FUNCTION_PPC_RE),
        "riscv32": (scrub_asm_riscv, ASM_FUNCTION_RISCV_RE),
        "riscv64": (scrub_asm_riscv, ASM_FUNCTION_RISCV_RE),
        "lanai": (scrub_asm_lanai, ASM_FUNCTION_LANAI_RE),
        "sparc": (scrub_asm_sparc, ASM_FUNCTION_SPARC_RE),
        "spirv": (scrub_asm_spirv, ASM_FUNCTION_SPIRV_RE),
        "spirv32": (scrub_asm_spirv, ASM_FUNCTION_SPIRV_RE),
        "spirv64": (scrub_asm_spirv, ASM_FUNCTION_SPIRV_RE),
        "s390x": (scrub_asm_systemz, ASM_FUNCTION_SYSTEMZ_RE),
        "wasm32": (scrub_asm_wasm, ASM_FUNCTION_WASM_RE),
        "wasm64": (scrub_asm_wasm, ASM_FUNCTION_WASM_RE),
        "ve": (scrub_asm_ve, ASM_FUNCTION_VE_RE),
        "xtensa": (scrub_asm_xtensa, ASM_FUNCTION_XTENSA_RE),
        "csky": (scrub_asm_csky, ASM_FUNCTION_CSKY_RE),
        "nvptx": (scrub_asm_nvptx, ASM_FUNCTION_NVPTX_RE),
        "loongarch32": (scrub_asm_loongarch, ASM_FUNCTION_LOONGARCH_RE),
        "loongarch64": (scrub_asm_loongarch, ASM_FUNCTION_LOONGARCH_RE),
    }
    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:
        raise KeyError("Triple %r is not supported" % (triple))

    return handler


##### Generator of assembly 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 ASM 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,
    )
