| 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 shutil | 5 import shutil |
| 6 import tempfile | 6 import tempfile |
| 7 | 7 |
| 8 import targets | 8 import targets |
| 9 from utils import FindBaseNaCl, GetObjcopyCmd, shellcmd | 9 from utils import FindBaseNaCl, GetObjcopyCmd, shellcmd |
| 10 | 10 |
| 11 | 11 |
| 12 def Translate(ll_files, extra_args, obj, verbose): | 12 def Translate(ll_files, extra_args, obj, verbose, target): |
| 13 """Translate a set of input bitcode files into a single object file. | 13 """Translate a set of input bitcode files into a single object file. |
| 14 | 14 |
| 15 Use pnacl-llc to translate textual bitcode input ll_files into object file | 15 Use pnacl-llc to translate textual bitcode input ll_files into object file |
| 16 obj, using extra_args as the architectural flags. | 16 obj, using extra_args as the architectural flags. |
| 17 """ | 17 """ |
| 18 externalize = [] if target == 'mips32' else ['-externalize'] |
| 18 shellcmd(['cat'] + ll_files + ['|', | 19 shellcmd(['cat'] + ll_files + ['|', |
| 19 'pnacl-llc', | 20 'pnacl-llc', |
| 20 '-externalize', | |
| 21 '-function-sections', | 21 '-function-sections', |
| 22 '-O2', | 22 '-O2', |
| 23 '-filetype=obj', | 23 '-filetype=obj', |
| 24 '-bitcode-format=llvm', | 24 '-bitcode-format=llvm', |
| 25 '-arm-enable-dwarf-eh=1', | |
| 26 '-o', obj | 25 '-o', obj |
| 27 ] + extra_args, echo=verbose) | 26 ] + extra_args + externalize, echo=verbose) |
| 28 shellcmd([GetObjcopyCmd(), | 27 strip_syms = [] if target == 'mips32' else ['nacl_tp_tdb_offset', |
| 29 '--strip-symbol=nacl_tp_tdb_offset', | 28 'nacl_tp_tls_offset'] |
| 30 '--strip-symbol=nacl_tp_tls_offset', | 29 shellcmd([GetObjcopyCmd(target), obj] + |
| 31 obj | 30 [('--strip-symbol=' + sym) for sym in strip_syms]) |
| 32 ], echo=verbose) | |
| 33 | 31 |
| 34 | 32 |
| 35 def PartialLink(obj_files, extra_args, lib, verbose): | 33 def PartialLink(obj_files, extra_args, lib, verbose): |
| 36 """Partially links a set of obj files into a final obj library.""" | 34 """Partially links a set of obj files into a final obj library.""" |
| 37 shellcmd(['le32-nacl-ld', | 35 shellcmd(['le32-nacl-ld', |
| 38 '-o', lib, | 36 '-o', lib, |
| 39 '-r', | 37 '-r', |
| 40 ] + extra_args + obj_files, echo=verbose) | 38 ] + extra_args + obj_files, echo=verbose) |
| 41 | 39 |
| 42 | 40 |
| 43 def MakeRuntimesForTarget(target_info, ll_files, | 41 def MakeRuntimesForTarget(target_info, ll_files, |
| 44 srcdir, tempdir, rtdir, verbose): | 42 srcdir, tempdir, rtdir, verbose, excluded_targets): |
| 45 """Builds native, sandboxed, and nonsfi runtimes for the given target.""" | 43 """Builds native, sandboxed, and nonsfi runtimes for the given target.""" |
| 44 if target_info.target in excluded_targets: |
| 45 return |
| 46 # File-mangling helper functions. | 46 # File-mangling helper functions. |
| 47 def TmpFile(template): | 47 def TmpFile(template): |
| 48 return template.format(dir=tempdir, target=target_info.target) | 48 return template.format(dir=tempdir, target=target_info.target) |
| 49 def OutFile(template): | 49 def OutFile(template): |
| 50 return template.format(rtdir=rtdir, target=target_info.target) | 50 return template.format(rtdir=rtdir, target=target_info.target) |
| 51 # Helper function for building the native unsandboxed runtime. | 51 # Helper function for building the native unsandboxed runtime. |
| 52 def MakeNativeRuntime(): | 52 def MakeNativeRuntime(): |
| 53 """Builds just the native runtime.""" | 53 """Builds just the native runtime.""" |
| 54 # Translate tempdir/szrt.ll and tempdir/szrt_ll.ll to | 54 # Translate tempdir/szrt.ll and tempdir/szrt_ll.ll to |
| 55 # szrt_native_{target}.tmp.o. | 55 # szrt_native_{target}.tmp.o. |
| 56 Translate(ll_files, | 56 Translate(ll_files, |
| 57 ['-mtriple=' + target_info.triple] + target_info.llc_flags, | 57 ['-mtriple=' + target_info.triple] + target_info.llc_flags, |
| 58 TmpFile('{dir}/szrt_native_{target}.tmp.o'), | 58 TmpFile('{dir}/szrt_native_{target}.tmp.o'), |
| 59 verbose) | 59 verbose, target_info.target) |
| 60 # Compile srcdir/szrt_profiler.c to | 60 # Compile srcdir/szrt_profiler.c to |
| 61 # tempdir/szrt_profiler_native_{target}.o. | 61 # tempdir/szrt_profiler_native_{target}.o. |
| 62 shellcmd(['clang', | 62 shellcmd(['clang', |
| 63 '-O2', | 63 '-O2', |
| 64 '-target=' + target_info.triple, | 64 '-target=' + target_info.triple, |
| 65 '-c', | 65 '-c', |
| 66 '{srcdir}/szrt_profiler.c'.format(srcdir=srcdir), | 66 '{srcdir}/szrt_profiler.c'.format(srcdir=srcdir), |
| 67 '-o', TmpFile('{dir}/szrt_native_profiler_{target}.o') | 67 '-o', TmpFile('{dir}/szrt_native_profiler_{target}.o') |
| 68 ], echo=verbose) | 68 ], echo=verbose) |
| 69 # Assemble srcdir/szrt_asm_{target}.s to tempdir/szrt_asm_{target}.o. | 69 # Assemble srcdir/szrt_asm_{target}.s to tempdir/szrt_asm_{target}.o. |
| 70 shellcmd(['llvm-mc', | 70 shellcmd(['llvm-mc', |
| 71 '-triple=' + target_info.triple, '--defsym NATIVE=1', | 71 '-triple=' + target_info.triple, '--defsym NATIVE=1', |
| 72 '-filetype=obj', | 72 '-filetype=obj', |
| 73 '-o', TmpFile('{dir}/szrt_native_asm_{target}.o'), | 73 '-o', TmpFile('{dir}/szrt_native_asm_{target}.o'), |
| 74 '{srcdir}/szrt_asm_{target}.s'.format( | 74 '{srcdir}/szrt_asm_{target}.s'.format( |
| 75 srcdir=srcdir, target=target_info.target) | 75 srcdir=srcdir, target=target_info.target) |
| 76 ], echo=verbose) | 76 ], echo=verbose) |
| 77 # Write full szrt_native_{target}.o. | 77 # Write full szrt_native_{target}.o. |
| 78 PartialLink([TmpFile('{dir}/szrt_native_{target}.tmp.o'), | 78 PartialLink([TmpFile('{dir}/szrt_native_{target}.tmp.o'), |
| 79 TmpFile('{dir}/szrt_native_asm_{target}.o'), | 79 TmpFile('{dir}/szrt_native_asm_{target}.o'), |
| 80 TmpFile('{dir}/szrt_native_profiler_{target}.o')], | 80 TmpFile('{dir}/szrt_native_profiler_{target}.o')], |
| 81 ['-m {ld_emu}'.format(ld_emu=target_info.ld_emu)], | 81 ['-m {ld_emu}'.format(ld_emu=target_info.ld_emu)], |
| 82 OutFile('{rtdir}/szrt_native_{target}.o'), | 82 OutFile('{rtdir}/szrt_native_{target}.o'), |
| 83 verbose) | 83 verbose) |
| 84 shellcmd([GetObjcopyCmd(), | 84 shellcmd([GetObjcopyCmd(target_info.target), |
| 85 '--strip-symbol=NATIVE', | 85 '--strip-symbol=NATIVE', |
| 86 OutFile('{rtdir}/szrt_native_{target}.o')]) | 86 OutFile('{rtdir}/szrt_native_{target}.o')]) |
| 87 # Compile srcdir/szrt_asan.c to szrt_asan_{target}.o | 87 # Compile srcdir/szrt_asan.c to szrt_asan_{target}.o |
| 88 shellcmd(['clang', | 88 shellcmd(['clang', |
| 89 '-O2', | 89 '-O2', |
| 90 '-target=' + target_info.triple, | 90 '-target=' + target_info.triple, |
| 91 '-c', | 91 '-c', |
| 92 '{srcdir}/szrt_asan.c'.format(srcdir=srcdir), | 92 '{srcdir}/szrt_asan.c'.format(srcdir=srcdir), |
| 93 '-o', OutFile('{rtdir}/szrt_asan_{target}.o') | 93 '-o', OutFile('{rtdir}/szrt_asan_{target}.o') |
| 94 ], echo=verbose) | 94 ], echo=verbose) |
| 95 | 95 |
| 96 # Helper function for building the sandboxed runtime. | 96 # Helper function for building the sandboxed runtime. |
| 97 def MakeSandboxedRuntime(): | 97 def MakeSandboxedRuntime(): |
| 98 """Builds just the sandboxed runtime.""" | 98 """Builds just the sandboxed runtime.""" |
| 99 # Translate tempdir/szrt.ll and tempdir/szrt_ll.ll to szrt_sb_{target}.o. | 99 # Translate tempdir/szrt.ll and tempdir/szrt_ll.ll to szrt_sb_{target}.o. |
| 100 # The sandboxed library does not get the profiler helper function as the | 100 # The sandboxed library does not get the profiler helper function as the |
| 101 # binaries are linked with -nostdlib. | 101 # binaries are linked with -nostdlib. |
| 102 Translate(ll_files, | 102 Translate(ll_files, |
| 103 ['-mtriple=' + targets.ConvertTripleToNaCl(target_info.triple)] + | 103 ['-mtriple=' + targets.ConvertTripleToNaCl(target_info.triple)] + |
| 104 target_info.llc_flags, | 104 target_info.llc_flags, |
| 105 TmpFile('{dir}/szrt_sb_{target}.tmp.o'), | 105 TmpFile('{dir}/szrt_sb_{target}.tmp.o'), |
| 106 verbose) | 106 verbose,target_info.target) |
| 107 # Assemble srcdir/szrt_asm_{target}.s to tempdir/szrt_asm_{target}.o. | 107 # Assemble srcdir/szrt_asm_{target}.s to tempdir/szrt_asm_{target}.o. |
| 108 shellcmd(['llvm-mc', | 108 shellcmd(['llvm-mc', |
| 109 '-triple=' + targets.ConvertTripleToNaCl(target_info.triple), | 109 '-triple=' + targets.ConvertTripleToNaCl(target_info.triple), |
| 110 '--defsym NACL=1', | 110 '--defsym NACL=1', |
| 111 '-filetype=obj', | 111 '-filetype=obj', |
| 112 '-o', TmpFile('{dir}/szrt_sb_asm_{target}.o'), | 112 '-o', TmpFile('{dir}/szrt_sb_asm_{target}.o'), |
| 113 '{srcdir}/szrt_asm_{target}.s'.format( | 113 '{srcdir}/szrt_asm_{target}.s'.format( |
| 114 srcdir=srcdir, target=target_info.target) | 114 srcdir=srcdir, target=target_info.target) |
| 115 ], echo=verbose) | 115 ], echo=verbose) |
| 116 PartialLink([TmpFile('{dir}/szrt_sb_{target}.tmp.o'), | 116 PartialLink([TmpFile('{dir}/szrt_sb_{target}.tmp.o'), |
| 117 TmpFile('{dir}/szrt_sb_asm_{target}.o')], | 117 TmpFile('{dir}/szrt_sb_asm_{target}.o')], |
| 118 ['-m {ld_emu}'.format(ld_emu=target_info.sb_emu)], | 118 ['-m {ld_emu}'.format(ld_emu=target_info.sb_emu)], |
| 119 OutFile('{rtdir}/szrt_sb_{target}.o'), | 119 OutFile('{rtdir}/szrt_sb_{target}.o'), |
| 120 verbose) | 120 verbose) |
| 121 shellcmd([GetObjcopyCmd(), | 121 shellcmd([GetObjcopyCmd(target_info.target), |
| 122 '--strip-symbol=NACL', | 122 '--strip-symbol=NACL', |
| 123 OutFile('{rtdir}/szrt_sb_{target}.o')]) | 123 OutFile('{rtdir}/szrt_sb_{target}.o')]) |
| 124 | 124 |
| 125 # Helper function for building the Non-SFI runtime. | 125 # Helper function for building the Non-SFI runtime. |
| 126 def MakeNonsfiRuntime(): | 126 def MakeNonsfiRuntime(): |
| 127 """Builds just the nonsfi runtime.""" | 127 """Builds just the nonsfi runtime.""" |
| 128 # Translate tempdir/szrt.ll and tempdir/szrt_ll.ll to | 128 # Translate tempdir/szrt.ll and tempdir/szrt_ll.ll to |
| 129 # szrt_nonsfi_{target}.tmp.o. | 129 # szrt_nonsfi_{target}.tmp.o. |
| 130 Translate(ll_files, | 130 Translate(ll_files, |
| 131 ['-mtriple=' + target_info.triple] + target_info.llc_flags + | 131 ['-mtriple=' + target_info.triple] + target_info.llc_flags + |
| 132 ['-relocation-model=pic', '-force-tls-non-pic', '-malign-double'], | 132 ['-relocation-model=pic', '-force-tls-non-pic', '-malign-double'], |
| 133 TmpFile('{dir}/szrt_nonsfi_{target}.tmp.o'), | 133 TmpFile('{dir}/szrt_nonsfi_{target}.tmp.o'), |
| 134 verbose) | 134 verbose, target_info.target) |
| 135 # Assemble srcdir/szrt_asm_{target}.s to tempdir/szrt_asm_{target}.o. | 135 # Assemble srcdir/szrt_asm_{target}.s to tempdir/szrt_asm_{target}.o. |
| 136 shellcmd(['llvm-mc', | 136 shellcmd(['llvm-mc', |
| 137 '-triple=' + target_info.triple, '--defsym NONSFI=1', | 137 '-triple=' + target_info.triple, '--defsym NONSFI=1', |
| 138 '-filetype=obj', | 138 '-filetype=obj', |
| 139 '-o', TmpFile('{dir}/szrt_nonsfi_asm_{target}.o'), | 139 '-o', TmpFile('{dir}/szrt_nonsfi_asm_{target}.o'), |
| 140 '{srcdir}/szrt_asm_{target}.s'.format( | 140 '{srcdir}/szrt_asm_{target}.s'.format( |
| 141 srcdir=srcdir, target=target_info.target) | 141 srcdir=srcdir, target=target_info.target) |
| 142 ], echo=verbose) | 142 ], echo=verbose) |
| 143 # Write full szrt_nonsfi_{target}.o. | 143 # Write full szrt_nonsfi_{target}.o. |
| 144 PartialLink([TmpFile('{dir}/szrt_nonsfi_{target}.tmp.o'), | 144 PartialLink([TmpFile('{dir}/szrt_nonsfi_{target}.tmp.o'), |
| 145 TmpFile('{dir}/szrt_nonsfi_asm_{target}.o')], | 145 TmpFile('{dir}/szrt_nonsfi_asm_{target}.o')], |
| 146 ['-m {ld_emu}'.format(ld_emu=target_info.ld_emu)], | 146 ['-m {ld_emu}'.format(ld_emu=target_info.ld_emu)], |
| 147 OutFile('{rtdir}/szrt_nonsfi_{target}.o'), | 147 OutFile('{rtdir}/szrt_nonsfi_{target}.o'), |
| 148 verbose) | 148 verbose) |
| 149 shellcmd([GetObjcopyCmd(), | 149 shellcmd([GetObjcopyCmd(target_info.target), |
| 150 '--strip-symbol=NONSFI', | 150 '--strip-symbol=NONSFI', |
| 151 OutFile('{rtdir}/szrt_nonsfi_{target}.o')]) | 151 OutFile('{rtdir}/szrt_nonsfi_{target}.o')]) |
| 152 | 152 |
| 153 | 153 |
| 154 # Run the helper functions. | 154 # Run the helper functions. |
| 155 MakeNativeRuntime() | 155 MakeNativeRuntime() |
| 156 MakeSandboxedRuntime() | 156 MakeSandboxedRuntime() |
| 157 MakeNonsfiRuntime() | 157 MakeNonsfiRuntime() |
| 158 | 158 |
| 159 | 159 |
| 160 def main(): | 160 def main(): |
| 161 """Build the Subzero runtime support library for all architectures. | 161 """Build the Subzero runtime support library for all architectures. |
| 162 """ | 162 """ |
| 163 nacl_root = FindBaseNaCl() | 163 nacl_root = FindBaseNaCl() |
| 164 argparser = argparse.ArgumentParser( | 164 argparser = argparse.ArgumentParser( |
| 165 description=' ' + main.__doc__, | 165 description=' ' + main.__doc__, |
| 166 formatter_class=argparse.RawTextHelpFormatter) | 166 formatter_class=argparse.RawTextHelpFormatter) |
| 167 argparser.add_argument('--verbose', '-v', dest='verbose', | 167 argparser.add_argument('--verbose', '-v', dest='verbose', |
| 168 action='store_true', | 168 action='store_true', |
| 169 help='Display some extra debugging output') | 169 help='Display some extra debugging output') |
| 170 argparser.add_argument('--pnacl-root', dest='pnacl_root', | 170 argparser.add_argument('--pnacl-root', dest='pnacl_root', |
| 171 default=( | 171 default=( |
| 172 '{root}/toolchain/linux_x86/pnacl_newlib_raw' | 172 '{root}/toolchain/linux_x86/pnacl_newlib_raw' |
| 173 ).format(root=nacl_root), | 173 ).format(root=nacl_root), |
| 174 help='Path to PNaCl toolchain binaries.') | 174 help='Path to PNaCl toolchain binaries.') |
| 175 argparser.add_argument('--exclude-target', dest='excluded_targets', |
| 176 default=[], action='append', |
| 177 help='Target whose runtime should not be built') |
| 175 args = argparser.parse_args() | 178 args = argparser.parse_args() |
| 176 os.environ['PATH'] = ('{root}/bin{sep}{path}' | 179 os.environ['PATH'] = ('{root}/bin{sep}{path}' |
| 177 ).format(root=args.pnacl_root, sep=os.pathsep, path=os.environ['PATH']) | 180 ).format(root=args.pnacl_root, sep=os.pathsep, path=os.environ['PATH']) |
| 178 srcdir = ( | 181 srcdir = ( |
| 179 '{root}/toolchain_build/src/subzero/runtime' | 182 '{root}/toolchain_build/src/subzero/runtime' |
| 180 ).format(root=nacl_root) | 183 ).format(root=nacl_root) |
| 181 rtdir = ( | 184 rtdir = ( |
| 182 '{root}/toolchain_build/src/subzero/build/runtime' | 185 '{root}/toolchain_build/src/subzero/build/runtime' |
| 183 ).format(root=nacl_root) | 186 ).format(root=nacl_root) |
| 184 try: | 187 try: |
| (...skipping 14 matching lines...) Expand all Loading... |
| 199 '-pnacl-abi-simplify-postopt', | 202 '-pnacl-abi-simplify-postopt', |
| 200 '-pnaclabi-allow-debug-metadata', | 203 '-pnaclabi-allow-debug-metadata', |
| 201 '{dir}/szrt.tmp.bc'.format(dir=tempdir), | 204 '{dir}/szrt.tmp.bc'.format(dir=tempdir), |
| 202 '-S', | 205 '-S', |
| 203 '-o', '{dir}/szrt.ll'.format(dir=tempdir) | 206 '-o', '{dir}/szrt.ll'.format(dir=tempdir) |
| 204 ], echo=args.verbose) | 207 ], echo=args.verbose) |
| 205 ll_files = ['{dir}/szrt.ll'.format(dir=tempdir), | 208 ll_files = ['{dir}/szrt.ll'.format(dir=tempdir), |
| 206 '{srcdir}/szrt_ll.ll'.format(srcdir=srcdir)] | 209 '{srcdir}/szrt_ll.ll'.format(srcdir=srcdir)] |
| 207 | 210 |
| 208 MakeRuntimesForTarget(targets.X8632Target, ll_files, | 211 MakeRuntimesForTarget(targets.X8632Target, ll_files, |
| 209 srcdir, tempdir, rtdir, args.verbose) | 212 srcdir, tempdir, rtdir, args.verbose, |
| 213 args.excluded_targets) |
| 210 MakeRuntimesForTarget(targets.X8664Target, ll_files, | 214 MakeRuntimesForTarget(targets.X8664Target, ll_files, |
| 211 srcdir, tempdir, rtdir, args.verbose) | 215 srcdir, tempdir, rtdir, args.verbose, |
| 216 args.excluded_targets) |
| 212 MakeRuntimesForTarget(targets.ARM32Target, ll_files, | 217 MakeRuntimesForTarget(targets.ARM32Target, ll_files, |
| 213 srcdir, tempdir, rtdir, args.verbose) | 218 srcdir, tempdir, rtdir, args.verbose, |
| 219 args.excluded_targets) |
| 220 MakeRuntimesForTarget(targets.MIPS32Target, ll_files, |
| 221 srcdir, tempdir, rtdir, args.verbose, |
| 222 args.excluded_targets) |
| 214 | 223 |
| 215 finally: | 224 finally: |
| 216 try: | 225 try: |
| 217 shutil.rmtree(tempdir) | 226 shutil.rmtree(tempdir) |
| 218 except OSError as exc: | 227 except OSError as exc: |
| 219 if exc.errno != errno.ENOENT: # ENOENT - no such file or directory | 228 if exc.errno != errno.ENOENT: # ENOENT - no such file or directory |
| 220 raise # re-raise exception | 229 raise # re-raise exception |
| 221 | 230 |
| 222 if __name__ == '__main__': | 231 if __name__ == '__main__': |
| 223 main() | 232 main() |
| OLD | NEW |