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>[^:]+):[ \t]*\/\/[ \t]*@"?(?P=func)"?( (Function|Tail Call))?\n'
    r"(?:[ \t]+.cfi_startproc\n)?"  # drop optional cfi noise
    r"(?P<body>.*?)\n"
    # 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),
        "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,
    )
