| Index: crosstest/crosstest.py
|
| diff --git a/crosstest/crosstest.py b/crosstest/crosstest.py
|
| deleted file mode 100755
|
| index 432cb9d552192443fc8ad1be3af92ea8970bb25b..0000000000000000000000000000000000000000
|
| --- a/crosstest/crosstest.py
|
| +++ /dev/null
|
| @@ -1,140 +0,0 @@
|
| -#!/usr/bin/env python2
|
| -
|
| -import argparse
|
| -import os
|
| -import re
|
| -import subprocess
|
| -import sys
|
| -import tempfile
|
| -
|
| -sys.path.insert(0, '../pydir')
|
| -from utils import shellcmd
|
| -from utils import FindBaseNaCl
|
| -
|
| -if __name__ == '__main__':
|
| - """Builds a cross-test binary that allows functions translated by
|
| - Subzero and llc to be compared.
|
| -
|
| - Each --test argument is compiled once by llc and once by Subzero.
|
| - C/C++ tests are first compiled down to PNaCl bitcode by the
|
| - build-pnacl-ir.py script. The --prefix argument ensures that
|
| - symbol names are different between the two object files, to avoid
|
| - linking errors.
|
| -
|
| - There is also a --driver argument that specifies the C/C++ file
|
| - that calls the test functions with a variety of interesting inputs
|
| - and compares their results.
|
| - """
|
| - # arch_map maps a Subzero target string to an llvm-mc -arch string.
|
| - arch_map = { 'x8632':'x86', 'x8664':'x86-64', 'arm':'arm' }
|
| - desc = 'Build a cross-test that compares Subzero and llc translation.'
|
| - argparser = argparse.ArgumentParser(description=desc)
|
| - argparser.add_argument('--test', required=True, action='append',
|
| - metavar='TESTFILE_LIST',
|
| - help='List of C/C++/.ll files with test functions')
|
| - argparser.add_argument('--driver', required=True,
|
| - metavar='DRIVER',
|
| - help='Driver program')
|
| - argparser.add_argument('--target', required=False, default='x8632',
|
| - choices=arch_map.keys(),
|
| - metavar='TARGET',
|
| - help='Translation target architecture')
|
| - argparser.add_argument('-O', required=False, default='2', dest='optlevel',
|
| - choices=['m1', '-1', '0', '1', '2'],
|
| - metavar='OPTLEVEL',
|
| - help='Optimization level ' +
|
| - '(m1 and -1 are equivalent)')
|
| - argparser.add_argument('--mattr', required=False, default='sse2',
|
| - dest='attr', choices=['sse2', 'sse4.1'],
|
| - metavar='ATTRIBUTE', help='Target attribute')
|
| - argparser.add_argument('--prefix', required=True,
|
| - metavar='SZ_PREFIX',
|
| - help='String prepended to Subzero symbol names')
|
| - argparser.add_argument('--output', '-o', required=True,
|
| - metavar='EXECUTABLE',
|
| - help='Executable to produce')
|
| - argparser.add_argument('--dir', required=False, default='.',
|
| - metavar='OUTPUT_DIR',
|
| - help='Output directory for all files')
|
| - argparser.add_argument('--crosstest-bitcode', required=False,
|
| - default=1, type=int,
|
| - help='Compile non-subzero crosstest object file ' +
|
| - 'from the same bitcode as the subzero object. ' +
|
| - 'If 0, then compile it straight from source.')
|
| - args = argparser.parse_args()
|
| -
|
| - nacl_root = FindBaseNaCl()
|
| - # Prepend host_x86_32/bin to $PATH.
|
| - os.environ['PATH'] = nacl_root + \
|
| - '/toolchain/linux_x86/pnacl_newlib/host_x86_32/bin' + \
|
| - os.pathsep + os.environ['PATH']
|
| -
|
| - objs = []
|
| - remove_internal = re.compile('^define internal ')
|
| - fix_target = re.compile('le32-unknown-nacl')
|
| - for arg in args.test:
|
| - base, ext = os.path.splitext(arg)
|
| - if ext == '.ll':
|
| - bitcode = arg
|
| - else:
|
| - bitcode = os.path.join(args.dir, base + '.pnacl.ll')
|
| - shellcmd(['../pydir/build-pnacl-ir.py', '--disable-verify',
|
| - '--dir', args.dir, arg])
|
| - # Read in the bitcode file, fix it up, and rewrite the file.
|
| - f = open(bitcode)
|
| - ll_lines = f.readlines()
|
| - f.close()
|
| - f = open(bitcode, 'w')
|
| - for line in ll_lines:
|
| - line = remove_internal.sub('define ', line)
|
| - line = fix_target.sub('i686-pc-linux-gnu', line)
|
| - f.write(line)
|
| - f.close()
|
| -
|
| - base_sz = '%s.O%s.%s' % (base, args.optlevel, args.target)
|
| - asm_sz = os.path.join(args.dir, base_sz + '.sz.s')
|
| - obj_sz = os.path.join(args.dir, base_sz + '.sz.o')
|
| - obj_llc = os.path.join(args.dir, base + '.llc.o')
|
| - shellcmd(['../llvm2ice',
|
| - '-O' + args.optlevel,
|
| - '-mattr=' + args.attr,
|
| - '--target=' + args.target,
|
| - '--prefix=' + args.prefix,
|
| - '-o=' + asm_sz,
|
| - bitcode])
|
| - shellcmd(['llvm-mc',
|
| - '-arch=' + arch_map[args.target],
|
| - '-x86-asm-syntax=intel',
|
| - '-filetype=obj',
|
| - '-o=' + obj_sz,
|
| - asm_sz])
|
| - objs.append(obj_sz)
|
| - # Each original bitcode file needs to be translated by the
|
| - # LLVM toolchain and have its object file linked in. There
|
| - # are two ways to do this: explicitly use llc, or include the
|
| - # .ll file in the link command. It turns out that these two
|
| - # approaches can produce different semantics on some undefined
|
| - # bitcode behavior. Specifically, LLVM produces different
|
| - # results for overflowing fptoui instructions for i32 and i64
|
| - # on x86-32. As it turns out, Subzero lowering was based on
|
| - # inspecting the object code produced by the direct llc
|
| - # command, so we need to directly run llc on the bitcode, even
|
| - # though it makes this script longer, to avoid spurious
|
| - # failures. This behavior can be inspected by switching
|
| - # use_llc between True and False.
|
| - use_llc = False
|
| - if not args.crosstest_bitcode:
|
| - objs.append(arg)
|
| - elif use_llc:
|
| - shellcmd(['llc'
|
| - '-filetype=obj',
|
| - '-o=' + obj_llc,
|
| - bitcode])
|
| - objs.append(obj_llc)
|
| - else:
|
| - objs.append(bitcode)
|
| -
|
| - linker = 'clang' if os.path.splitext(args.driver)[1] == '.c' else 'clang++'
|
| - shellcmd([linker, '-g', '-m32', args.driver] +
|
| - objs +
|
| - ['-lm', '-lpthread', '-o', os.path.join(args.dir, args.output)])
|
|
|