OLD | NEW |
1 #!/usr/bin/env python2 | 1 #!/usr/bin/env python2 |
2 | 2 |
3 import argparse | 3 import argparse |
4 import os | 4 import os |
5 import subprocess | 5 import subprocess |
6 import sys | 6 import sys |
7 import tempfile | 7 import tempfile |
8 | 8 |
9 import targets | 9 import targets |
10 from szbuild import LinkNonsfi | 10 from szbuild import LinkNonsfi |
11 from utils import FindBaseNaCl, GetObjcopyCmd, get_sfi_string, shellcmd | 11 from utils import FindBaseNaCl, GetObjcopyCmd, get_sfi_string, shellcmd |
12 | 12 |
13 def main(): | 13 def main(): |
14 """Builds a cross-test binary for comparing Subzero and llc translation. | 14 """Builds a cross-test binary for comparing Subzero and llc translation. |
15 | 15 |
16 Each --test argument is compiled once by llc and once by Subzero. C/C++ | 16 Each --test argument is compiled once by llc and once by Subzero. C/C++ |
17 tests are first compiled down to PNaCl bitcode using pnacl-clang and | 17 tests are first compiled down to PNaCl bitcode using pnacl-clang and |
18 pnacl-opt. The --prefix argument ensures that symbol names are different | 18 pnacl-opt. The --prefix argument ensures that symbol names are different |
19 between the two object files, to avoid linking errors. | 19 between the two object files, to avoid linking errors. |
20 | 20 |
21 There is also a --driver argument that specifies the C/C++ file that calls | 21 There is also a --driver argument that specifies the C/C++ file that calls |
22 the test functions with a variety of interesting inputs and compares their | 22 the test functions with a variety of interesting inputs and compares their |
23 results. | 23 results. |
24 | 24 |
25 """ | 25 """ |
26 # arch_map maps a Subzero target string to TargetInfo (e.g., triple). | 26 # arch_map maps a Subzero target string to TargetInfo (e.g., triple). |
27 arch_map = { 'x8632': targets.X8632Target, | 27 arch_map = { 'x8632': targets.X8632Target, |
28 'x8664': targets.X8664Target, | 28 'x8664': targets.X8664Target, |
29 'arm32': targets.ARM32Target } | 29 'arm32': targets.ARM32Target, |
| 30 'mips32': targets.MIPS32Target} |
30 arch_sz_flags = { 'x8632': [], | 31 arch_sz_flags = { 'x8632': [], |
31 'x8664': [], | 32 'x8664': [], |
32 # For ARM, test a large stack offset as well. +/- 4095 is | 33 # For ARM, test a large stack offset as well. +/- 4095 is |
33 # the limit, so test somewhere near that boundary. | 34 # the limit, so test somewhere near that boundary. |
34 'arm32': ['--test-stack-extra', '4084'] | 35 'arm32': ['--test-stack-extra', '4084'], |
| 36 'mips32': ['--test-stack-extra', '4084'] |
35 } | 37 } |
36 arch_llc_flags_extra = { | 38 arch_llc_flags_extra = { |
37 # Use sse2 instructions regardless of input -mattr | 39 # Use sse2 instructions regardless of input -mattr |
38 # argument to avoid differences in (undefined) behavior of | 40 # argument to avoid differences in (undefined) behavior of |
39 # converting NaN to int. | 41 # converting NaN to int. |
40 'x8632': ['-mattr=sse2'], | 42 'x8632': ['-mattr=sse2'], |
41 'x8664': ['-mattr=sse2'], | 43 'x8664': ['-mattr=sse2'], |
42 'arm32': [], | 44 'arm32': [], |
| 45 'mips32':[], |
43 } | 46 } |
44 desc = 'Build a cross-test that compares Subzero and llc translation.' | 47 desc = 'Build a cross-test that compares Subzero and llc translation.' |
45 argparser = argparse.ArgumentParser(description=desc) | 48 argparser = argparse.ArgumentParser(description=desc) |
46 argparser.add_argument('--test', required=True, action='append', | 49 argparser.add_argument('--test', required=True, action='append', |
47 metavar='TESTFILE_LIST', | 50 metavar='TESTFILE_LIST', |
48 help='List of C/C++/.ll files with test functions') | 51 help='List of C/C++/.ll files with test functions') |
49 argparser.add_argument('--driver', required=True, | 52 argparser.add_argument('--driver', required=True, |
50 metavar='DRIVER', | 53 metavar='DRIVER', |
51 help='Driver program') | 54 help='Driver program') |
52 argparser.add_argument('--target', required=False, default='x8632', | 55 argparser.add_argument('--target', required=False, default='x8632', |
53 choices=arch_map.keys(), | 56 choices=arch_map.keys(), |
54 metavar='TARGET', | 57 metavar='TARGET', |
55 help='Translation target architecture.' + | 58 help='Translation target architecture.' + |
56 ' Default %(default)s.') | 59 ' Default %(default)s.') |
57 argparser.add_argument('-O', required=False, default='2', dest='optlevel', | 60 argparser.add_argument('-O', required=False, default='2', dest='optlevel', |
58 choices=['m1', '-1', '0', '1', '2'], | 61 choices=['m1', '-1', '0', '1', '2'], |
59 metavar='OPTLEVEL', | 62 metavar='OPTLEVEL', |
60 help='Optimization level for llc and Subzero ' + | 63 help='Optimization level for llc and Subzero ' + |
61 '(m1 and -1 are equivalent).' + | 64 '(m1 and -1 are equivalent).' + |
62 ' Default %(default)s.') | 65 ' Default %(default)s.') |
63 argparser.add_argument('--clang-opt', required=False, default=True, | 66 argparser.add_argument('--clang-opt', required=False, default=True, |
64 dest='clang_opt') | 67 dest='clang_opt') |
65 argparser.add_argument('--mattr', required=False, default='sse2', | 68 argparser.add_argument('--mattr', required=False, default='sse2', |
66 dest='attr', choices=['sse2', 'sse4.1', | 69 dest='attr', choices=['sse2', 'sse4.1', |
67 'neon', 'hwdiv-arm'], | 70 'neon', 'hwdiv-arm', 'base'], |
68 metavar='ATTRIBUTE', | 71 metavar='ATTRIBUTE', |
69 help='Target attribute. Default %(default)s.') | 72 help='Target attribute. Default %(default)s.') |
70 argparser.add_argument('--sandbox', required=False, default=0, type=int, | 73 argparser.add_argument('--sandbox', required=False, default=0, type=int, |
71 dest='sandbox', | 74 dest='sandbox', |
72 help='Use sandboxing. Default "%(default)s".') | 75 help='Use sandboxing. Default "%(default)s".') |
73 argparser.add_argument('--nonsfi', required=False, default=0, type=int, | 76 argparser.add_argument('--nonsfi', required=False, default=0, type=int, |
74 dest='nonsfi', | 77 dest='nonsfi', |
75 help='Use Non-SFI mode. Default "%(default)s".') | 78 help='Use Non-SFI mode. Default "%(default)s".') |
76 argparser.add_argument('--prefix', required=True, | 79 argparser.add_argument('--prefix', required=True, |
77 metavar='SZ_PREFIX', | 80 metavar='SZ_PREFIX', |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
259 objs.append(obj_llc) | 262 objs.append(obj_llc) |
260 if args.nonsfi: | 263 if args.nonsfi: |
261 LinkNonsfi(objs, os.path.join(args.dir, args.output), args.target) | 264 LinkNonsfi(objs, os.path.join(args.dir, args.output), args.target) |
262 elif args.sandbox: | 265 elif args.sandbox: |
263 LinkSandbox(objs, os.path.join(args.dir, args.output), args.target) | 266 LinkSandbox(objs, os.path.join(args.dir, args.output), args.target) |
264 else: | 267 else: |
265 LinkNative(objs, os.path.join(args.dir, args.output), args.target) | 268 LinkNative(objs, os.path.join(args.dir, args.output), args.target) |
266 | 269 |
267 if __name__ == '__main__': | 270 if __name__ == '__main__': |
268 main() | 271 main() |
OLD | NEW |