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 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
78 argparser.add_argument('-O', default='2', dest='optlevel', | 78 argparser.add_argument('-O', default='2', dest='optlevel', |
79 choices=['m1', '-1', '0', '1', '2'], | 79 choices=['m1', '-1', '0', '1', '2'], |
80 help='Optimization level ' + | 80 help='Optimization level ' + |
81 '(m1 and -1 are equivalent).' + | 81 '(m1 and -1 are equivalent).' + |
82 ' Default %(default)s.') | 82 ' Default %(default)s.') |
83 argparser.add_argument('--filetype', default='iasm', dest='filetype', | 83 argparser.add_argument('--filetype', default='iasm', dest='filetype', |
84 choices=['obj', 'asm', 'iasm'], | 84 choices=['obj', 'asm', 'iasm'], |
85 help='Output file type. Default %(default)s.') | 85 help='Output file type. Default %(default)s.') |
86 argparser.add_argument('--sandbox', dest='sandbox', action='store_true', | 86 argparser.add_argument('--sandbox', dest='sandbox', action='store_true', |
87 help='Enable sandboxing in the translator') | 87 help='Enable sandboxing in the translator') |
88 argparser.add_argument('--nonsfi', dest='nonsfi', action='store_true', | |
89 help='Enable Non-SFI in the translator') | |
88 argparser.add_argument('--enable-block-profile', | 90 argparser.add_argument('--enable-block-profile', |
89 dest='enable_block_profile', action='store_true', | 91 dest='enable_block_profile', action='store_true', |
90 help='Enable basic block profiling.') | 92 help='Enable basic block profiling.') |
91 argparser.add_argument('--target', default='x8632', dest='target', | 93 argparser.add_argument('--target', default='x8632', dest='target', |
92 choices=['arm32', 'x8632'], | 94 choices=['arm32', 'x8632'], |
93 help='Generate code for specified target.') | 95 help='Generate code for specified target.') |
94 argparser.add_argument('--verbose', '-v', dest='verbose', | 96 argparser.add_argument('--verbose', '-v', dest='verbose', |
95 action='store_true', | 97 action='store_true', |
96 help='Display some extra debugging output') | 98 help='Display some extra debugging output') |
97 argparser.add_argument('--sz', dest='sz_args', action='append', default=[], | 99 argparser.add_argument('--sz', dest='sz_args', action='append', default=[], |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
176 whitelist_sz_unescaped = pexe_base_unescaped + '.wl.sz.txt' | 178 whitelist_sz_unescaped = pexe_base_unescaped + '.wl.sz.txt' |
177 pnacl_sz = ( | 179 pnacl_sz = ( |
178 '{root}/toolchain_build/src/subzero/pnacl-sz' | 180 '{root}/toolchain_build/src/subzero/pnacl-sz' |
179 ).format(root=nacl_root) | 181 ).format(root=nacl_root) |
180 llcbin = '{base}/pnacl-llc'.format(base=path_addition) | 182 llcbin = '{base}/pnacl-llc'.format(base=path_addition) |
181 gold = '{base}/le32-nacl-ld.gold'.format(base=path_addition) | 183 gold = '{base}/le32-nacl-ld.gold'.format(base=path_addition) |
182 objcopy = '{base}/le32-nacl-objcopy'.format(base=path_addition) | 184 objcopy = '{base}/le32-nacl-objcopy'.format(base=path_addition) |
183 opt_level = args.optlevel | 185 opt_level = args.optlevel |
184 opt_level_map = { 'm1':'0', '-1':'0', '0':'0', '1':'1', '2':'2' } | 186 opt_level_map = { 'm1':'0', '-1':'0', '0':'0', '1':'1', '2':'2' } |
185 hybrid = args.include or args.exclude | 187 hybrid = args.include or args.exclude |
188 sb_or_nonsfi = args.sandbox or args.nonsfi | |
186 | 189 |
187 if hybrid and (args.force or | 190 if hybrid and (args.force or |
188 NewerThanOrNotThere(pexe, obj_llc) or | 191 NewerThanOrNotThere(pexe, obj_llc) or |
189 NewerThanOrNotThere(llcbin, obj_llc)): | 192 NewerThanOrNotThere(llcbin, obj_llc)): |
190 arch = { | 193 arch = { |
191 'arm32': 'armv7' if args.sandbox else 'arm-nonsfi', | 194 'arm32': 'armv7' if args.sandbox else 'arm-nonsfi', |
192 'x8632': 'x86-32' if args.sandbox else 'x86-32-linux', | 195 'x8632': 'x86-32' if args.sandbox else |
John
2015/12/22 15:44:38
this makes me sad. can something be done about thi
Jim Stichnoth
2015/12/28 07:54:07
What is your specific suggestion? (just to avoid
| |
196 'x86-32-nonsfi' if args.nonsfi else 'x86-32-linux', | |
193 }[args.target] | 197 }[args.target] |
194 | 198 |
195 # Only run pnacl-translate in hybrid mode. | 199 # Only run pnacl-translate in hybrid mode. |
196 shellcmd(['{base}/pnacl-translate'.format(base=path_addition), | 200 shellcmd(['{base}/pnacl-translate'.format(base=path_addition), |
197 '-split-module=1', | 201 '-split-module=1', |
198 '-ffunction-sections', | 202 '-ffunction-sections', |
199 '-fdata-sections', | 203 '-fdata-sections', |
200 '-c', | 204 '-c', |
201 '-arch', arch, | 205 '-arch', arch, |
202 '-O' + opt_level_map[opt_level], | 206 '-O' + opt_level_map[opt_level], |
203 '--pnacl-driver-append-LLC_FLAGS_EXTRA=-externalize', | 207 '--pnacl-driver-append-LLC_FLAGS_EXTRA=-externalize', |
204 '-o', obj_llc] + | 208 '-o', obj_llc] + |
205 (['--pnacl-driver-verbose'] if args.verbose else []) + | 209 (['--pnacl-driver-verbose'] if args.verbose else []) + |
206 args.llc_args + | 210 args.llc_args + |
207 [pexe], | 211 [pexe], |
208 echo=args.verbose) | 212 echo=args.verbose) |
209 if not args.sandbox: | 213 if not sb_or_nonsfi: |
210 shellcmd(( | 214 shellcmd(( |
211 '{objcopy} --redefine-sym _start=_user_start {obj}' | 215 '{objcopy} --redefine-sym _start=_user_start {obj}' |
212 ).format(objcopy=objcopy, obj=obj_llc), echo=args.verbose) | 216 ).format(objcopy=objcopy, obj=obj_llc), echo=args.verbose) |
213 # Generate llc syms file for consistency, even though it's not used. | 217 # Generate llc syms file for consistency, even though it's not used. |
214 shellcmd(( | 218 shellcmd(( |
215 'nm {obj} | sed -n "s/.* [a-zA-Z] //p" > {sym}' | 219 'nm {obj} | sed -n "s/.* [a-zA-Z] //p" > {sym}' |
216 ).format(obj=obj_llc, sym=sym_llc), echo=args.verbose) | 220 ).format(obj=obj_llc, sym=sym_llc), echo=args.verbose) |
217 | 221 |
218 if (args.force or | 222 if (args.force or |
219 NewerThanOrNotThere(pexe, obj_sz) or | 223 NewerThanOrNotThere(pexe, obj_sz) or |
220 NewerThanOrNotThere(pnacl_sz, obj_sz)): | 224 NewerThanOrNotThere(pnacl_sz, obj_sz)): |
221 if not args.nosz: | 225 if not args.nosz: |
222 # Run pnacl-sz regardless of hybrid mode. | 226 # Run pnacl-sz regardless of hybrid mode. |
223 shellcmd([pnacl_sz, | 227 shellcmd([pnacl_sz, |
224 '-O' + opt_level, | 228 '-O' + opt_level, |
225 '-bitcode-format=pnacl', | 229 '-bitcode-format=pnacl', |
226 '-filetype=' + args.filetype, | 230 '-filetype=' + args.filetype, |
227 '-o', obj_sz if args.filetype == 'obj' else asm_sz, | 231 '-o', obj_sz if args.filetype == 'obj' else asm_sz, |
228 '-target=' + args.target] + | 232 '-target=' + args.target] + |
229 (['-externalize', | 233 (['-externalize', |
230 '-ffunction-sections', | 234 '-ffunction-sections', |
231 '-fdata-sections'] if hybrid else []) + | 235 '-fdata-sections'] if hybrid else []) + |
232 (['-sandbox'] if args.sandbox else []) + | 236 (['-sandbox'] if args.sandbox else []) + |
237 (['-nonsfi'] if args.nonsfi else []) + | |
233 (['-enable-block-profile'] if | 238 (['-enable-block-profile'] if |
234 args.enable_block_profile and not args.sandbox | 239 args.enable_block_profile and not args.sandbox |
235 else []) + | 240 else []) + |
236 args.sz_args + | 241 args.sz_args + |
237 [pexe], | 242 [pexe], |
238 echo=args.verbose) | 243 echo=args.verbose) |
239 if args.filetype != 'obj': | 244 if args.filetype != 'obj': |
240 triple = { | 245 triple = { |
241 'arm32': 'arm-nacl' if args.sandbox else 'arm', | 246 'arm32': 'arm-nacl' if args.sandbox else 'arm', |
242 'x8632': 'i686-nacl' if args.sandbox else 'i686', | 247 'x8632': 'i686-nacl' if args.sandbox else 'i686', |
243 }[args.target] | 248 }[args.target] |
244 | 249 |
245 shellcmd(( | 250 shellcmd(( |
246 '{base}/llvm-mc -triple={triple} -filetype=obj -o {obj} {asm}' | 251 '{base}/llvm-mc -triple={triple} -filetype=obj -o {obj} {asm}' |
247 ).format(base=path_addition, asm=asm_sz, obj=obj_sz, | 252 ).format(base=path_addition, asm=asm_sz, obj=obj_sz, |
248 triple=triple), | 253 triple=triple), |
249 echo=args.verbose) | 254 echo=args.verbose) |
250 if not args.sandbox: | 255 if not sb_or_nonsfi: |
251 shellcmd(( | 256 shellcmd(( |
252 '{objcopy} --redefine-sym _start=_user_start {obj}' | 257 '{objcopy} --redefine-sym _start=_user_start {obj}' |
253 ).format(objcopy=objcopy, obj=obj_sz), echo=args.verbose) | 258 ).format(objcopy=objcopy, obj=obj_sz), echo=args.verbose) |
254 if hybrid: | 259 if hybrid: |
255 shellcmd(( | 260 shellcmd(( |
256 'nm {obj} | sed -n "s/.* [a-zA-Z] //p" > {sym}' | 261 'nm {obj} | sed -n "s/.* [a-zA-Z] //p" > {sym}' |
257 ).format(obj=obj_sz, sym=sym_sz), echo=args.verbose) | 262 ).format(obj=obj_sz, sym=sym_sz), echo=args.verbose) |
258 | 263 |
259 if hybrid: | 264 if hybrid: |
260 with open(sym_sz_unescaped) as f: | 265 with open(sym_sz_unescaped) as f: |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
306 sz=obj_sz_weak, llc=obj_llc_weak), | 311 sz=obj_sz_weak, llc=obj_llc_weak), |
307 echo=args.verbose) | 312 echo=args.verbose) |
308 shellcmd(( | 313 shellcmd(( |
309 '{objcopy} -w --localize-symbol="*" {partial}' | 314 '{objcopy} -w --localize-symbol="*" {partial}' |
310 ).format(objcopy=objcopy, partial=obj_partial), | 315 ).format(objcopy=objcopy, partial=obj_partial), |
311 echo=args.verbose) | 316 echo=args.verbose) |
312 shellcmd(( | 317 shellcmd(( |
313 '{objcopy} --globalize-symbol={start} ' + | 318 '{objcopy} --globalize-symbol={start} ' + |
314 '--globalize-symbol=__Sz_block_profile_info {partial}' | 319 '--globalize-symbol=__Sz_block_profile_info {partial}' |
315 ).format(objcopy=objcopy, partial=obj_partial, | 320 ).format(objcopy=objcopy, partial=obj_partial, |
316 start='_start' if args.sandbox else '_user_start'), | 321 start='_start' if sb_or_nonsfi else '_user_start'), |
317 echo=args.verbose) | 322 echo=args.verbose) |
318 | 323 |
319 # Run the linker regardless of hybrid mode. | 324 # Run the linker regardless of hybrid mode. |
320 if args.sandbox: | 325 if args.sandbox: |
321 assert args.target in ('x8632', 'arm32'), \ | 326 assert args.target in ('x8632', 'arm32'), \ |
322 '-sandbox is not available for %s' % args.target | 327 '-sandbox is not available for %s' % args.target |
323 target_lib_dir = { | 328 target_lib_dir = { |
324 'arm32': 'arm', | 329 'arm32': 'arm', |
325 'x8632': 'x86-32', | 330 'x8632': 'x86-32', |
326 }[args.target] | 331 }[args.target] |
327 linklib = ('{root}/toolchain/linux_x86/pnacl_newlib_raw/translator/' + | 332 linklib = ('{root}/toolchain/linux_x86/pnacl_newlib_raw/translator/' + |
328 '{target_dir}/lib').format(root=nacl_root, | 333 '{target_dir}/lib').format(root=nacl_root, |
329 target_dir=target_lib_dir) | 334 target_dir=target_lib_dir) |
330 shellcmd(( | 335 shellcmd(( |
331 '{gold} -nostdlib --no-fix-cortex-a8 --eh-frame-hdr -z text ' + | 336 '{gold} -nostdlib --no-fix-cortex-a8 --eh-frame-hdr -z text ' + |
332 '--build-id --entry=__pnacl_start -static ' + | 337 '--build-id --entry=__pnacl_start -static ' + |
333 '{linklib}/crtbegin.o {partial} ' + | 338 '{linklib}/crtbegin.o {partial} ' + |
334 '{root}/toolchain_build/src/subzero/build/runtime/' + | 339 '{root}/toolchain_build/src/subzero/build/runtime/' + |
335 'szrt_sb_{target}.o ' + | 340 'szrt_sb_{target}.o ' + |
336 '{linklib}/libpnacl_irt_shim_dummy.a --start-group ' + | 341 '{linklib}/libpnacl_irt_shim_dummy.a --start-group ' + |
337 '{linklib}/libgcc.a {linklib}/libcrt_platform.a ' + | 342 '{linklib}/libgcc.a {linklib}/libcrt_platform.a ' + |
338 '--end-group {linklib}/crtend.o --undefined=_start ' + | 343 '--end-group {linklib}/crtend.o --undefined=_start ' + |
339 '--defsym=__Sz_AbsoluteZero=0 ' + | 344 '--defsym=__Sz_AbsoluteZero=0 ' + |
340 '-o {exe}' | 345 '-o {exe}' |
341 ).format(gold=gold, linklib=linklib, partial=obj_partial, exe=exe, | 346 ).format(gold=gold, linklib=linklib, partial=obj_partial, exe=exe, |
342 root=nacl_root, target=args.target), | 347 root=nacl_root, target=args.target), |
343 echo=args.verbose) | 348 echo=args.verbose) |
349 elif args.nonsfi: | |
350 # TODO(stichnot): args.nonsfi and args.sandbox branches are nearly | |
351 # identical; refactor. | |
352 target_lib_dir = { | |
353 'arm32': 'arm-nonsfi', | |
354 'x8632': 'x86-32-nonsfi', | |
355 }[args.target] | |
356 linklib = ('{root}/toolchain/linux_x86/pnacl_newlib_raw/translator/' + | |
357 '{target_dir}/lib').format(root=nacl_root, | |
358 target_dir=target_lib_dir) | |
359 shellcmd(( | |
360 '{gold} -nostdlib --no-fix-cortex-a8 --eh-frame-hdr -z text ' + | |
361 '-z noexecstack ' + | |
362 '--build-id --entry=__pnacl_start -pie ' + | |
363 '{linklib}/crtbegin.o {partial} ' + | |
364 '{root}/toolchain_build/src/subzero/build/runtime/' + | |
365 'szrt_nonsfi_{target}.o ' + | |
366 '{linklib}/libpnacl_irt_shim_dummy.a --start-group ' + | |
367 '{linklib}/libgcc.a {linklib}/libcrt_platform.a ' + | |
368 '--end-group {linklib}/crtend.o --undefined=_start ' + | |
369 '--defsym=__Sz_AbsoluteZero=0 ' + | |
370 '--defsym=_begin=0 ' + | |
371 '-o {exe}' | |
372 ).format(gold=gold, linklib=linklib, partial=obj_partial, exe=exe, | |
373 root=nacl_root, target=args.target), | |
374 echo=args.verbose) | |
344 else: | 375 else: |
345 linker = { | 376 linker = { |
346 'arm32': '/usr/bin/arm-linux-gnueabihf-g++', | 377 'arm32': '/usr/bin/arm-linux-gnueabihf-g++', |
347 'x8632': ('{root}/../third_party/llvm-build/Release+Asserts/bin/clang' | 378 'x8632': ('{root}/../third_party/llvm-build/Release+Asserts/bin/clang' |
348 ).format(root=nacl_root) | 379 ).format(root=nacl_root) |
349 }[args.target] | 380 }[args.target] |
350 | 381 |
351 extra_linker_args = ' '.join({ | 382 extra_linker_args = ' '.join({ |
352 'arm32': ['-mcpu=cortex-a9'], | 383 'arm32': ['-mcpu=cortex-a9'], |
353 'x8632': ['-m32'] | 384 'x8632': ['-m32'] |
(...skipping 21 matching lines...) Expand all Loading... | |
375 | 406 |
376 # Put the extra verbose printing at the end. | 407 # Put the extra verbose printing at the end. |
377 if args.verbose and hybrid: | 408 if args.verbose and hybrid: |
378 print 'include={regex}'.format(regex=re_include_str) | 409 print 'include={regex}'.format(regex=re_include_str) |
379 print 'exclude={regex}'.format(regex=re_exclude_str) | 410 print 'exclude={regex}'.format(regex=re_exclude_str) |
380 print 'default_match={dm}'.format(dm=default_match) | 411 print 'default_match={dm}'.format(dm=default_match) |
381 print 'Number of Subzero syms = {num}'.format(num=len(sz_syms)) | 412 print 'Number of Subzero syms = {num}'.format(num=len(sz_syms)) |
382 | 413 |
383 if __name__ == '__main__': | 414 if __name__ == '__main__': |
384 main() | 415 main() |
OLD | NEW |