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 pipes | 5 import pipes |
6 import re | 6 import re |
7 import sys | 7 import sys |
8 | 8 |
9 from utils import shellcmd | 9 from utils import shellcmd |
10 from utils import FindBaseNaCl | 10 from utils import FindBaseNaCl |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
125 | 125 |
126 If no --include or --exclude arguments are given, the executable is produced | 126 If no --include or --exclude arguments are given, the executable is produced |
127 entirely using Subzero, without using llc or linker tricks. | 127 entirely using Subzero, without using llc or linker tricks. |
128 | 128 |
129 This script uses file modification timestamps to determine whether llc and | 129 This script uses file modification timestamps to determine whether llc and |
130 Subzero re-translation are needed. It checks timestamps of llc, pnacl-sz, | 130 Subzero re-translation are needed. It checks timestamps of llc, pnacl-sz, |
131 and the pexe against the translated object files to determine the minimal | 131 and the pexe against the translated object files to determine the minimal |
132 work necessary. The --force option suppresses those checks and | 132 work necessary. The --force option suppresses those checks and |
133 re-translates everything. | 133 re-translates everything. |
134 | 134 |
135 This script augments PATH so that various PNaCl and LLVM tools can be run. | 135 This script expects various PNaCl and LLVM tools to be found within the |
136 These extra paths are within the native_client tree. When changes are made | 136 native_client tree. When changes are made to these tools, copy them this |
137 to these tools, copy them this way: | 137 way: |
138 cd native_client | 138 cd native_client |
139 toolchain_build/toolchain_build_pnacl.py llvm_x86_64_linux \\ | 139 toolchain_build/toolchain_build_pnacl.py llvm_x86_64_linux \\ |
140 --install=toolchain/linux_x86/pnacl_newlib_raw | 140 --install=toolchain/linux_x86/pnacl_newlib_raw |
141 """ | 141 """ |
142 argparser = argparse.ArgumentParser( | 142 argparser = argparse.ArgumentParser( |
143 description=' ' + main.__doc__, | 143 description=' ' + main.__doc__, |
144 formatter_class=argparse.RawTextHelpFormatter) | 144 formatter_class=argparse.RawTextHelpFormatter) |
145 AddOptionalArgs(argparser) | 145 AddOptionalArgs(argparser) |
146 argparser.add_argument('pexe', help='Finalized pexe to translate') | 146 argparser.add_argument('pexe', help='Finalized pexe to translate') |
147 args = argparser.parse_args() | 147 args = argparser.parse_args() |
148 pexe = args.pexe | 148 pexe = args.pexe |
149 exe = args.output | 149 exe = args.output |
150 ProcessPexe(args, pexe, exe) | 150 ProcessPexe(args, pexe, exe) |
151 | 151 |
152 def ProcessPexe(args, pexe, exe): | 152 def ProcessPexe(args, pexe, exe): |
153 [pexe_base, ext] = os.path.splitext(pexe) | 153 [pexe_base, ext] = os.path.splitext(pexe) |
154 if ext != '.pexe': | 154 if ext != '.pexe': |
155 pexe_base = pexe | 155 pexe_base = pexe |
156 pexe_base_unescaped = pexe_base | 156 pexe_base_unescaped = pexe_base |
157 pexe_base = pipes.quote(pexe_base) | 157 pexe_base = pipes.quote(pexe_base) |
158 pexe = pipes.quote(pexe) | 158 pexe = pipes.quote(pexe) |
159 | 159 |
160 nacl_root = FindBaseNaCl() | 160 nacl_root = FindBaseNaCl() |
161 path_addition = ( | 161 path_addition = ( |
162 '{root}/toolchain/linux_x86/pnacl_newlib_raw/bin' | 162 '{root}/toolchain/linux_x86/pnacl_newlib_raw/bin' |
163 ).format(root=nacl_root) | 163 ).format(root=nacl_root) |
164 os.environ['PATH'] = ( | |
165 '{dir}{sep}{path}' | |
166 ).format(dir=path_addition, sep=os.pathsep, path=os.environ['PATH']) | |
167 obj_llc = pexe_base + '.llc.o' | 164 obj_llc = pexe_base + '.llc.o' |
168 obj_sz = pexe_base + '.sz.o' | 165 obj_sz = pexe_base + '.sz.o' |
169 asm_sz = pexe_base + '.sz.s' | 166 asm_sz = pexe_base + '.sz.s' |
170 obj_llc_weak = pexe_base + '.weak.llc.o' | 167 obj_llc_weak = pexe_base + '.weak.llc.o' |
171 obj_sz_weak = pexe_base + '.weak.sz.o' | 168 obj_sz_weak = pexe_base + '.weak.sz.o' |
172 obj_partial = obj_sz # overridden for hybrid mode | 169 obj_partial = obj_sz # overridden for hybrid mode |
173 sym_llc = pexe_base + '.sym.llc.txt' | 170 sym_llc = pexe_base + '.sym.llc.txt' |
174 sym_sz = pexe_base + '.sym.sz.txt' | 171 sym_sz = pexe_base + '.sym.sz.txt' |
175 sym_sz_unescaped = pexe_base_unescaped + '.sym.sz.txt' | 172 sym_sz_unescaped = pexe_base_unescaped + '.sym.sz.txt' |
176 whitelist_sz = pexe_base + '.wl.sz.txt' | 173 whitelist_sz = pexe_base + '.wl.sz.txt' |
177 whitelist_sz_unescaped = pexe_base_unescaped + '.wl.sz.txt' | 174 whitelist_sz_unescaped = pexe_base_unescaped + '.wl.sz.txt' |
178 pnacl_sz = ( | 175 pnacl_sz = ( |
179 '{root}/toolchain_build/src/subzero/pnacl-sz' | 176 '{root}/toolchain_build/src/subzero/pnacl-sz' |
180 ).format(root=nacl_root) | 177 ).format(root=nacl_root) |
181 llcbin = '{base}/pnacl-llc'.format(base=path_addition) | 178 llcbin = '{base}/pnacl-llc'.format(base=path_addition) |
182 gold = 'le32-nacl-ld.gold' | 179 gold = '{base}/le32-nacl-ld.gold'.format(base=path_addition) |
183 objcopy = 'le32-nacl-objcopy' | 180 objcopy = '{base}/le32-nacl-objcopy'.format(base=path_addition) |
184 opt_level = args.optlevel | 181 opt_level = args.optlevel |
185 opt_level_map = { 'm1':'0', '-1':'0', '0':'0', '1':'1', '2':'2' } | 182 opt_level_map = { 'm1':'0', '-1':'0', '0':'0', '1':'1', '2':'2' } |
186 hybrid = args.include or args.exclude | 183 hybrid = args.include or args.exclude |
187 | 184 |
188 if hybrid and (args.force or | 185 if hybrid and (args.force or |
189 NewerThanOrNotThere(pexe, obj_llc) or | 186 NewerThanOrNotThere(pexe, obj_llc) or |
190 NewerThanOrNotThere(llcbin, obj_llc)): | 187 NewerThanOrNotThere(llcbin, obj_llc)): |
191 arch = { | 188 arch = { |
192 'arm32': 'armv7' if args.sandbox else 'arm-nonsfi', | 189 'arm32': 'armv7' if args.sandbox else 'arm-nonsfi', |
193 'x8632': 'x86-32' if args.sandbox else 'x86-32-linux', | 190 'x8632': 'x86-32' if args.sandbox else 'x86-32-linux', |
194 }[args.target] | 191 }[args.target] |
195 | 192 |
196 # Only run pnacl-translate in hybrid mode. | 193 # Only run pnacl-translate in hybrid mode. |
197 shellcmd(['pnacl-translate', | 194 shellcmd(['{base}/pnacl-translate'.format(base=path_addition), |
198 '-split-module=1', | 195 '-split-module=1', |
199 '-ffunction-sections', | 196 '-ffunction-sections', |
200 '-fdata-sections', | 197 '-fdata-sections', |
201 '-c', | 198 '-c', |
202 '-arch', arch, | 199 '-arch', arch, |
203 '-O' + opt_level_map[opt_level], | 200 '-O' + opt_level_map[opt_level], |
204 '--pnacl-driver-append-LLC_FLAGS_EXTRA=-externalize', | 201 '--pnacl-driver-append-LLC_FLAGS_EXTRA=-externalize', |
205 '-o', obj_llc] + | 202 '-o', obj_llc] + |
206 (['--pnacl-driver-verbose'] if args.verbose else []) + | 203 (['--pnacl-driver-verbose'] if args.verbose else []) + |
207 args.llc_args + | 204 args.llc_args + |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
360 '{{unsandboxed_irt,irt_random,irt_query_list}}.o ' + | 357 '{{unsandboxed_irt,irt_random,irt_query_list}}.o ' + |
361 '{root}/toolchain_build/src/subzero/build/runtime/' + | 358 '{root}/toolchain_build/src/subzero/build/runtime/' + |
362 'szrt_native_{target}.o -lpthread -lrt ' + | 359 'szrt_native_{target}.o -lpthread -lrt ' + |
363 '-Wl,--defsym=__Sz_AbsoluteZero=0' | 360 '-Wl,--defsym=__Sz_AbsoluteZero=0' |
364 ).format(ld=linker, ld_extra_args=extra_linker_args, | 361 ).format(ld=linker, ld_extra_args=extra_linker_args, |
365 partial=obj_partial, exe=exe, root=nacl_root, | 362 partial=obj_partial, exe=exe, root=nacl_root, |
366 target=args.target, lib_dir=lib_dir), | 363 target=args.target, lib_dir=lib_dir), |
367 echo=args.verbose) | 364 echo=args.verbose) |
368 | 365 |
369 # Put the extra verbose printing at the end. | 366 # Put the extra verbose printing at the end. |
370 if args.verbose: | 367 if args.verbose and hybrid: |
371 print 'PATH: {path}'.format(path=path_addition) | 368 print 'include={regex}'.format(regex=re_include_str) |
372 if hybrid: | 369 print 'exclude={regex}'.format(regex=re_exclude_str) |
373 print 'include={regex}'.format(regex=re_include_str) | 370 print 'default_match={dm}'.format(dm=default_match) |
374 print 'exclude={regex}'.format(regex=re_exclude_str) | 371 print 'Number of Subzero syms = {num}'.format(num=len(sz_syms)) |
375 print 'default_match={dm}'.format(dm=default_match) | |
376 print 'Number of Subzero syms = {num}'.format(num=len(sz_syms)) | |
377 | 372 |
378 if __name__ == '__main__': | 373 if __name__ == '__main__': |
379 main() | 374 main() |
OLD | NEW |