#!/usr/bin/env python

import argparse
import os
import re
import shlex
import subprocess
import sys


ROOT_DIR = os.path.dirname(os.path.abspath(__file__))
LLVM_TEST_DIR = os.path.join(ROOT_DIR, 'third_party', 'llvm', 'test', 'CodeGen',
                             'WebAssembly')
S_TEST_DIR = ROOT_DIR
LLVM_DIR = os.path.join(ROOT_DIR, 'third_party', 'llvm')
BIN_DIR = os.path.join(LLVM_DIR, 'build', 'bin')


def FindTestFiles(directory, ext):
    tests = []
    for root, dirs, files in os.walk(directory):
        for f in files:
            path = os.path.join(root, f)
            if os.path.splitext(f)[1] == ext:
                tests.append(path)
    tests.sort()
    return tests


def GetRunLine(test):
    run_line = ''
    with open(test) as test_file:
        for line in test_file.readlines():
            m = re.match(r'; RUN: (.*?)(\\?)$', line)
            if m:
                run_line += m.group(1)
                if not m.group(2):
                    break
    # Remove FileCheck
    run_line = re.sub(r'\|\s*FileCheck.*$', '', run_line)
    # Remove pipe input
    run_line = re.sub(r'<\s*%s', '', run_line)
    # Remove stderr > stdout redirect
    run_line = re.sub(r'2>&1', '', run_line)
    return run_line


def main(args):
    parser = argparse.ArgumentParser()
    options = parser.parse_args(args)

    tests = FindTestFiles(LLVM_TEST_DIR, '.ll')
    for ll_test in tests:
        name_noext = os.path.splitext(os.path.basename(ll_test))[0]

        BLACKLIST = ['inline-asm', # inline asm containing invalid syntax
                     'returned',   # external global symbol
                     'vtable',     # external global symbol
                     'offset-folding', # external global symbol
                     'address-offsets', # external global symbol
                     ]
        if name_noext in BLACKLIST:
          continue

        s = os.path.join(S_TEST_DIR, name_noext + '.s')
        run_line = GetRunLine(ll_test)
        cmd = shlex.split(run_line)
        cmd.extend([ll_test, '-o', s])
        # Don't run if the command isn't llc. Some are opt and they don't
        # generate .s files.
        if cmd[0] != 'llc':
            continue
        cmd[0] = os.path.join(BIN_DIR, cmd[0])
        subprocess.check_call(cmd)


if __name__ == '__main__':
    sys.exit(main(sys.argv[1:]))
