Index: pydir/crosstest.py |
diff --git a/pydir/crosstest.py b/pydir/crosstest.py |
index ae3b50e2f623e2ba97e929bdad760bc49cb0fb1d..55a79df589b5299e0327b833c668c34e70beef6a 100755 |
--- a/pydir/crosstest.py |
+++ b/pydir/crosstest.py |
@@ -2,7 +2,6 @@ |
import argparse |
import os |
-import re |
import subprocess |
import sys |
import tempfile |
@@ -10,7 +9,7 @@ import tempfile |
from utils import shellcmd |
from utils import FindBaseNaCl |
-if __name__ == '__main__': |
+def main(): |
"""Builds a cross-test binary that allows functions translated by |
Subzero and llc to be compared. |
@@ -49,6 +48,9 @@ if __name__ == '__main__': |
dest='attr', choices=['sse2', 'sse4.1'], |
metavar='ATTRIBUTE', |
help='Target attribute. Default %(default)s.') |
+ argparser.add_argument('--sandbox', required=False, default=0, type=int, |
+ dest='sandbox', |
+ help='Use sandboxing. Default "%(default)s".') |
argparser.add_argument('--prefix', required=True, |
metavar='SZ_PREFIX', |
help='String prepended to Subzero symbol names') |
@@ -71,14 +73,11 @@ if __name__ == '__main__': |
args = argparser.parse_args() |
nacl_root = FindBaseNaCl() |
- # Prepend PNaCl bin to $PATH. |
- os.environ['PATH'] = nacl_root + \ |
- '/toolchain/linux_x86/pnacl_newlib/bin' + \ |
- os.pathsep + os.environ['PATH'] |
+ bindir = ('{root}/toolchain/linux_x86/pnacl_newlib/bin' |
+ .format(root=nacl_root)) |
+ triple = arch_map[args.target] + ('-nacl' if args.sandbox else '') |
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': |
@@ -87,68 +86,61 @@ if __name__ == '__main__': |
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.%s' % (base, args.optlevel, args.attr, args.target) |
+ base_sz = '{base}.{sb}.O{opt}.{attr}.{target}'.format( |
+ base=base, sb='sb' if args.sandbox else 'nat', opt=args.optlevel, |
+ attr=args.attr, target=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') |
+ obj_llc = os.path.join(args.dir, base_sz + '.llc.o') |
shellcmd(['../pnacl-sz', |
'-O' + args.optlevel, |
'-mattr=' + args.attr, |
'--target=' + args.target, |
+ '--sandbox=' + str(args.sandbox), |
'--prefix=' + args.prefix, |
'-allow-uninitialized-globals', |
+ '-externalize', |
'-filetype=' + args.filetype, |
'-o=' + (obj_sz if args.filetype == 'obj' else asm_sz), |
bitcode]) |
if args.filetype != 'obj': |
- shellcmd(['llvm-mc', |
- '-triple=' + arch_map[args.target], |
+ shellcmd(['{bin}/llvm-mc'.format(bin=bindir), |
+ '-triple=' + triple, |
'-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 |
- pure_c = os.path.splitext(args.driver)[1] == '.c' |
- if not args.crosstest_bitcode: |
- objs.append(arg) |
- elif use_llc: |
- shellcmd(['llc' |
+ if args.crosstest_bitcode: |
+ shellcmd(['{bin}/pnacl-llc'.format(bin=bindir), |
+ '-mtriple=' + triple, |
+ # Use sse2 instructions regardless of input -mattr |
+ # argument to avoid differences in (undefined) behavior of |
+ # converting NaN to int. |
+ '-mattr=sse2', |
+ '-externalize', |
'-filetype=obj', |
'-o=' + obj_llc, |
bitcode]) |
objs.append(obj_llc) |
else: |
- objs.append(bitcode) |
+ objs.append(arg) |
+ # Add szrt_sb_x8632.o or szrt_native_x8632.o. |
objs.append(( |
'{root}/toolchain_build/src/subzero/build/runtime/' + |
- 'szrt_native_x8632.o' |
- ).format(root=nacl_root)) |
- linker = 'clang' if pure_c else 'clang++' |
- shellcmd([linker, '-g', '-m32', args.driver] + |
- objs + |
- ['-lm', '-lpthread', '-o', os.path.join(args.dir, args.output)]) |
+ 'szrt_{sb}_' + args.target + '.o' |
+ ).format(root=nacl_root, sb='sb' if args.sandbox else 'native')) |
+ pure_c = os.path.splitext(args.driver)[1] == '.c' |
+ # Set compiler to clang, clang++, pnacl-clang, or pnacl-clang++. |
+ compiler = '{bin}/{prefix}{cc}'.format( |
+ bin=bindir, prefix='pnacl-' if args.sandbox else '', |
+ cc='clang' if pure_c else 'clang++') |
+ sb_native_args = (['-O0', '--pnacl-allow-native', '-arch', 'x8632'] |
+ if args.sandbox else |
+ ['-g', '-m32', '-lm', '-lpthread']) |
+ shellcmd([compiler, args.driver] + objs + |
+ ['-o', os.path.join(args.dir, args.output)] + sb_native_args) |
+ |
+if __name__ == '__main__': |
+ main() |