Commit 8e32fed5 by Jan Voung

Set up crosstest to run simple loop in Om1 on ARM.

We can't run O2 yet because some of the advanced Phi lowering hooks aren't implemented for O2 yet. BUG= https://code.google.com/p/nativeclient/issues/detail?id=4076 R=stichnot@chromium.org Review URL: https://codereview.chromium.org/1160873006.
parent d062f73a
...@@ -22,10 +22,13 @@ SB_LLVM_PATH ?= $(shell readlink -e \ ...@@ -22,10 +22,13 @@ SB_LLVM_PATH ?= $(shell readlink -e \
NACL_ROOT ?= $(shell python -c "import sys; sys.path.insert(0, 'pydir'); \ NACL_ROOT ?= $(shell python -c "import sys; sys.path.insert(0, 'pydir'); \
import utils; print utils.FindBaseNaCl()") import utils; print utils.FindBaseNaCl()")
# TOOLCHAIN_ROOT is the location of NaCl/PNaCl toolchains and other
# tools like qemu.
TOOLCHAIN_ROOT ?= $(shell readlink -e $(NACL_ROOT)/toolchain/linux_x86)
# PNACL_TOOLCHAIN_ROOT is the location of the PNaCl toolchain. # PNACL_TOOLCHAIN_ROOT is the location of the PNaCl toolchain.
# This is used as the default root for finding binutils, libcxx, etc. # This is used as the default root for finding binutils, libcxx, etc.
PNACL_TOOLCHAIN_ROOT ?= $(shell readlink -e \ PNACL_TOOLCHAIN_ROOT ?= $(shell readlink -e $(TOOLCHAIN_ROOT)/pnacl_newlib_raw)
$(NACL_ROOT)/toolchain/linux_x86/pnacl_newlib_raw)
# The location of PNaCl tools (e.g., binutils objdump, pnacl-clang++, etc.). # The location of PNaCl tools (e.g., binutils objdump, pnacl-clang++, etc.).
PNACL_BIN_PATH ?= $(shell readlink -e $(PNACL_TOOLCHAIN_ROOT)/bin) PNACL_BIN_PATH ?= $(shell readlink -e $(PNACL_TOOLCHAIN_ROOT)/bin)
...@@ -105,6 +108,7 @@ $(info -----------------------------------------------) ...@@ -105,6 +108,7 @@ $(info -----------------------------------------------)
$(info Using LLVM_SRC_PATH = $(LLVM_SRC_PATH)) $(info Using LLVM_SRC_PATH = $(LLVM_SRC_PATH))
$(info Using SB_LLVM_PATH = $(SB_LLVM_PATH)) $(info Using SB_LLVM_PATH = $(SB_LLVM_PATH))
$(info Using NACL_ROOT = $(NACL_ROOT)) $(info Using NACL_ROOT = $(NACL_ROOT))
$(info Using TOOLCHAIN_ROOT = $(TOOLCHAIN_ROOT))
$(info Using PNACL_TOOLCHAIN_ROOT = $(PNACL_TOOLCHAIN_ROOT)) $(info Using PNACL_TOOLCHAIN_ROOT = $(PNACL_TOOLCHAIN_ROOT))
$(info Using PNACL_BIN_PATH = $(PNACL_BIN_PATH)) $(info Using PNACL_BIN_PATH = $(PNACL_BIN_PATH))
$(info Using CLANG_PATH = $(CLANG_PATH)) $(info Using CLANG_PATH = $(CLANG_PATH))
...@@ -303,8 +307,10 @@ check-xtest: $(OBJDIR)/pnacl-sz make_symlink runtime ...@@ -303,8 +307,10 @@ check-xtest: $(OBJDIR)/pnacl-sz make_symlink runtime
# Do all native/sse2 tests, but only test_vector_ops for native/sse4.1. # Do all native/sse2 tests, but only test_vector_ops for native/sse4.1.
# For (slow) sandboxed tests, limit to Om1/sse4.1. # For (slow) sandboxed tests, limit to Om1/sse4.1.
./pydir/crosstest_generator.py -v --lit \ ./pydir/crosstest_generator.py -v --lit \
-i native,sse2 -i native,sse4.1,test_vector_ops \ --toolchain-root $(TOOLCHAIN_ROOT) \
-i sandbox,sse4.1,Om1 -i x8632,native,sse2 -i x8632,native,sse4.1,test_vector_ops \
-i x8632,sandbox,sse4.1,Om1 \
-i arm32,native,neon,Om1,simple_loop
PNACL_BIN_PATH=$(PNACL_BIN_PATH) \ PNACL_BIN_PATH=$(PNACL_BIN_PATH) \
$(LLVM_SRC_PATH)/utils/lit/lit.py -sv crosstest/Output $(LLVM_SRC_PATH)/utils/lit/lit.py -sv crosstest/Output
endif endif
......
#!/usr/bin/env python2 #!/usr/bin/env python2
import argparse import argparse
from collections import namedtuple
import os import os
import shutil import shutil
import tempfile import tempfile
import targets
from utils import shellcmd from utils import shellcmd
from utils import FindBaseNaCl from utils import FindBaseNaCl
def Translate(ll_files, extra_args, obj, verbose): def Translate(ll_files, extra_args, obj, verbose):
"""Translate a set of input bitcode files into a single object file. """Translate a set of input bitcode files into a single object file.
...@@ -29,6 +31,7 @@ def Translate(ll_files, extra_args, obj, verbose): ...@@ -29,6 +31,7 @@ def Translate(ll_files, extra_args, obj, verbose):
obj obj
], echo=verbose) ], echo=verbose)
def PartialLink(obj_files, extra_args, lib, verbose): def PartialLink(obj_files, extra_args, lib, verbose):
"""Partially links a set of obj files into a final obj library.""" """Partially links a set of obj files into a final obj library."""
shellcmd(['le32-nacl-ld', shellcmd(['le32-nacl-ld',
...@@ -37,10 +40,6 @@ def PartialLink(obj_files, extra_args, lib, verbose): ...@@ -37,10 +40,6 @@ def PartialLink(obj_files, extra_args, lib, verbose):
] + extra_args + obj_files, echo=verbose) ] + extra_args + obj_files, echo=verbose)
TargetInfo = namedtuple('TargetInfo',
['target', 'triple', 'llc_flags', 'ld_emu'])
def MakeRuntimesForTarget(target_info, ll_files, def MakeRuntimesForTarget(target_info, ll_files,
srcdir, tempdir, rtdir, verbose): srcdir, tempdir, rtdir, verbose):
def TmpFile(template): def TmpFile(template):
...@@ -72,7 +71,7 @@ def MakeRuntimesForTarget(target_info, ll_files, ...@@ -72,7 +71,7 @@ def MakeRuntimesForTarget(target_info, ll_files,
# The sandboxed library does not get the profiler helper function as the # The sandboxed library does not get the profiler helper function as the
# binaries are linked with -nostdlib. # binaries are linked with -nostdlib.
Translate(ll_files, Translate(ll_files,
['-mtriple=' + target_info.triple.replace('linux', 'nacl')] + ['-mtriple=' + targets.ConvertTripleToNaCl(target_info.triple)] +
target_info.llc_flags, target_info.llc_flags,
OutFile('{rtdir}/szrt_sb_{target}.o'), OutFile('{rtdir}/szrt_sb_{target}.o'),
verbose) verbose)
...@@ -123,19 +122,9 @@ def main(): ...@@ -123,19 +122,9 @@ def main():
ll_files = ['{dir}/szrt.ll'.format(dir=tempdir), ll_files = ['{dir}/szrt.ll'.format(dir=tempdir),
'{srcdir}/szrt_ll.ll'.format(srcdir=srcdir)] '{srcdir}/szrt_ll.ll'.format(srcdir=srcdir)]
x8632_target = TargetInfo(target='x8632', MakeRuntimesForTarget(targets.X8632Target, ll_files,
triple='i686-none-linux',
llc_flags=['-mcpu=pentium4m'],
ld_emu='elf_i386_nacl')
MakeRuntimesForTarget(x8632_target, ll_files,
srcdir, tempdir, rtdir, args.verbose) srcdir, tempdir, rtdir, args.verbose)
arm32_target = TargetInfo(target='arm32', MakeRuntimesForTarget(targets.ARM32Target, ll_files,
triple='armv7a-none-linux-gnueabihf',
llc_flags=['-mcpu=cortex-a9',
'-float-abi=hard',
'-mattr=+neon'],
ld_emu='armelf_nacl')
MakeRuntimesForTarget(arm32_target, ll_files,
srcdir, tempdir, rtdir, args.verbose) srcdir, tempdir, rtdir, args.verbose)
finally: finally:
......
...@@ -6,6 +6,7 @@ import subprocess ...@@ -6,6 +6,7 @@ import subprocess
import sys import sys
import tempfile import tempfile
import targets
from utils import shellcmd from utils import shellcmd
from utils import FindBaseNaCl from utils import FindBaseNaCl
...@@ -22,8 +23,23 @@ def main(): ...@@ -22,8 +23,23 @@ def main():
results. results.
""" """
# arch_map maps a Subzero target string to an llvm-mc -triple string. # arch_map maps a Subzero target string to TargetInfo (e.g., triple).
arch_map = { 'x8632':'i686', 'x8664':'x86_64', 'arm':'armv7a' } arch_map = { 'x8632': targets.X8632Target,
'x8664': targets.X8664Target,
'arm32': targets.ARM32Target }
arch_sz_flags = { 'x8632': [],
'x8664': [],
# TODO(jvoung): remove skip-unimplemented when implemented
'arm32': ['--skip-unimplemented']
}
arch_llc_flags_extra = {
# Use sse2 instructions regardless of input -mattr
# argument to avoid differences in (undefined) behavior of
# converting NaN to int.
'x8632': ['-mattr=sse2'],
'x8664': ['-mattr=sse2'],
'arm32': [],
}
desc = 'Build a cross-test that compares Subzero and llc translation.' desc = 'Build a cross-test that compares Subzero and llc translation.'
argparser = argparse.ArgumentParser(description=desc) argparser = argparse.ArgumentParser(description=desc)
argparser.add_argument('--test', required=True, action='append', argparser.add_argument('--test', required=True, action='append',
...@@ -46,7 +62,8 @@ def main(): ...@@ -46,7 +62,8 @@ def main():
argparser.add_argument('--clang-opt', required=False, default=True, argparser.add_argument('--clang-opt', required=False, default=True,
dest='clang_opt') dest='clang_opt')
argparser.add_argument('--mattr', required=False, default='sse2', argparser.add_argument('--mattr', required=False, default='sse2',
dest='attr', choices=['sse2', 'sse4.1'], dest='attr', choices=['sse2', 'sse4.1',
'neon', 'hwdiv-arm'],
metavar='ATTRIBUTE', metavar='ATTRIBUTE',
help='Target attribute. Default %(default)s.') help='Target attribute. Default %(default)s.')
argparser.add_argument('--sandbox', required=False, default=0, type=int, argparser.add_argument('--sandbox', required=False, default=0, type=int,
...@@ -76,7 +93,11 @@ def main(): ...@@ -76,7 +93,11 @@ def main():
nacl_root = FindBaseNaCl() nacl_root = FindBaseNaCl()
bindir = ('{root}/toolchain/linux_x86/pnacl_newlib_raw/bin' bindir = ('{root}/toolchain/linux_x86/pnacl_newlib_raw/bin'
.format(root=nacl_root)) .format(root=nacl_root))
triple = arch_map[args.target] + ('-nacl' if args.sandbox else '') target_info = arch_map[args.target]
triple = target_info.triple
if args.sandbox:
triple = targets.ConvertTripleToNaCl(triple)
llc_flags = target_info.llc_flags + arch_llc_flags_extra[args.target]
mypath = os.path.abspath(os.path.dirname(sys.argv[0])) mypath = os.path.abspath(os.path.dirname(sys.argv[0]))
objs = [] objs = []
...@@ -116,7 +137,7 @@ def main(): ...@@ -116,7 +137,7 @@ def main():
'-externalize', '-externalize',
'-filetype=' + args.filetype, '-filetype=' + args.filetype,
'-o=' + (obj_sz if args.filetype == 'obj' else asm_sz), '-o=' + (obj_sz if args.filetype == 'obj' else asm_sz),
bitcode]) bitcode] + arch_sz_flags[args.target])
if args.filetype != 'obj': if args.filetype != 'obj':
shellcmd(['{bin}/llvm-mc'.format(bin=bindir), shellcmd(['{bin}/llvm-mc'.format(bin=bindir),
'-triple=' + triple, '-triple=' + triple,
...@@ -137,14 +158,10 @@ def main(): ...@@ -137,14 +158,10 @@ def main():
if args.crosstest_bitcode: if args.crosstest_bitcode:
shellcmd(['{bin}/pnacl-llc'.format(bin=bindir), shellcmd(['{bin}/pnacl-llc'.format(bin=bindir),
'-mtriple=' + triple, '-mtriple=' + triple,
# Use sse2 instructions regardless of input -mattr
# argument to avoid differences in (undefined) behavior of
# converting NaN to int.
'-mattr=sse2',
'-externalize', '-externalize',
'-filetype=obj', '-filetype=obj',
'-o=' + obj_llc, '-o=' + obj_llc,
bitcode]) bitcode] + llc_flags)
objs.append(obj_llc) objs.append(obj_llc)
else: else:
objs.append(arg) objs.append(arg)
...@@ -162,7 +179,8 @@ def main(): ...@@ -162,7 +179,8 @@ def main():
sb_native_args = (['-O0', '--pnacl-allow-native', '-arch', 'x8632', sb_native_args = (['-O0', '--pnacl-allow-native', '-arch', 'x8632',
'-Wn,-defsym=__Sz_AbsoluteZero=0'] '-Wn,-defsym=__Sz_AbsoluteZero=0']
if args.sandbox else if args.sandbox else
['-g', '-m32', '-lm', '-lpthread', ['-g', '-target=' + triple,
'-lm', '-lpthread',
'-Wl,--defsym=__Sz_AbsoluteZero=0']) '-Wl,--defsym=__Sz_AbsoluteZero=0'])
shellcmd([compiler, args.driver] + objs + shellcmd([compiler, args.driver] + objs +
['-o', os.path.join(args.dir, args.output)] + sb_native_args) ['-o', os.path.join(args.dir, args.output)] + sb_native_args)
......
...@@ -27,6 +27,22 @@ def Match(desc, includes, excludes, default_match): ...@@ -27,6 +27,22 @@ def Match(desc, includes, excludes, default_match):
return True return True
return default_match return default_match
def RunNativePrefix(toolchain_root, target, run_cmd):
"""Returns a prefix for running an executable for the target.
For example, we may be running an ARM or MIPS target executable on an
x86 machine and need to use an emulator.
"""
arch_map = { 'x8632' : '',
'x8664' : '',
'arm32' : os.path.join(toolchain_root, 'arm_trusted',
'run_under_qemu_arm'),
}
prefix = arch_map[target]
return (prefix + ' ' + run_cmd) if prefix else run_cmd
def main(): def main():
"""Framework for cross test generation and execution. """Framework for cross test generation and execution.
...@@ -39,13 +55,20 @@ def main(): ...@@ -39,13 +55,20 @@ def main():
root = FindBaseNaCl() root = FindBaseNaCl()
# The rest of the attribute sets. # The rest of the attribute sets.
targets = [ 'x8632' ] targets = [ 'x8632', 'arm32' ]
sandboxing = [ 'native', 'sandbox' ] sandboxing = [ 'native', 'sandbox' ]
opt_levels = [ 'Om1', 'O2' ] opt_levels = [ 'Om1', 'O2' ]
arch_attrs = [ 'sse2', 'sse4.1' ] arch_attrs = { 'x8632': [ 'sse2', 'sse4.1' ],
'arm32': [ 'neon', 'hwdiv-arm' ] }
flat_attrs = []
for v in arch_attrs.values():
flat_attrs += v
arch_flags = { 'x8632': [],
# ARM doesn't have an integrated assembler yet.
'arm32': ['--filetype=asm'] }
# all_keys is only used in the help text. # all_keys is only used in the help text.
all_keys = '; '.join([' '.join(targets), ' '.join(sandboxing), all_keys = '; '.join([' '.join(targets), ' '.join(sandboxing),
' '.join(opt_levels), ' '.join(arch_attrs)]) ' '.join(opt_levels), ' '.join(flat_attrs)])
argparser = argparse.ArgumentParser( argparser = argparse.ArgumentParser(
description=' ' + main.__doc__ + description=' ' + main.__doc__ +
...@@ -76,6 +99,8 @@ def main(): ...@@ -76,6 +99,8 @@ def main():
help='Output directory') help='Output directory')
argparser.add_argument('--lit', default=False, action='store_true', argparser.add_argument('--lit', default=False, action='store_true',
help='Generate files for lit testing') help='Generate files for lit testing')
argparser.add_argument('--toolchain-root', dest='toolchain_root',
help='Path to toolchain binaries.')
args = argparser.parse_args() args = argparser.parse_args()
# Run from the crosstest directory to make it easy to grab inputs. # Run from the crosstest directory to make it easy to grab inputs.
...@@ -113,7 +138,7 @@ def main(): ...@@ -113,7 +138,7 @@ def main():
for target in targets: for target in targets:
for sb in sandboxing: for sb in sandboxing:
for opt in opt_levels: for opt in opt_levels:
for attr in arch_attrs: for attr in arch_attrs[target]:
desc = [ test, target, sb, opt, attr ] desc = [ test, target, sb, opt, attr ]
if Match(set(desc), includes, excludes, default_match): if Match(set(desc), includes, excludes, default_match):
exe = '{test}_{target}_{sb}_{opt}_{attr}'.format( exe = '{test}_{target}_{sb}_{opt}_{attr}'.format(
...@@ -122,24 +147,27 @@ def main(): ...@@ -122,24 +147,27 @@ def main():
extra = (tests.get(test, 'flags').split(' ') extra = (tests.get(test, 'flags').split(' ')
if tests.has_option(test, 'flags') else []) if tests.has_option(test, 'flags') else [])
# Generate the compile command. # Generate the compile command.
cmp_cmd = ['{path}/crosstest.py'.format(path=pypath), cmp_cmd = (
'-{opt}'.format(opt=opt), ['{path}/crosstest.py'.format(path=pypath),
'--mattr={attr}'.format(attr=attr), '-{opt}'.format(opt=opt),
'--prefix=Subzero_', '--mattr={attr}'.format(attr=attr),
'--target={target}'.format(target=target), '--prefix=Subzero_',
'--sandbox={sb}'.format(sb='1' if sb=='sandbox' '--target={target}'.format(target=target),
else '0'), '--sandbox={sb}'.format(sb='1' if sb=='sandbox' else '0'),
'--dir={dir}'.format(dir=args.dir), '--dir={dir}'.format(dir=args.dir),
'--output={exe}'.format(exe=exe), '--output={exe}'.format(exe=exe),
'--driver={drv}'.format(drv=tests.get(test, 'driver')), '--driver={drv}'.format(drv=tests.get(test, 'driver'))] +
] + extra + \ extra +
[ '--test=' + t ['--test=' + t
for t in tests.get(test, 'test').split(' ') ] for t in tests.get(test, 'test').split(' ')] +
arch_flags[target])
run_cmd_base = os.path.join(args.dir, exe) run_cmd_base = os.path.join(args.dir, exe)
# Generate the run command. # Generate the run command.
run_cmd = run_cmd_base run_cmd = run_cmd_base
if sb == 'sandbox': if sb == 'sandbox':
run_cmd = '{root}/run.py -q '.format(root=root) + run_cmd run_cmd = '{root}/run.py -q '.format(root=root) + run_cmd
else:
run_cmd = RunNativePrefix(args.toolchain_root, target, run_cmd)
if args.lit: if args.lit:
# Create a file to drive the lit test. # Create a file to drive the lit test.
with open(run_cmd_base + '.xtest', 'w') as f: with open(run_cmd_base + '.xtest', 'w') as f:
......
#!/usr/bin/env python2
from collections import namedtuple
TargetInfo = namedtuple('TargetInfo',
['target', 'triple', 'llc_flags', 'ld_emu'])
X8632Target = TargetInfo(target='x8632',
triple='i686-none-linux',
llc_flags=['-mcpu=pentium4m'],
ld_emu='elf_i386_nacl')
X8664Target = TargetInfo(target='x8664',
triple='x86_64-none-linux',
llc_flags=['-mcpu=x86-64'],
ld_emu='elf_x86_64_nacl')
ARM32Target = TargetInfo(target='arm32',
triple='armv7a-none-linux-gnueabihf',
llc_flags=['-mcpu=cortex-a9',
'-float-abi=hard',
'-mattr=+neon'],
ld_emu='armelf_nacl')
def ConvertTripleToNaCl(nonsfi_triple):
return nonsfi_triple.replace('linux', 'nacl')
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment